Linux Magazine Community Edition #85

Embed Size (px)

DESCRIPTION

Confira nesta edição os principais assuntos da Linux Magazine de dezembro (Tropa de Elite) e leia um artigo completo programação IPv6 para web, uma análise completa sobre o funcionamento do Arduíno e como cunstruir um timer simples, um excelente tutorial sobre conversão de PDFs através de emails e um artigo sobre sandbox com Arkose, perfeito para configuração de programas potencialmente instáveis, mantendo seus sistema protegido contra acidentes e perda de dados. Você não pode perder e nem pedir pra sair!

Citation preview

Expediente editorialDiretor Geral Rafael Peregrino da Silva [email protected]

Transio tecnolgicaRecentemente, em reunio com um corretor de seguros, tivemos novamente aquela epifania de constatao de planto: estamos assistindo a um repeteco tecnolgico de algo vivido h 30 anos durante o advento do computador pessoal. O corretor usava um notebook, equipado com (alguma verso do) Windows, mas seu celular era equipado com Android (Linux, open source). Essa combinao est se repetindo em pelo menos 68% do tempo atualmente, segundo dados das principais consultorias de mercado e conforme divulgado durante a MOTODEV App Summit em maio deste ano. O mais interessante, entretanto, que, enquanto o celular (ainda) no suficiente para substituir o PC, seu primo maior, o tablet, est ganhando cada vez mais adeptos. Embora com acesso limitado em grande maioria s classes A e B, seus usurios relatam estar cada vez menos propensos a ligar seus notebooks ou desktops. A mesma plataforma que equipa os celulares predominantemente nos dias de hoje est fadada a equipar os tablets. O Android est se estabelecendo como plataforma padro para esse tipo de desenvolvimento. A escolha realizada pelo Google que no quer nada menos do que aumentar a Internet, com o objetivo de ganhar escala para o seu modelo de negcios baseado em propaganda sensvel a contexto de fornecer a tecnologia de base para os equipamentos que devero estar nas mos de mais de 70% da populao do planeta, foi um primor estratgico! Alm dos dados de busca, esses aparelhos serviro com certeza como coletores de dados dos hbitos de seus usurios, o que dever aumentar a assertividade da propaganda veiculada pelo gigante das buscas. Do lado dos fabricantes de aparelhos (Samsung, Motorola, HTC, Sony-Ericsson, Huawei, para citar apenas alguns, pois h mais de 90 no momento), a plataforma caiu nas graas de quase todos. O fato de ser real e totalmente aberta conferiu aos fabricantes um poder nunca antes disponvel, qual seja, o de operar em todos os nveis de desenvolvimento de seus sistemas gratuitamente. Para os fabricantes de software, h uma plataforma mais ou menos padronizada para desenvolvimento de programas, que est se consolidando e estabilizando com a chegada do Android 4.0. Veremos praticamente toda uma nova gama de aplicativos aparecendo para a plataforma, da mesma forma que ocorreu com o PC h trs dcadas. A demanda por profissionais de desenvolvimento para dispositivos mveis est cada vez mais aquecida e os especialistas j disponveis no mercado esto sendo disputados a tapa. A pilha de servios em torno do Android est se consolidando e no tardaro a aparecer inclusive entidades que certifiquem a proficincia dos desenvolvedores na plataforma. Para o usurio comum apenas mais uma ferramenta, mas que democratiza o acesso tecnologia pelo ganho de escala e pela quantidade de programadores que arregimenta. Como a base de tudo isso o Software Livre, todas as vantagens oriundas das tecnologias abertas vm de roldo: competio, inovao mais rpida, solues mais flexveis, controle de plataforma e independncia de fornecedor, maior estabilidade e segurana, sem esquecer da formao local de mo-de-obra. Parafraseando Linus Torvalds em sua palestra na LinuxCon Brasil 2011: isso tudo vai estar at na pia da sua cozinha pois j chegou sua geladeira... Rafael Peregrino da Silva Diretor de Redao

EDITORIAL

Editores Flvia Jobstraibizer [email protected] Kemel Zaidan [email protected] Editora de Arte Larissa Lima Zanini [email protected] Estagirio Felipe Brumatti Sentelhas [email protected] Colaboradores Adriano Matos Meier, Alexandre Borges, Alexandre Santos, Augusto Campos, Charly Khnast, Dario Bestetti, Erik Brwaldt, Gavin W. Burris, Hans-Peter Merkel, Jon maddog Hall, Klaus Knopper, Kurt Seifried, Michael Uelschen, Tim Schrmann, Zack Brown. Traduo Emersom Satomi, Pablo Hess, Elias Graciano, Rodrigo Garcia. Reviso Cristiana Ferraz Coimbra Editores internacionais Uli Bantle, Andreas Bohle, Jens-Christoph Brendel, Hans-Georg Eer, Markus Feilner, Oliver Frommel, Marcel Hilzinger, Mathias Huber, Anika Kehrer, Kristian Kiling, Jan Kleinert, Daniel Kottmair, Thomas Leichtenstern, Jrg Luther, Nils Magnus. Anncios: Rafael Peregrino da Silva (Brasil) [email protected] Tel.: +55 (0)11 3675-2600 Penny Wilby (Reino Unido e Irlanda) [email protected] Amy Phalen (Amrica do Norte) [email protected] Hubert Wiest (Outros pases) [email protected] Diretor de operaes Claudio Bazzoli [email protected] Na Internet: www.linuxmagazine.com.br Brasil www.linux-magazin.de Alemanha www.linux-magazine.com Portal Mundial www.linuxmagazine.com.au Austrlia www.linux-magazine.es Espanha www.linux-magazine.pl Polnia www.linux-magazine.co.uk Reino Unido www.linuxpromagazine.com Amrica do Norte Apesar de todos os cuidados possveis terem sido tomados durante a produo desta revista, a editora no responsvel por eventuais imprecises nela contidas ou por consequncias que advenham de seu uso. A utilizao de qualquer material da revista ocorre por conta e risco do leitor. Nenhum material pode ser reproduzido em qualquer meio, em parte ou no todo, sem permisso expressa da editora. Assume-se que qualquer correspondncia recebida, tal como cartas, emails, faxes, fotograas, artigos e desenhos, sejam fornecidos para publicao ou licenciamento a terceiros de forma mundial no-exclusiva pela Linux New Media do Brasil, a menos que explicitamente indicado. Linux uma marca registrada de Linus Torvalds. Linux Magazine publicada mensalmente por: Linux New Media do Brasil Editora Ltda. Rua So Bento, 500 Conj. 802 S 01010-001 So Paulo SP Brasil Tel.: +55 (0)11 3675-2600 Direitos Autorais e Marcas Registradas 2004 - 2011: Linux New Media do Brasil Editora Ltda. Impresso e Acabamento: RR Donnelley Distribuda em todo o pas pela Dinap S.A., Distribuidora Nacional de Publicaes, So Paulo. Atendimento Assinante www.linuxnewmedia.com.br/atendimento So Paulo: +55 (0)11 3675-2600 Rio de Janeiro: +55 (0)21 3512 0888 Belo Horizonte: +55 (0)31 3516 1280 ISSN 1806-9428 Impresso no Brasil

4

www.linuxmagazine.com.br

NDICE

CAPAEncarar os desaos ou pedir para sair? No so s os usurios que cometem erros primrios. Administradores de redes e programadores costumam facilitar frequentemente a vida dos criminosos digitais, seja por descuido ou desconhecimento. 33

Caa aos invasores No mundo digital, segurana nunca demais, principalmente se a sua empresa atua diretamente em servios web. Atravs da anlise de um caso real, saiba como se proteger de um ataque a um servio de webhost, que partiu de um cliente da prpria empresa.

34

Corrente de conana Placas-me bem equipadas s vezes trazem chips de computao convel, embora os usurios e sistemas operacionais raramente os utilizem. O kernel Linux j domina essa tecnologia e seus usurios j podem dar suporte a uma ampla corrente de conana com o TrustedGRUB.

40

Fora do Radar Em funo de seu design inteligente, o Tor oferece mxima segurana aos usurios que desejam resguardar sua identidade.

46

6

www.linuxmagazine.com.br

Linux Magazine 85 | NDICE

COLUNASKlaus Knopper Charly Khnast Zack Brown Augusto Campos Alexandre Borges Kurt Seifried 10 12 13 14 16 18

PROGRAMAOProgramao IPv6 para web 64

NOTCIASGeral O cdigo-fonte do Android 4.0 Envenenamento de DNS nos provedores brasileiros 22 Linguagens de programao tais como C, Python, Perl e o kit de ferramentas Qt podem trabalhar com IPv6. Mas voc precisa se assegurar de que est usando as funes, classes e mtodos corretos. Vamos mostrar como levar o seu aplicativo legado para o mundo do IPv6.

CORPORATENotcias IBM sob nova direo Riverbed entra para a comunidade OpenStack Entrevista com Martin Roesch Coluna: Jon maddog Hall Coluna: Rafael Peregrino Coluna: Alexandre Santos 24 28 30 32 23

ANLISECarteiro bom de briga 51

TUTORIALConverso de PDF 72 Os desenvolvedores do Postx queriam uma forma de descartar e-mails indesejados quando fossem entregues, ento adicionaram o Postscreen verso 2.8 de seu servidor. Este mdulo ltra e ordena e-mails sem olhar seu contedo. Contato fsico O projeto Arduino ideal para experincias com computao fsica.Demonstramos seu funcionamento com a construo de um timer simples. 56

SEGURANASegurana alm da senha Envie alguns arquivos por email e receba documentos PDF como resposta, usando para isso LibreOfce, Postx e scripts Shell. Caixa de areia 75 60

H muito mais no universo da segurana, do que apenas senhas. Descubra como proteger seus servidores com autenticao de dois fatores.

SERVIOSEditorial O Arkose permite connar programas potencialmente instveis em uma sandbox virtual, mantendo seu sistema protegido contra acidentes e perda de dados. Emails Linux.local Preview 04 08 78 82

Linux Magazine #85 | Dezembro de 2011

7

Coluna do Augusto

20 anos do editor de textos vimApesar de rstico a primeira vista, o editor de textos vim h 20 anos o melhor amigo do administrador de sistemas.

COLUNA

Q

uando comecei a usar Unix, na primeira metade da dcada de 1990, tive a oportunidade de fazer alguns cursos introdutrios ao sistema em si e sua administrao em implementaes variadas, incluindo o AIX, o HP-UX e, pouco depois, tambm no Linux. Eram cursos presenciais de uma semana e tinham algo em comum: todos eles destinavam algumas horas ao editor vi geralmente descrito pelo instrutor como o editor de textos do Unix com uma justificativa ameaadora. Segundo eles, se o aluno algum dia fizesse alguma bobagem grande demais que impedisse o uso da ferramenta de configurao fcil oferecida pelo fabricante (o SMIT, no caso do AIX, ou o SAM no caso do HP-UX), teria que editar os arquivos de configurao na mo, e isso exigiria saber usar o vi. Os anos se passaram e eu logo aprendi que editar arquivos de configurao na mo no era algo to indesejvel assim, e que at havia alternativas ao vi para faz-lo. Seu uso tambm no era to assustador quanto aqueles instrutores acostumados s ferramentas dos fabricantes pareciam sinceramente acreditar. Mas, at chegar a esse ponto, passei muitas vezes pela aula do vi nos cursos que fiz e, mais tarde, at lecionei ela algumas vezes, sempre assistindo aos alunos j acostumados aos editores mais

Os 20 anos do vim foram comemorados por muitos fs que encontram nele a opo que lhes permite realizar com melhor desempenho suas tarefas de desenvolvimento, administrao ou mesmo edio de textos.14

recentes tropearem um pouco antes de vencer o desafio de entender a diferena de contexto entre o modo de insero e o de comando, e vendo o aluno distrado que no conseguia sair do editor. Isso em uma poca em que as aulas eram no console e ainda no havia a discreta opo de fechar a janela do terminal e abrir outra... O heroico vi criao de Bill Joy, um dos desenvolvedores originais do BSD, que desenvolveu esse editor a partir de 1976 quando a ideia de um editor visual interativo ainda era to recente que a alternncia de modos e a interface baseada em meras sequncias de teclas ainda poderiam ser consideradas bem mais fceis que outras alternativas existentes. Hoje vivemos uma era de ambientes grficos em que at mesmo o administrador de sistemas pode passar meses ou anos sem precisar editar algo no vi mas ele continua sendo ensinado, no apenas por ser um editor poderoso e cheio de recursos, mas por fazer parte do padro POSIX, o que significa que estar disponvel em qualquer implementao ou clone do Unix. Possivelmente estar mo at mesmo naquelas temidas situaes em que a mquina tem problemas que impedem seu boot completo e, assim, precisa ser consertada em modo texto, monousurio ou sob outra condio restrita. Mesmo assim, os 20 anos do vim (a implementao mais moderna e avanada do vi que est na distribuio de Linux que voc usa e em muitos Unix) foram comemorados por muitos fs que o utilizam no por obrigao ou por falta de opes mais fceis, mas porque encontram nele a opo que lhes permite realizar com melhor desempenho suas tarefas de desenvolvimento, administrao ou mesmo edio de textos. Parabns pelo aniversrio, vim, e que venham mais 20 anos! Augusto Csar Campos administrador de TI e, desde 1996, mantm o site BR-linux.org, que cobre a cena do Software Livre no Brasil e no mundo.

www.linuxmagazine.com.br

Coluna do Alexandre Borges

Certicao e assinaturas digitaisEm um esforo hercleo, Alexandre Borges se desdobra para ensinar a qualquer um os mistrios da criptograa de chaves simtricas, assimtricas e dos certicados digitais.

COLUNA

scuto frequentemente algumas perguntas vindas de analistas: Como garantir que nossas compras na Internet sejam seguras? O que significa aquele cadeado na barra de status do navegador? Por que, quando entramos em algum site de home banking, solicitam-nos que aceitemos o tal do certificado digital? Afinal, para que serve tudo isso? Para mim claro e cristalino que voc leitor sabe as exatas respostas para essas perguntas; contudo, de que maneira podemos explicar essas coisas para outros analistas e pessoas leigas exemplificadas por profissionais de outras reas como vendedores, advogados ou mdicos? A informao somente tem valor e melhora a sociedade quando difundida e desfazer alguns mitos seria interessante para ajudar na conscientizao da importncia dessas informaes e da tecnologia no dia-a-dia. Ento quer dizer que fcil explicar os conceitos de criptografia simtrica, assimtrica, hashing, certificado digital e assinatura digital? Longe disso. Alis, nada mais difcil, mesmo para tcnicos que j fazem parte deste mundo de TI. Eis como eu fao quando quero explicar as questes acima. Imaginem duas pessoas, com suas respectivas mquinas (A e B). A pessoa A quer enviar uma informao para a pessoa B, porm deseja que ningum possa, no meio do caminho, visualizar a informao. Para tanto ela usa um algoritmo de chave simtrica. Mas o que isso? Simples: um algoritmo (ou programa, para leigos) que embaralha as informaes e, para faz-lo, usa uma espcie de senha (chave de sesso ou key session) para codificar os dados e a mesma senha para decodific-los (desembaralhar os dados). da que vem a palavra simtrica: a mesma chave usada nas duas pontas da comunicao, ou seja: para codificar e decodificar. E ento, o que as pessoas fazem? A pessoa da mquina A combina com a pessoa da mquina B um algoritmo e uma senha (key session), e depois codifica os dados a serem enviados como elas combinaram. A pessoa da mquina B, ao receber estes dados, decodifica-

E

-os usando o algoritmo e a senha j combinados entre as partes. Alis, por que o nome chave de sesso (key session)? Porque esta senha (chave) somente vale para cada sesso de envio de informaes, ou seja, no prximo envio o usurio pode combinar uma nova senha. Funciona? Muito bem. rpido? Bastante. S tem um pequeno problema: como as pessoas vo trocar esta senha (chave de sesso) entre si? Qualquer meio est sujeito a interceptao: email, SMS, telefone, fax, pessoalmente, correios... Nada, absolutamente nada, seguro para trocar estas senhas (ou chaves). a que est o risco: se algum tiver posse desta senha (chave) e tiver uma vaga ideia do algoritmo usado, poder decodificar as informaes trocadas e ler o que foi enviado. E agora, o que fazer? Neste ponto, entram em jogo os algoritmos assimtricos. Por que assimtricos? Porque a mesma chave que usada para codificar NO a mesma usada para decodificar. Eis como ocorre o processo: a pessoa da mquina A, atravs de um algoritmo assimtrico escolhido em comum acordo entre as partes, gera um par de chaves (ou senhas, para leigos), a pblica e a privada (pub-A e priv-A). Como o nome diz, a chave pblica pode (e deve) ser conhecida por qualquer pessoa; todavia, a privada somente de conhecimento prprio e individual. Em seguida, a pessoa da mquina B faz o mesmo, ou seja: gera seu par de chaves assimtricas (pub-B e priv-B). E o que se segue que, como a pessoa da mquina A sabe a chave pblica da pessoa da mquina B (pub-B), ela usa esta chave (pub-B) para codificar, usando o algoritmo simtrico combinado, a chave de sesso que elas queriam trocar e no podiam de maneira segura. A a tal chave de sesso (codificada) enviada para a pessoa da mquina B. Agora ambos, com a mesma chave pblica, podem trocar dados criptografados como explicado acima. A que est a mgica: uma vez que uma informao codificada dessa forma (usando a chave pub-B), somente com a respectiva chave privada (priv-B) possvel decodific-la. Esse mecanismo uma das maravilhas das chaves assimtricas: o que codificado com uma chave do par gerado (pblico e pri-

16

www.linuxmagazine.com.br

vado) somente pode ser decodificado com a outra chave do mesmo par. Funciona? Sim. rpido? Hum... a vem um pequeno detalhe: ao contrrio dos algoritmos simtricos, os assimtricos so muito (e coloque muito nisso) mais lentos. Se fossem rpidos, poderamos abandonar os simtricos e j enviar a informao (e no apenas a chave de sesso) com o uso do par de chaves simtricas (pblica e privada). Tudo resolvido? No. Por qu? Porque a pergunta agora outra: como a pessoa da mquina A pode ter certeza absoluta de que a chave pblica da pessoa da mquina B dela mesma? E se for de um hacker fingindo ser a pessoa da mquina B? A a pessoa da mquina A teria um grande problema: ela estaria codificando a chave de sesso com a chave pblica do hacker e enviando para a pessoa da mquina B (que no conseguiria abrir a informao). O hacker, interceptando os dados codificados, conseguiria decodificar a informao (que a chave de sesso) e poderia se passar pela pessoa da mquina B, comprometendo toda a troca de informaes entre as partes. exatamente agora que entra em cena o certificado digital. Alis, o que esse certificado e como funciona? A parte interessada (por exemplo, as pessoas das mquinas A e B, ou mesmo uma empresa, em um contexto mais realista), contrata uma terceira parte (autoridade certificadora, tambm conhecida como CA) e, no momento do contrato, envia sua prpria chave pblica. Ento essa companhia certificadora (CA) emite o certificado dessa pessoa ou empresa. Esse certificado um objeto (ou um selo, para leigos) emitido pela autoridade certificadora (CA), que possui total idoneidade internacional (Certsign, por exemplo). O certificado contm dentro de si a chave pblica enviada pela parte interessada e algumas informaes sobre a pessoa ou empresa que est comprando o servio de certificao digital. E aqui est a ideia principal: quando a pessoa da mquina A pede a chave pblica da pessoa da mquina B (pub-B), a pessoa da mquina B no envia a sua chave pblica diretamente, e sim seu certificado digital emitido por uma companhia certificadora. Assim, quem est garantindo e atestando que aquele certificado (mais especificamente, a chave pblica) vem da pessoa da mquina B a autoridade certificadora que tem reconhecimento global para tal ao. Ou seja: ningum (nem a pessoa da mquina A e nem a da mquina B) corre o risco de se ver enganado por um hacker. Funciona? Muito bem. Resolvido o problema? Ainda no. Por qu? Porque quem pode garantir para a pessoa da mquina A que aquele certificado da pessoa da mquina B, emitido e atestado pela autoridade certificadora (CA) foi, de fato, emitido por ela? E se foi um hacker que est se passando pela CA e forjou um certificado? Puxa! Isso parece no ter mais fim... Sempre h um risco, mas tem soluo. Antes de avanarmos para o prximo ponto, til comentar o que so e para que servem os algoritmos de hash.

Fundamentalmente, a ideia assegurar a integridade dos dados, ou seja, ter certeza de que os dados enviados pela mquina A so os mesmos recebidos pela mquina B. E como isso acontece? Com esses dados feita uma conta (da o uso do algoritmo) e esse clculo anexado junto aos dados a serem enviados. Quando esses dados chegam mquina B, o mesmo clculo feito usando-se os dados recebidos, e o resultado comparado com o clculo que foi feito pela mquina A e anexado aos dados enviados. Se os resultados forem iguais, os dados que chegaram esto ntegros e no sofreram nenhuma alterao. Se houver discrepncia, pede-se para retransmitir os dados novamente. Simples, no? Agora sim possvel falar do ltimo elo desta corrente, que a assinatura digital. E qual o seu objetivo? Garantir que, de fato, o certificado digital foi realmente emitido pela companhia certificadora (CA). Para tanto, ocorre o seguinte processo: a CA (companhia certificadora), antes de emitir o certificado para a pessoa da mquina A ou B, faz um clculo de hash desse certificado e criptografa esse clculo usando sua prpria chave privada (sim... a chave privada e no a pblica, por isso chama-se assinatura digital), anexando o resultado no certificado. O usurio da mquina A ou B, atravs do browser (que j tem diversas chaves pblicas cadastradas dentro dele) usa a chave pblica da companhia certificadora (CA) para descriptografar o hash codificado do certificado que , em seguida, comparado com o clculo feito pela prpria mquina de A ou B. Se as os hashes feitos na mquina forem iguais ao hash que veio anexado ao certificado, pode-se garantir que aquele certificado foi, de fato, emitido pela companhia certificadora (CA) em questo, pois a chave pblica da companhia certificadora (CA) somente decodifica os dados criptografados com a sua respectiva chave privada. Repare que a assinatura digital contrria codificao assimtrica: na assinatura digital, o dado codificado com a chave privada e decodificado com a pblica. Na criptografia assimtrica acontece o inverso, pois o dado codificado com a chave pblica e decodificado com a respectiva chave privada. Esse processo descrito acima prova de bala? Sim. As falhas so decorrentes de possveis quebras dos algoritmos envolvidos, ou ainda erro na implementao deste mecanismo. exatamente por isso que os hackers (ou melhor, crackers) costumam tentar atacar a ponta mais fraca do processo, que o usurio, e conseguir as senhas (chaves) antes de tudo comear, pois durante o processo isso muito difcil para no dizer impossvel. At o ms que vem. Alexandre Borges ([email protected]) instrutor independente e ministra regularmente treinamentos de tecnologia Oracle, Symantec e EC-Council (CEH e CHFI), alm de estar sempre envolvido com assuntos relacionados ao kernel Linux.

Linux Magazine #85 | Dezembro de 2011

17

Tropa de elite

Encarar os desaos ou pedir para sair?No so s os usurios que cometem erros primrios. Administradores de redes e programadores costumam frequentemente facilitar a vida dos criminosos digitais, seja por descuido ou desconhecimento. por Kemel Zaidan

CAPA

D

ados bancrios, endereo, nmeros de telefone, compras, relatrios, documentos pessoais, conversas telefnicas, agenda de contatos, calendrio, editais, impostos, dados governamentais, crculos sociais etc. Poderamos estender a lista indefinidamente se quisssemos, mas parece no haver limites para a capacidade da rede de concentrar nossos dados. A tendncia parece mesmo ser de que a Internet venha a ser o grande hub de nossas vidas sociais, tanto fora quanto dentro do universo digital. Porm, a preocupao com a segurana desses dados no acompanhar a importncia da rede em nossas vidas na mesma proporo de seu crescimento. A linha tnue entre o pblico e o privado est cada vez mais difcil de se distinguir uma vez que hoje muito mais difcil manter informaes pessoais de forma privada, do que era no passado. Por outro lado, boa parte das pessoas que comeam a entrar na rede agora, ignoram as possibilidades e a importncia de manterem dados pessoais afastados do conhecimento de grandes corporaes, pois muitas vezes no se sabe quais e para que fins grandes servios web, como o Google ou o Facebook, coletam informaes de seus usurios. por essas e outras questes que a Linux Magazine #85 traz para voc o tema segurana. Nela, voc poder conferir o interessante caso real relatado por Ygor Bittencourt, de um provedor de hospedagem, que teve seus servidores invadidos e utilizados para atacar um terceiro computador. Voc poder reproduzir no apenas o cenrio do ataque, mas tambm conferir como ele foi descoberto, para s ento tomar as medidas preventivas cabveis para que uma situao como essa no acontea na sua rede. Outro interessante artigo o Fora do Radar, onde o nosso leitor poder instalar e configurar o Tor, uma incrvel ferramenta para a navegao segura e annima, cujo cdigo fonte foi originalmente aberto pelo Intituto de Pesquisas da Marinha dos Estados Unidos.

A rede Tor teve um papel importante nos conflitos recentes ocorridos na Primavera rabe. J no artigo Corrente de confiana, o administrador de sistemas ir aprender como tirar proveito dos chips TPM que comeam a equipar as placas mes mais modernas ao permitir criar toda uma cadeia de assinatura de software, o que pode fazer toda a diferena em um ambiente de servidores. Portanto, arme-se com a sua Linux Magazine mais recente e prepare-se para a dura batalha do dia-a-dia porque misso dada, parceiro, misso cumprida!

Matrias de capaCaa aos invasores Corrente de conana Fora do Radar 34 40 46

ANLISE | Introduo ao Arduino

Introduo ao Arduino

ANLISE

Contato fsicoO projeto Arduino ideal para experincias com computao fsica. Demonstramos seu funcionamento com a construo de um timer simples. por Dmitri Popov

E

m seu website [1], o projeto Arduino se apresenta como uma plataforma para prottipos eletrnicos de cdigo aberto, baseada em hardware e software flexveis e fceis de usar, o que no soa muito animador. Mas essa minscula e econmica plataforma lhe permite construir uma gama de projetos fantsticos e no h exigncia de habilidades com solda. O projeto consiste basicamente de uma placa que pode ser programada

para controlar diferentes dispositivos (motores, luzes etc.) conforme a entrada que ela recebe de sensores conectados. possvel conectar praticamente qualquer sensor placa do Arduino por exemplo, um resistor dependente de luz, um sensor de movimento, um termistor ou um sensor de presso e programar o microcontrolador da placa para executar vrias aes com os controladores conectados aos pinos digitais de sada.

A programao feita no IDE Arduino, que usa uma linguagem de programao baseada em Processing [2]. A linguagem em si relativamente fcil de aprender, ento mesmo que voc no tenha nenhuma experincia com programao, pode aprender o bsico rapidamente. A seo de referncia no site do projeto contm uma viso detalhada da linguagem para quem quer iniciar, estando disponvel tambm a verso

Figura 1 O IDE Arduino no muito bonito, mas cumpre bem Figura 2 O Gnoduino uma alternativa mais polida aosua funo. IDE padro do Arduino.

56

www.linuxmagazine.com.br

Introduo ao Arduino | ANLISE

sudo add-apt-repository ppa:pmjdebruijn/gnoduino-release sudo apt-get update sudo apt-get install gnoduino

Em seguida conecte a placa Arduino sua mquina e voc estar pronto para comear seu primeiro projeto. possvel criar todo tipo de dispositivos com o Arduino mas, para comear, melhor algo simples. Ento descreverei como construir um timer bsico para treinarmos a tcnica Pomodoro [6] de gerenciamento de tempo. Nesse projeto s precisamos de trs componentes: um LED, um resistor (entre 200 e 680 ohms) e dois cabos de jumper. O resistor opcional, sendo usado para limitar a corrente e evitar danos ao LED.Figura 3 O Fritzing oferece um ambiente grco para criar projetos do Arduino.

EsquematizaoAntes de comear a montar os componentes na matriz de contato e cabe-los, uma boa ideia desenhar um esquema para ser usado como referncia. Embora voc possa usar caneta e papel para faz-lo, h uma ferramenta melhor chamada Fritzing [7]. Esse programa oferece um ambiente grfico completo para projetos Arduino: voc pode us-lo para desenhar layouts na matriz de contato, esquematizao ou circuitos impressos. Usar o Fritzing em um projeto to simples pode parecer exagero, mas assim que seus projetos Arduino forem ficando mais avanados, voc vai comear a apreciar as capacidades e recursos desse programa. O Fritzing no exige uma instalao tradicional. Para obter a ltima verso, acesse o site do projeto, descompacte o arquivo baixado e execute o script em Bash Fritzing.sh no diretrio correspondente para iniciar o aplicativo. A viso Breadboard no Fritzing permite criar designs na protoboard com o posicionamento de componentes e seu cabeamento (gura 3). A coleo principal de componentes

livre do Arduino Programming Notebook [3] como guia rpido e prtico. Os programas Arduino so chamados de sketches. Voc escreve, depura e faz o upload desses sketches na placa usando o IDE. O Arduino foi desenvolvido como uma forma de introduzir s pessoas o mundo da computao fsica (construir sistemas fsicos interativos que podem perceber o mundo analgico e reagir a ele) mas o projeto mais do que apenas uma ferramenta educacional. possvel usar a placa para todos os tipos de soluo inteligente, desde um alarme ativado por movimentos at um disparador acionado por luz para sua cmera. Voc pode comprar diferentes modelos Arduino gastando a partir de 30 dlares, sendo desnecessrio gastar todas suas economias para poder se iniciar no maravilhoso mundo da computao fsica. Voc pode precisar acrescentar sua lista de compras tambm, uma protoboard (placa com furos e conexes condutoras para montagem de circuitos eltricos experimentais), alguns cabos de jumper, alguns LEDs e resistores.

Usando a protoboard, pode-se construir projetos Arduino sem precisar soldar componentes uma soluo perfeita para a experimentao.

PreparaoA primeira tarefa instalar o ambiente de desenvolvimento para poder escrever sketches e fazer o upload no Arduino. Se estiver usando o Ubuntu ou derivados, instalar o programa necessrio simples:sudo apt-get install arduino

Esse comando instala o IDE Arduino padro, escrito em Java (gura 1). O IDE cumpre sua funo, mas no se integra muito bem com o Gnome. Felizmente, o Gnoduino fornece uma alternativa polida e leve, projetada especificamente para esse ambiente de desktop (gura 2). O Gnoduino exibe as janelas nativas do Gnome e tem melhor renderizao de fontes, alm do recurso til de numerar linhas. O programa foi escrito em Python e, no Ubuntu, pode ser instalado a partir de um PPA dedicado [5], com os seguintes comandos:

Linux Magazine #85 | Dezembro de 2011

57

ANLISE | Introduo ao Arduino

Figura 4 O Fritzing tambm gera esquemas de cabeamento baseados no projeto da protoboard.

Figura 5 Com o Fritz voc pode projetar esquemas decircuitos impressos.

na paleta Parts inclui praticamente todas as partes essenciais: de resistores a switches, de LEDs a diversos tipos de sensor. O Fritzing tambm permite a importao de colees de componentes de terceiros. Para faz-la, selecione File/Parts Bin/Open e escolha a coleo que deseja. Voc pode at desenhar suas prprias partes. A pgina Creating Custom Parts [8] do website tem bastante material sobre isso. Assim que posicionar um componente na protoboard, voc pode

modificar suas propriedades na paleta Inspector. possvel, por exemplo, especificar tolerncia, resistncia e espaamento de pinos para resistores, alm de cor e tamanho, para LEDs. Para conectar os componentes com cabos de jumper, clique com o boto direito no socket desejado da matriz, depois arraste o mouse at o socket de destino, enquanto segura o boto direito. Depois possvel mudar a cor do cabo adicionado na paleta Inspector para melhorar a leitura do desenho. Por padro, o Fritzing usa

Listagem 1: Sketch para um timer01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 int var = 0; void setup() { pinMode(13, OUTPUT); } void loop() { while(var < 5){ digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); var++; } digitalWrite(13, HIGH); delay(15000); var = 0; digitalWrite(13, LOW); delay(1500000); }

Listagem 2: Sketch aperfeioado para um timer01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 int var = 0; void setup() { pinMode(9, OUTPUT); pinMode(13, OUTPUT); } void loop() { while(var < 5){ digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); var++; } digitalWrite(9, HIGH); delay(15000); var = 0; digitalWrite(9, LOW); delay(1500000); }

cabos retos, que podem ser muito limitadores em estruturas mais complexas. Mas possvel curvar os cabos pressionando a tecla [Ctrl], clicando e arrastando. Enquanto voc trabalha no design da matriz, o Fritzing silenciosamente gera um esquema de cabeamento para seu projeto, que pode ser visto ao mudarmos para a viso Schematic (gura 4). Todas as conexes entre componentes so consideradas ligaes potenciais, sendo exibidas como linhas finas; voc precisa usar o mouse para cabear os componentes de fato. Fazer isso manualmente pode ser um desafio, especialmente se estiver trabalhando com um desenho complexo. Felizmente, o Fritzing tem uma soluo elegante: o recurso Autoroute pode cabear automaticamente os componentes. Os resultados podem s vezes ser decepcionantes, mas na maioria das vezes esse recurso faz um bom trabalho. Alm disso, voc pode melhorar esse resultado manualmente, se necessrio. O Fritzing tambm permite que voc exporte o esquema de cabeamento para diversos formatos. possvel salvar o esquema como uma imagem com File/Export/As Image, que oferece as opes PNG, SVG e PDF, entre outros. Tambm poss-

58

www.linuxmagazine.com.br

Introduo ao Arduino | ANLISE

vel usar File/Export/List of parts (Bill of Materials) para gerar uma lista de compras bem formatada, com todos os componentes usados nos projetos. Se isso no for suficiente, ainda possvel usar o Fritz para desenhar um circuito impresso, portanto voc pode transformar seu prottipo de matriz de contato em um produto de fato ou em um Arduino shield (gura 5). Melhor ainda, o servio Fritzing Fab [9] pode produzir circuitos impressos, prontos para uso, baseados em seu design. Por enquanto, contudo, usaremos o Fritzing para criar um projeto de protoboard para o timer, como o da gura 3. Depois voc pode usar o desenho como guia para cabear os componentes na matriz real e conect-los ao Arduino para completar o projeto de hardware.

SketchO prximo passo escrever um sketch para o timer. Basicamente, voc precisa programar o Arduino para ligar o LED a cada 25 minutos, sinalizando que hora de um intervalo. Para deixar as coisas um pouco mais interessantes, voc pode fazer o LED piscar cinco vezes, para atrair a ateno, antes de ligar. Para comear, inicie o Arduino IDE ou o Gnoduino e use o sketch da listagem 1. O que esse sketch faz? Como qualquer programa ou script, sua

primeira tarefa definir as variveis a serem usadas. Nesse caso, a declarao int var = 0 define a varivel var, que atuar como um contador, com um valor de 0 (zero). Alm disso, qualquer sketch Arduino deve conter dois blocos. A funo setup() contm todo o cdigo a ser executado uma vez no incio do programa, enquanto a funo loop() contm o programa em si, que executado em repetio. Por que isso?, voc pode se perguntar. Porque, diferentemente de um computador comum, o Arduino no pode executar vrios programas ao mesmo tempo e os programas no podem terminar. Basicamente, quando voc liga a placa Arduino ela executa o cdigo, parando apenas quando voc desliga. Neste caso, a funo setup() inicializa o pino digital 13 como uma sada, usando a declarao pinMode(13, OUTPUT). Isso permite que o sketch controle o LED conectado ao pino 13. A funo loop() contm o programa em si, que pode ser dividido, a grosso modo, em duas partes. A primeira o lao while que liga o LED (a declarao digitalWrite(13, HIGH)), espera um segundo (delay (1000)), desliga o LED (digitalWrite(13, LOW)), espera outro segundo e ento incrementa o contador em 1 (var++). O loop executa enquanto o valor de

var menor que 5 (ou seja, o LED pisca cinco vezes). Quando var che-

ga a 5, a segunda parte do programa entra em ao, ligando o LED, esperando 15 segundos, desligando o LED e esperando 25 minutos. Para verificar erros no sketch, use o boto Verify no IDE Arduino. Se tudo correr bem, voc deve ver a mensagem Binary sketch size: 1086 bytes (of a 32256 byte maximum) (o tamanho pode variar); do contrrio, surgiro alertas indicando os erros. Finalmente, pressione Upload para enviar o sketch para o Arduino. A placa comear a executar o cdigo imediatamente. Parabns, seu primeiro hardware Arduino funciona!

Etapas posterioresEmbora esse timer Arduino seja bem simples, voc pode aperfeio-lo. Por exemplo, pode adicionar um segundo LED no pino 9 e reescrever o sketch para que o primeiro LED pisque antes de o segundo ser ligado (listagem 2). Em vez de usar um segundo LED, voc pode conectar um alto-falante e programar o Arduino para disparar um tom ou melodia simples. Resumindo, h muitas opes para refinar e melhorar esse simples timer. E depois que dominar o bsico, voc pode trabalhar em projetos mais complexos e empolgantes.

Mais informaes[1] Arduino: http://arduino.cc/ [2] Linguagem de programao Processing: http://processing.org/ [3] Arduino Programming Notebook: http://www.lulu.com/product/ file-download/arduino-programming-notebook/3524028 [4] Gnoduino: http://gnome.eu.org/evo/index.php/Gnoduino [5] PPA Gnoduino: http://launchpad. net/~pmjdebruijn/+archive/gnoduino-release [6] Tcnica Pomodoro: http://www.pomodorotechnique.com/ [7] Fritzing: http://fritzing.org/ [8] Partes customizadas no Fritzing: http://fritzing.org/ learning/tutorials/creating-custom-parts [9] Fritzing Fab: http://fab.fritzing.org/fritzing-fab

O autorDmitri Popov formado em letras (idioma russo) e lingstica computacional; h vrios anos trabalha como tradutor tcnico e colaborador free-lancer. J publicou mais de 500 artigos sobre software de produtividade, computao mvel, aplicativos web e outros tpicos relacionados informtica. Seus artigos j apareceram em sites e revistas da Dinamarca, Inglaterra, EUA, Alemanha, Rssia e, agora, do Brasil.

Gostou do artigo? rtigo?Queremos ouvir sua opinio. pinio. Fale conosco em m [email protected] zine.com r Este artigo no nosso site: osso e: http://lnm.com.br/article/6109 br/art /610

Linux Magazine #85 | Dezembro de 2011

59

PROGRAMAO | Aplicativos web e IPv6

Aplicativos web e IPv6

PROGRAMAO

Programao IPv6 para webLinguagens de programao tais como C, Python, Perl e o kit de ferramentas Qt podem trabalhar com IPv6. Mas voc precisa se assegurar de que est usando as funes, classes e mtodos corretos. Vamos mostrar como levar o seu aplicativo legado para o mundo do IPv6. por Peter Hrenka

A

migrao para a Internet IPv6 s vai funcionar se as aplicaes que esto rodando na web tambm migrarem. Este artigo explica como os desenvolvedores podem readequar programas tanto para IPv4 quanto para IPv6. Voc vai ver como trabalhar com IPv6 em C, Python, C++, Perl e com o kit de ferramentas Qt. A maioria dos programas usados como exemplo no necessitam de uma conexo nativa em IPv6 Internet, o que significa que voc pode testar seu cdigo localmente, em qualquer distribuio Linux recente.

C 101Os programadores ainda precisaro emitir uma chamada de sistema via socket() no IPv6 para definir um destino no formato de descritor de arquivos. Se esse destino tiver de ser compatvel com o IPv6, o domnio deve ser PF_INET6 ou AF_INET6. Os tipos aqui podem ser os mesmos usados no IPv4, SOCK_STREAM para UDP e SOCK_DRAM para TCP. As coi-

sas comeam a ficar empolgantes de verdade quando o socket realmente quer iniciar uma conexo. No lado do cliente connect() e no lado do servidor bind(). Ambos com a expectativa de obter um const struct sockaddr*. Mas onde encontr-lo? Entre outras coisas, o RFC 3493 [1] descreve a funo getaddrinfo(), que retorna estas estruturas sockaddr. O getaddrinfo() substitui o gethostbyname(), que obsoleto e incapaz de realizar multithreading (ou, para ser mais preciso: incapaz de reentrncia). De modo geral, a funo getaddrinfo() ajuda a migrar gradualmente, sem dor, do IPv4 para o IPv6. A funo trabalha com resoluo de nomes, parsing (anlise sinttica), criao de estruturas de endereos e parmetros para chamadas subsequentes de rede. A listagem 1 introduz a funo getaddrinfo() e seus parmetros. A node aponta para uma string que descreve o endereo com maior detalhamento. A string normalmente um hostname na forma de www.

linuxmagazine.com.br. Tambm so

permitidas notaes de endereos IPv4 ou IPv6, tais como 127.0.0.1 ou FF80::0201:02FF:FE03:0405%eth0. O parmetro service descreve o nmero da porta.0 Os designadores de servio, como aqueles listados em / etc/services, tambm so permitidos por exemplo, http ou ssh bem como nmeros de portas em notao decimal. O parmetro opcional hint pode apontar para uma addrinfo structure tal como a que definida na listagem 2. res tambm usa essa estrutura, que d suporte a vrios resultados ligados por ai_next para chamar freeaddrinfo() quando os endereos no so mais necessrios. Os desenvolvedores especificam o AF_INET como sendo o ai_family para receber endereos IPv4 e o AF_INET6 para receber endereos IPv6. Caso precise dos dois tipos de endereo, voc deve especificar o AF_UNSPEC, que vai lhe dar primeiro o(s) endereo(s) IPv6 e depois o(s) IPv4. A estrutura res nunca possui AF_UNSPEC. Em vez

64

www.linuxmagazine.com.br

Aplicativos web e IPv6 | PROGRAMAO

disso, mantm a famlia de endereos tangveis do endereo de retorno. Para o ai_socktype, voc deve inserir o SOCK_STREAM para UDP, ou o SOCK_DGRAM para TCP, na estrutura hint. Ao inserir um 0, voc ver vrias entradas com os possveis tipos para cada endereo, se houver. O ai_protocol permite ao programador requisitar um protocolo, tal como FP_INET ou FP_INET6. Geralmente normal usar o valor 0 para receber resultados que batam com os outros parmetros. Um aspecto prtico que os campos ai_family, ai_socktype e ai_protocol correspondem precisamente aos parmetros domain, type e protocol na chamada de sistema socket(), o que significa que voc pode simplesmente deix-los para l. O campo ai_addrlen armazena o valor retornado do comprimen-

to da estrutura do sockaddr_in. O ai_addr contm um ponteiro para um sockaddr_in para IPv4, ou um sockaddr_in6 para IPv6 dentro da estrutura res. Este apontador pode ser usado junto ao ai_addrlen como parmetro para as chamadas de sistema connect(), bind(), sendto() ou recvfrom(). O campo ai_canonname da estrutura res contm um apontador para o nome cannico do host, caso voc o requisite pelos ai_flags. D uma olhada no quadro 1 para ter uma ideia sobre as flags.

As funes alternativas inet_pton() e inet_ntop() existem por causa de inet_aton() e inet_ntoa(), que convertem notaes numricas ASCII e struct in_addr para l e para c (listagem 4).

PythonA verso 2.2 do Python adicionou uma funo getaddrinfo() ao mdulo padro do socket [2]. Felizmente, as caractersticas perversas do C (o que inclui parmetros obsoletos dentro das estruturas hints ou res) no se aplicam ao Python. Alguns parmetros opcionais desta linguagem manipulam a funo da estrutura hints da interface C:socket.getaddrinfo(host, port,family=0,socktype=0, U proto=0, flags=0)

Efeitos colateraisSe voc quiser escrever programas compatveis com IPv6, deve evitar certas funes. Por exemplo, evite aquelas que esperam ou retornam uma struct in_addr como parmetro (listagem 3).

Listagem 1: getaddrinfo()01 02 03 04 05 int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); void freeaddrinfo(struct addrinfo *res);

Listagem 5: getaddrinfo.py01 #!/usr/bin/env python 02 import sys 03 from socket import * 04 05 host = sys.argv[1] 06 port = 80 if len(sys.argv)disconnectFromHost(); } }; #endif

Qual a aparncia do lado do servidor? Em uma aplicao servidora capacitada a IPv6, necessrio es-

Linux Magazine #85 | Dezembro de 2011

67

PROGRAMAO | Aplicativos web e IPv6

Quadro 1: Detalhes dos AI_FLAGSAI_ADDRCONFIG: Se o programador fornecer apenas as especicaes deste sinal (flag), os endereos s sero retornados se alguma interface de rede tiver congurado pelo menos um endereo no-loopback de tipo correspondente. Isso signica que um dispositivo sem conexo IPv6 s receber endereos IPv4 e vice-versa. Infelizmente, os desenvolvedores das atuais bibliotecas Glibc [10] e Eglibc [11] tomaram a deciso questionvel de aceitar endereos para links locais IPv6 como congurveis. Isso quer dizer que o getaddrinfo() apresenta endereos IPv6 inalcanveis para os computadores que no tenham endereos IPv6 globais. Em tais ambientes as conexes normalmente falham logo, mas grandes timeouts ocorrem em alguns casos, e justamente para evit-lo que esta opo foi projetada. Fora isso, aconselhvel usar essa opo no lado do cliente para evitar tentativas de conexo e consultas DNS propensas a erros. AI_PASSIVE: Retorna sockets apropriados s chamadas de sistema bind() e accept(). AI_V4MAPPED: Retorna endereos IPv4 identicados por sockets AF_ INET6, para os quais nenhum endereo IPv6 pde ser vericado como endereo IPv6 do tipo mapeado em IPv4. AI_ALL: Retorna todos os endereos IPv6 e IPv4 mapeados (apenas se for combinado com o AI_V4MAPPED). AI_CANONNAME: Resolve um hostname cannico e o retorna dentro de uma lista res como primeiro item. AI_NUMERICHOST: Evita consultas ao DNS. O node precisa ser especicado em notao numrica.

pecificar None como host, AF_UNSPEC como a famlia e AI_PASSIVE para os flags receberem os parmetros e os endereos para sockets servidores que escutam as conexes em todas as interfaces de rede. Isso significa pelo menos dois sockets. A primeira questo quando um socket IPv4 ou IPv6 daro bind para a mesma porta, ao mesmo tempo. E a resposta : depende da opo de socket IPV6_V6ONLY, j descrita no RFC3493. No Python, voc pode ajustar esse detalhe ao usar o mtodo socket sockopt().socket.setsockopt (IPPROTO_IPV6, IPV6_V6ONLY, 1)

Infelizmente, a configurao padro para essa opo depende do sistema operacional e at mesmo da distribuio. Alguns sistemas BSD a ativam por padro e, no Linux, o administrador pode ativ-la durante a execuo do sistema:sysctl net.ipv6.bindv6only=1

aconselhvel que os programadores ajustem essa opo explicitamente e, neste caso, devem estar sempre prontos para ligar uma porta IPv6 mesmo que esta j esteja vinculada ao IPv4. Caso o IPV6_V6ONLY esteja desabilitado, as novas mensagens IPv4 so redirecionadas a um socket IPv6 por um socket V4-mapped. As especificaes IPv6 incluem uma tcnica para mapeamento de endereos IPv4 para endereos IPv6 [3]. Apesar de os endereos IPv4 mapeados serem prticos, tambm possuem desvantagens. Uma delas no ter representao textual, o que leva a strings modificadas, mais especificamente em sadas de log. Isso pode causar problemas para ferramentas de anlise que usam, digamos, expresses regulares para buscar endereos IPv4 e no conseguem identificar novas strings. Por outro lado, uma srie de problemas de segurana potenciais esto relacionados aos endereos mapeados em IPv4 [4]: o aplicativo no

consegue distinguir se uma conexo IPv4 existe ou se est lidando com uma conexo IPv6 com um endereo manipulado. O segundo problema com os dois server sockets que a chamada accept() normalmente fica bloqueada enquanto espera por uma conexo. Para contornar esse problema, os desenvolvedores poderiam, teoricamente, ativar dois processadores no servidor ou trabalhar com vrias threads. Contudo, isso no necessrio porque o select oferece uma soluo bem mais elegante para o problema ao permitir que o programa espere por diversos sockets ao mesmo tempo. Essa abordagem pode parecer um pouco intrincada, mas os aplicativos mais complexos no conseguiro resolver o problema sem usar o select ou alternativas como poll ou epoll. Em Python, voc vai encontrar a funo select() no mdulo padro Select [5].readable, writable, special = select.select(rlist, wlist, xlist[, timeout])

Os parmetros rlist, wlist e xlist so listas de arquivos ou objetos socket que reagem a leitura, escrita e eventos incomuns. Os trs valores de retorno dados ao programa so listas de objetos que chegaram a um estado de espera. O valor para novas conexes readable. Em Python, o accept() suprido como mtodo de objeto socket que retorna um 2-tuple,(conn, address) = socket.accept()

em que conn o novo socket na conexo estabelecida e address o endereo da outra parte da notao tuple do Python. O prximo exemplo de cdigo (listagem 6) usa uma dessas tcnicas IPv6 do Python na prtica. O cdigo encarregado de escutar ouve a porta, aceita as conexes que esto

68

www.linuxmagazine.com.br

Aplicativos web e IPv6 | PROGRAMAO

chegando e transfere seu endereo IP. A gura 2 mostra uma sesso Telnet em que o servidor usa IPv6 e Ipv4.

Kit de ferramentas QtO framework QT orientado a objetos C++ fornece diversas abstraes para programao voltada para redes dentro da biblioteca QtNetwork [6]. Em circunstncias normais, os programas cliente que usam os mtodos corretos sero conectados automaticamente via IPv6. O Qt oferece as classes QTcpSocket e QudpSocket para programao de re-

des. Ambas so derivadas da classe bsica QAbstract-Socket. Para estabelecer uma conexo TCP em um programa cliente, o desenvolvedor precisa primeiro criar uma QTcpSocket e, ento, chamar o mtodo QAbstractSocket, definido na classe base connectToHost() (listagem 7). Como exemplo, considere um programa mnimo de Qt (listagem 8) que tenta abrir uma conexo para um servidor web usando o nome passado pelo usurio como primeiro parmetro na linha de comando (gura 3).

Quadro 2: IPv6 na programao PerlSe voc deseja escrever programas voltados para o IPv6 em Perl, sua nica opo o mdulo CPAN Socket6, que oferece funes como getaddrinfo(). O Perl 5.14 (maio de 2011) foi a primeira verso a implementar a funcionalidade no mdulo do Socket [12] no ncleo da linguagem. A listagem 11 mostra uma exemplo de aplicativo nesse sentido. A programao de Socket mais conveniente com o IO::Socket [13]. O IO::Socket::INET, necessrio para o IPv4, j faz parte do ncleo do Perl h muitos anos. O IO::Socket::INET6 do CPAN fornece um duplo mdulo para o IPv6. use IO::Socket::INET6; my $sock6 = IO::Socket::INET6->new( '[::1]:12345' ); my $sock4 = IO::Socket::INET6->new( '127.0.0.1:12345' ); O mdulo Socket6 compatvel retroativamente com o IO:Socket::INET e tambm pode criar conexes IPv4. O Socket6 aceita endereos como nomes de host na notao IPv4 ou IPv6 porque o IO::Socket::INET suporta programao mais simplicada e sockets no estilo Libc. Muitos programas e mdulos Perl o usam, com o sacrifcio de suas capacidades IPv6 (por exemplo, mdulos do ncleo, tais como o Net::SMTP, Net::FTP e mdulos importantes do CPAN, tais como LWP). Em muitos casos, possvel readequar programas ao IPv6 com a ajuda do Net::INET6Glue::INET_is_INET6 [14], que substitui o IO::Socket::INET por IO::Socket::INET6: use Net::INET6Glue::INET_is_INET6; use LWP::Simple; print get('http://ipv6.google.com/'); A seguinte linha de comando habilita ao IPv6 um programa j existente: $ perl -Mnet::INET6Glue::INET_is_INET6 ipv4_programm.pl Net::INET6Glue::FTP ainda estende o Net::FTP, adicionando os comandos essenciais EPRT e EPSV para IPv6. O IO::Socket::SSL fornece suporte simples ao SSL e, automaticamente, ao IPv6, desde que o IO::Socket::INET6 esteja instalado. Alm disso, o Perl oferece diversas bibliotecas para manipulao no-bloquevel de sockets. Em muitos casos, essas solues j suportam o IPv6, mas no usam o bloquevel getaddrinfo() para consultas de endereos, preferindo os seus prprios. Os exemplos incluem AnyEvent e POE. Contudo, o gerenciador dever retornar os resultados em ordem diferente da que voc poderia esperar com o getaddrinfo().

O QHostAddress [7] usado para sada: essa a abstrao Qt para endereos IPv4 e Ipv6. Entre outras coisas, ela fornece o mtodo QHostAddress::toString(). A aplicao QCoreApplication d aos desenvolvedores a opo de criar programas Qt sem uma GUI (listagem 8, linha 10). Aps connectToHost() (linha 16), que imediatamente retorna as chamadas de cdigo de waitForConnected() para esperar por uma conexo (linha 18). Uma outra alternativa atribuir o sinal connected() a um slot apropriado. Uma vez estabelecida a conexo, o programa exibe o peerAddress. Em um ambiente com suporte a IPv6, possvel ver que o programa estabelece automaticamente a conexo IPv6.$ ./simpleClient www.google.com Connected to 2A00:1450:4001:C01:0:0:0:68%0

Isso prtico, mas no lhe d a possibilidade de interveno que o getaddrinfo() d aos programadores C. A funo que chega mais perto de faz-lo QHostInfo [8], que oferece mtodos para resoluo de nomes. Infelizmente, QHostInfo no oferece toda a convenincia que getaddrinfo d. Por exemplo, impossvel especificar quando voc quer endereos IPv4 ou IPv6 e o desenvolvedor no pode especificar flags, tais como AI_ADDRCONFIG. A implementao simples: o mtodo esttico, QHostInfo::fromName(const QString& name) retorna uma instncia QHostInfo , que usa QHostInfo::addresses() para retornar uma QList de instncias QHostaddress. Uma variante do nome lookupHost() trabalha em outra direo, usando threads separadas para lidar com requisies feitas, as quais so chamadas dentro do slot especificado do objeto. As aplicaes de servidor no so automaticamente compatveis com o

Linux Magazine #85 | Dezembro de 2011

69

PROGRAMAO | Aplicativos web e IPv6

IPv6 no Qt. O QTcpServer que usa abstrao para o socket servidor apenas escuta um endereo. Infelizmente,

o argumento padro um endereo IPv4 QHostAddress::Any dentro do mtodo listen().

Listagem 10: server.cpp01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 #include #include #include #include #include #include #include #include greeter.h

int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); int port = app.arguments().at(1).toInt(); Greeter* greeter = new Greeter(&app); QSignalMapper* sigMap; sigMap = new QSignalMapper(&app); greeter->connect(sigMap, SIGNAL(mapped(QObject *)), SLOT(newConnection(QObject *))); QList servers; QList ifs; ifs = QNetworkInterface::allInterfaces(); foreach(const QNetworkInterface& i, ifs) { QList entries; entries = i.addressEntries(); foreach(const QNetworkAddressEntry& entry, entries) { QHostAddress address = entry.ip(); // fix scope of link-local addresses Q_IPV6ADDR addr6;// = address.toIPv6Address(); addr6 = address.toIPv6Address(); if (addr6[0] == 0xfe && addr6[1] == 0x80) { QString name=i.humanReadableName(); address.setScopeId(name); } QTcpServer* server; server = new QTcpServer(&app); sigMap->setMapping(server, server); sigMap->connect(server, SIGNAL(newConnection()), SLOT(map())); server->listen(address, port); if (!server->isListening()) { std::cout