CURSO DE TECNOLOGA EM NFORMTCA TAGO SALEM HERRMANN RNAT: ROTEAMENTO ATRAVS DE NAT CURTBA PR 2006 TAGO SALEM HERRMANN RNAT: ROTEAMENTO ATRAVS DE NAT Trabalho de Diplomao apresentado Universidade Tecnolgica Federal do Paran como requisito para obteno do ttulo de Tecnlogo em nformtica. Orientadora: Profa. MSc. Ana Cristina Kochem Vendramin. CURTBA 2006 AGRADECIMENTOS Agradeo a todas as pessoas que de alguma forma estiveram envolvidas no desenvolvimento do presente trabalho, em especial aos amigos Tiago Almeida Barboza de Souza e Aristeu Sergio Rozanski Filho pelos conselhos e apoio. Agradeo tambm a professora Ana Cristina Kochem Vendramin pela orientao, apoio, conselhos e correes do trabalho. Por fim, agradeo ao Movimento Open Source, por permitir que trabalhos como este sejam possveis. iii Progresso a realizao de utopias. Oscar Wilde iv RESUMO A nternet, com o passar dos tempos, se modificou e se adequou aos novos padres tecnolgicos, principalmente para permitir que pequenas e mdias redes privadas pudessem se comunicar na nternet. A tcnica de Masquerading, hoje presente em vrias redes do mundo, permite que hosts com endereos P reservados para redes privadas acessem a nternet, porm no permite que dois hosts que passam pelo processo de mascaramento possam se comunicar diretamente. O presente trabalho prope um novo conceito de roteamento, chamado RNAT, que permite o acesso direto entre estes hosts. Palavras-chave: NAT, roteamento, Connection Tracking, Pv4, redes privadas. v ABSTRACT Since the beginning of the nternet, it has changed to aggregate the new standards, mainly to allow the nternet access to small and medium private networks. The Masquerading feature, common nowadays, has allowed the private networks to make nternet access, but it does not allow direct connection between two hosts located behind the mascaration process. This project intends to suggest a new routing concept, named RNAT, which allows the direct access between those hosts. Keyords! NAT, routing, Connection Tracking, Pv4, Private Networks. vi Sumrio 1 NTRODUO......................................................................................................... 1 1.1 Objetivos........................................................................................................... 1 1.2 Trabalhos Relacionados................................................................................... 2 1.2.1 Pv4+4....................................................................................................... 2 1.2.2 PNL........................................................................................................... 3 1.2.3 Extended P............................................................................................... 3 1.3 Organizao do Documento............................................................................. 3 2 Pv4.......................................................................................................................... 4 2.1 P vlidos x P invlidos.................................................................................... 6 3 NAT.......................................................................................................................... 7 4 NFORMAES TCNCAS................................................................................. 11 4.1 Capacidades do Kernel do Sistema Operacional........................................... 11 4.2 P Options....................................................................................................... 12 4.3 Netfilter........................................................................................................... 15 4.4 Source Route.................................................................................................. 16 4.5 DNS................................................................................................................ 17 5 MPLEMENTAO DO RNAT (Routable NAT)..................................................... 19 5.1 Opo RNAT.................................................................................................. 19 5.2 Protocolo RNAT.............................................................................................. 20 5.3 Mdulo rnat_router......................................................................................... 24 5.4 Resource Record RNAT................................................................................. 25 5.5 Biblioteca de funes RNAT........................................................................... 26 5.6 nformaes importantes sobre o RNAT......................................................... 27 6 FUNCONAMENTO DO RNAT.............................................................................. 29 6.1 RNAT em roteadores...................................................................................... 29 6.2 RNAT em hosts.............................................................................................. 30 6.2.1 Kernel...................................................................................................... 30 6.2.2 OpenSSH................................................................................................ 31 6.2.3 Putty........................................................................................................ 31 6.2.4 Ping......................................................................................................... 32 TRABALHOS FUTUROS........................................................................................... 34 APNDCE A............................................................................................................. 35 APNDCE B............................................................................................................. 37 APNDCE C............................................................................................................. 47 APNDCE D............................................................................................................. 49 APNDCE E............................................................................................................. 51 APNDCE F............................................................................................................. 57 REFERNCAS......................................................................................................... 63 Lista de Figuras Figura 1 Representao de um Pacote Pv4............................................................ 4 Figura 2 Processo de mascaramento ao enviar um pacote...................................... 8 Figura 3 Processo de mascaramento ao receber pacote......................................... 8 Figura 4 - Estrutura do campo P Options.................................................................. 13 Figura 5 Utilizao do campo P Options com o comando ping..............................14 Figura 6 Disposio das Hooks do Netfilter no kernel do Linux.............................. 16 Figura 7 Estrutura da opo RNAT no campo P Options...................................... 20 Figura 8 Redes privadas com acesso nternet..................................................... 21 Figura 9 Opo RNAT ao sair do host de origem................................................... 23 Figura 10 Opo RNAT ao ser enviada para a nternet.......................................... 23 Figura 11 Opo RNAT ao ser enviado para o host destino...................................24 Figura 12 Software putty com suporte a RNAT...................................................... 32 Figura A1 - Tempo de resposta para um host com P vlido..................................... 36 Figura A2 - Tempo de resposta para um host com P invlido de outra intranet....... 36 1 1 INTRODUO Assim como qualquer outra tecnologia, a nternet que conhecemos hoje resultado de uma evoluo. Conforme as topologias de redes foram se moldando e o nmero de hosts conectados grande rede foi aumentando, a nternet foi se modificando, principalmente para suprir a escassez de endereos P ("nternet Protocol) disponveis, elemento que essencial para comunicao entre hosts. Para amenizar esta escassez, novas tcnicas foram surgindo, porm, sempre apresentando problemas quanto a compatibilidade e funcionalidades j existentes, como o caso do Masquerading, uma tcnica que permite que hosts com P's invlidos acessem a nternet atravs da troca de endereos feita no roteador da rede (RFC 1631, 1994). No estado atual, ainda existem restries na conectividade direta entre dois hosts situados em redes privadas diferentes e que passam por um processo de mascaramento para acesso nternet, como por exemplo em aplicaes VoP (#oice o$er "nternet Protocol) e na transferncia de arquivos. Mesmo levando em considerao a existncia de tcnicas para fazer esta comunicao, nenhuma eliminou os problemas de o emissor poder escolher o host da outra rede privada que ele deseja acessar, o que em teoria faria com que os P's, at ento considerados invlidos, se tornassem P's vlidos, resolvendo em partes os problemas da escassez de P's na nternet. Outro problema gerado pelo mascaramento a falta de visibilidade, que no permite ao destinatrio saber qual o verdadeiro host que o est acessando. 1!1 O"#eti$os O objetivo deste trabalho apresentar um novo padro, assim como o software necessrio, para comunicao em redes Pv4, onde cada host ter uma identificao universal (composta pelo P vlido na nternet do seu gateay e pelo seu P invlido) e poder se comunicar com qualquer outro host na nternet que tambm tenha suporte a este padro, resolvendo desta forma o problema da falta de 2 visibilidade causado pelo mascaramento. O novo padro ser compatvel com os padres Pv4 existentes, ser de fcil implementao, e far uso de um novo registro DNS (%o&ain 'a&e Syste&) para se referenciar dois P's ao invs de um, que so relativos ao P externo e ao P da rede privada do host que se deseja acessar. Sero fornecidos o cdigo fonte para os roteadores com plataforma Linux implementarem as alteraes necessrias, uma biblioteca de funes para fcil migrao dos softwares clientes e modificaes para alguns so(tares de modo a demonstrar o funcionamento e o uso da biblioteca fornecida. Para o presente trabalho o sistema operacional base ser o GNU/Linux, devido sua flexibilidade e por ser software livre, porm o padro sugerido poder ser aplicado em qualquer sistema operacional. 1!% Tra"a&'os Re&a(io)ados 1!%!1 I*$+,+ O Pv4+4 sugere uma extenso do endereamento de redes Pv4 baseadas no conceito de domnios (real&s) pblicos e privados. Os pacotes Pv4+4 possuem um cabealho a mais entre a camada de rede e a de transporte, indicando, entre outros campos, os endereos do domnio privado. O endereo do domnio pblico continua sendo referenciado no cabealho Pv4. Roteadores na nternet que no conheam Pv4+4, considerariam o novo cabealho como parte do cabealho TCP (*rans&ission +ontrol Protocol). Como resultado, hosts origem, destino e roteadores que delimitam os dois domnios privados que esto se comunicando necessitam analisar os pacotes em nveis alm da camada de rede. Roteadores necessitam desta anlise para descobrir o endereo do host destino. Os hosts destino e origem necessitam desta anlise para remover este cabealho antes de envi-lo para a camada de transporte, evitando desta forma, por exemplo, a alterao da implementao TCP e UDP (TURNY, VALK, 2003). 3 1!%!% I*NL O PNL, ou ',*-./tended "nternet ,rchitecture, assim como o Pv4+4, tambm trabalha com o conceito de domnios, porm o protocolo prev a utilizao de vrios domnios privados, ao invs de um, aumentando o endereamento disponvel. Similarmente ao Pv4+4, um novo cabealho inserido entre a camada de rede e a de transporte, servindo para indicar, entre outras informaes, o P e o domnio privado de destino. Para o uso do PNL so necessrias modificaes nos hosts e nos roteadores que limitam os domnios privados que esto se comunicando (FRANCS, GUMMAD, 2001). 1!%!- E.te)ded I* O ./tended P, ou EP, uma especificao criada em 1992 que prope a extenso do endereamento P atravs de uma P Option especfica. Esta uma proposta muito semelhante a apresentada no presente trabalho, porm sugere que a opo transporte mais informaes alm dos P's de origem e destino das redes privadas. Sua implementao no foi encontrada (RFC 1385, 1992). 1!- Orga)i/a01o do Do(ume)to Este trabalho est dividido em cinco captulos, sendo este utilizado para mostrar os objetivos, trabalhos relacionados e as motivaes para o desenvolvimento do mesmo. O segundo captulo faz uma descrio do Pv4 e demonstra as diferenas entre P vlido e invlido. O terceiro captulo apresenta o NAT e sua importncia na nternet atualmente. O quarto captulo explica vrios conceitos necessrios para o desenvolvimento do RNAT, como 0ernel capa1ilities e o campo P Options do cabealho Pv4. O quinto captulo explica o desenvolvimento do RNAT propriamente dito, tanto o protocolo quanto os softwares necessrios para seu funcionamento. Por fim, sero apresentadas demonstraes prticas da utilizao do conceito RNAT no sexto captulo e as concluses obtidas. 4 % I*$+ O Pv4 (RFC 791, 1981), ou P ("nternet Protocol) verso 4, um protocolo utilizado para comunicao entre hosts tanto diretamente como inter- redes. Localizado na camada de rede do modelo OS (Open Syste&s "nterconnection), atualmente o protocolo mais utilizado para comunicao, principalmente por suportar roteamento de pacotes. Desenvolvido por Vint Cerf e Robert Kahn e adotado em 1 de janeiro de 1983 juntamente com o TCP, o Pv4 substituiu o antigo NCP ('etor0 +ontrol Protocol) (RFC 801, 1981), tornando-se at hoje o protocolo padro para a nternet. Dentre outras caractersticas, o Pv4 um protocolo sem conexo (connectionless) e com suporte a fragmentao de pacotes, permitindo desta forma o seu transporte por mdias com MTU (Ma/i&u& *rans&ission 2nit) pequenas. A Figura 1 mostra uma representao de um pacote Pv4 (RFC 791, 1981). Figura 1 Representao de um Pacote Pv4 Os seguinte campos fazem parte de um pacote Pv4 (RFC 791, 1981): Version (4 bits): Contm a verso do protocolo, neste caso 4; I2L ("P 3eader 4ength 4 bits): Nmero de palavras de 4 bytes que o cabealho contm. O nmero mnimo 5, o que indica um cabealho de 20 bytes e sem campo Option; TOS (*ype o( Ser$ice 8 bits): Utilizado para fazer QoS (5uality o( Ser$ice); Total length (16 bits): Tamanho total do pacote (cabealho e dados); Identification (16 bits): Utilizado para identificar os fragmentos de um 5 mesmo pacote; Flags (3 bits): Utilizado para controlar ou identificar fragmentos; Fragment offset (13 bits): nforma a localizao do fragmento no datagrama P original; TTL (*i&e to li$e - 8 bits): Utilizado para evitar rotas circulares. A cada roteador que o pacote passa, este nmero decrementado, e ao chegar em zero o pacote descartado; Protocol (8 bits): Nmero identificando o protocolo que o pacote carrega em sua rea de dados. (1 para CMP ("nternet +ontrol Message Protocol), 6 para TCP (*rans&ission +ontrol Protocol), 17 para UDP (2ser %atagra& Protocol) , etc); Header Checksum (16 bits): Soma de valores de todos os bytes do cabealho P em palavras de 16 bits. A soma deve ser feita com o prprio campo chec0su& zerado e o resultado final deve ser o complemento de um da soma efetuada. A finalidade deste campo checar inconsistncias no cabealho do pacote; Source Address (32 bits): Endereo de origem do pacote; Destination Address (32 bits): Endereo do destinatrio do pacote; Option+Padding (tamanho varivel): Campo utilizado para opes customizadas. Somente existe caso o campo HL seja maior do que 5. No caso da existncia do campo, obrigatoriamente dever acabar com a opo EOOL (.nd-O(-Option-4ist) e espaos no utilizados devero ser preenchidos com zeros. Exemplos de opes so: 6ecord 6oute! utilizado para armazenar os endereos de roteadores pelo qual o pacote passou para chegar ao destino e voltar origem; Strict Source and 6ecord 6oute! opo que informa os roteadores pelos quais o pacote deve ser enviado para chegar ao destino. Data (tamanho varivel): rea destinada aos dados propriamente ditos, vindos de protocolos das camadas superiores (TCP, UDP, etc). 6 %!1 I* $&idos . I* i)$&idos Utilizando o protocolo Pv4 possvel enderear matematicamente at 4.294.967.296 (quatro bilhes, duzentos e noventa e quatro milhes, novecentos e sessenta e sete mil, duzentos e noventa e seis) endereos. Este nmero obtido atravs do clculo 256 4 (pois cada endereo Pv4 formado por 4 octetos, ou 32 bits). Nem todos estes endereos so utilizados na nternet, pois existe uma srie deles reservados para utilizao em redes privadas, &ulticast, alm de vrios outros escolhidos somente para uma utilizao futura. Os P's reservados para uso em redes privadas ficaram popularmente conhecidos como P's invlidos, pelo fato de no ser possvel trafegar diretamente na nternet com estes endereos. A tcnica de Masquerading (ver Captulo 3) possibilita at hoje que estes P's invlidos possam acessar a nternet. Os endereos que realmente podem se comunicar na nternet ficaram popularmente conhecidos como P's vlidos. Estas terminologias no so tecnicamente corretas, pois P's invlidos so endereos que no podem ser representados com um nmero de 32 bits, o que no reflete a realidade dos endereos P reservados para uso em redes privadas. Apesar disto, estas terminologias sero utilizadas em alguns captulos no presente trabalho por serem amplamente utilizadas e facilitarem o entendimento do propsito do mesmo. Os endereos reservados para redes privadas so mostrados na Tabela 1. Endereo de Rede Endereo 7roadcast Prefixo 10.0.0.0 10.255.255.255 8 172.16.0.0 172.31.255.255 12 192.168.0.0 192.168.255.255 16 Tabela 1 Endereos reservados para uso em redes privadas. (RFC 1918, 1996) 7 - NAT No incio da nternet cada host possua um nmero P prprio, porm com o aumento do nmero de hosts e com a necessidade de conectar redes privadas que utilizavam P's invlidos, uma nova tcnica comeou a ser usada. O NAT ('etor0 ,ddress *ranslator) (RFC 1631, 1994) uma tcnica que se baseia na troca de endereos de origem ou destino de um pacote P. possvel dividir o NAT em basicamente 2 tipos: DNAT (%estination ',*) e SNAT (Source ',*). A principal diferena diz respeito a qual endereo ser trocado. No DNAT, o endereo do destinatrio alterado, j no SNAT quem alterado o endereo da origem. O NAT permitiu o desenvolvimento de um tipo de SNAT chamado Masquerading, que, alm de trocar o P de origem dos pacotes vindos de uma rede interna com destino nternet por um endereo vlido, tambm mantm referncia das conexes ativas utilizando peculiaridades dos protocolos das camadas superiores, como por exemplo a porta de origem em protocolos TCP e UDP. Esta referncia serve basicamente para identificar o destino do pacote na rede privada quando este retorna em resposta a outro previamente enviado. possvel verificar o funcionamento do Masquerading na comunicao exemplificada nas Figuras 2 e 3. Na Figura 2 possvel ver uma comunicao entre um host localizado em uma rede privada com P invlido (10.0.0.1) e um host com P vlido (200.200.200.200). Esta comunicao possvel graas ao Masquerading, efetuado no roteador 100.100.100.100, que troca o P de origem, invlido na nternet, para o seu prprio P vlido. Este roteador ainda troca a porta de origem, assegurando que no existam duas conexes com a mesma porta de origem vindas da rede interna. Ao efetuar estas modificaes (mais o decremento do TTL e o clculo de um novo chec0su&), o roteador em questo armazena em uma tabela uma referncia para esta conexo. A utilidade desta referncia ser explicada adiante. Estas modificaes permitem que a mensagem chegue ao destinatrio e seja respondida corretamente ao remetente original, como ilustra a Figura 3. 8 Figura 2 Processo de mascaramento ao enviar um pacote Figura 3 Processo de mascaramento ao receber pacote 9 Quando o roteador 100.100.100.100 receber da nternet um pacote, ser procurada em sua tabela, residente em memria, uma referncia prvia, utilizando como base as informaes de porta de destino, endereo P de origem e destino. Caso no seja encontrada uma referncia, o roteador processar o pacote como sendo para entrega local. Caso seja encontrada uma referncia, o endereo P e a porta destino sero trocados para os valores encontrados na tabela. Aps a troca ter sido efetuada, o pacote encaminhado para o destino final, ou seja, o host da intranet que aguarda esse pacote. O Masquerading possibilita at hoje que redes privadas inteiras possam acessar a nternet sem estender o endereamento provido pelo Pv4, o que seria praticamente impossvel sem que alteraes fossem feitas nos roteadores e nos softwares. Apesar de resolver a maioria dos problemas quanto a escassez de endereos P vlidos, o Masquerading apresenta uma limitao bsica, que permitir que um host com P invlido somente se comunique na nternet caso a conexo seja iniciada a partir dele. Ainda existem muitos problemas relacionados com esta limitao, normalmente associados aos protocolos de camadas mais altas (no modelo TCP/P) que levam em conta a conexo direta entre dois hosts, o que em tese deveria existir. possvel citar como exemplo o FTP (8ile *rans(er Protocol), que, para permitir uma conexo no-passiva, parte da premissa de que a comunicao entre o servidor e o cliente direta. Para resolver os problemas destes protocolos com o Masquerading, outras tcnicas foram desenvolvidas, como o +onnection *rac0ing, o qual fora o roteador executando o Masquerading a analisar os pacotes de uma conexo at o nvel de camada de aplicao de modo a permitir que os dois hosts envolvidos no processo se comuniquem corretamente. Apesar de ser funcional para a maioria dos casos, h pelo menos trs problemas no +onnection *rac0ing (AYUSO, 2006): O roteador ter maior processamento, pois precisar analisar os pacotes at a camada de aplicao antes de rote-los; Para cada protocolo necessrio um algoritmo que o analise e saiba tomar as decises de roteamento e troca de endereos (NAT), quebrando o conceito de camadas existente na comunicao em rede; necessrio que j exista uma conexo iniciada para que o trac0ing seja feito. 10 Atualmente, existem outras solues mais robustas quanto a conectividade de hosts, como o Pv6 (RFC 1752, 1995), j adotado pela ETF (ETF, 2006) como sucessor do Pv4. O Pv6, ou Png ("P 'e/t 9eneration), alm de estender o endereamento para 128 bits, extinguindo a necessidade do NAT, apresenta funcionalidades interessantes quanto segurana de redes. Em detrimento s suas vantagens, o Pv6 requer alteraes em roteadores e hosts de toda a nternet. Alm da necessidade de se manter os dois protocolos (Pv4 e Pv6) coexistindo em roteadores e hosts por questes de compatibilidade, softwares e alguns protocolos tambm devem estar preparados para o novo padro sugerido pelo Pv6. Hoje, grande parte dos softwares e roteadores na nternet tm suporte ao Pv6, porm a resistncia migrao, mesmo depois de 10 anos de sua criao, ainda grande. 11 + INFORMA3ES T4CNICAS Para que seja possvel explicar a opo, o protocolo, o mdulo, o 6esource 6ecord e a biblioteca RNAT no Captulo 5, o presente captulo fornecer uma breve descrio do funcionamento das 0ernel capa1ilities, campo P Options, 'et(ilter, Source 6oute e DNS. +!1 Ca5a(idades do ernel do Sistema O5era(io)a& No padro POSX (Porta1le Operating Syste& "nter(ace) so definidas 26 capacidades que um software pode ter enquanto estiver em execuo. Exemplos de capacidades so: CAP_CHOWN: permisso para mudar o dono de um arquivo; CAP_SYS_BOOT: permisso para reiniciar o sistema; CAP_NET_RAW: permisso para enviar pacotes RAW para a rede, ou seja, um pacote que no obedece os padres definidos no protocolo de rede. Toda vez que um programa invoca uma syste& call, por exemplo, para mudar o dono de um arquivo, feita a seguinte checagem em 0ernel space: if(capable(CAP_CHOWN)){....} Esta checagem garante que um usurio qualquer no possa alterar o dono de um arquivo. Estas capacidades a princpio deveriam ser providas pelo sistema de arquivos, que as armazenaria em um espao especial chamado inode. Atualmente, nenhum dos sistemas de arquivos suportados nativamente pelo Linux tm suporte a capa1ilities, apesar de o 0ernel t-lo implementado. 12 +!% I* Options Em uma viso simplificada possvel definir o P Options como um campo de utilizao opcional e de implementao obrigatria, o que significa que sua presena no cabealho Pv4 no exigida, porm todos os roteadores devem estar preparados para trat-lo no caso de sua existncia (ver Captulo 2). Sua principal utilidade permitir que opes personalizadas possam ser transmitidas sem a necessidade de alterao do protocolo. Apesar de ser o nico campo de tamanho varivel do cabealho Pv4, exigido que as opes nele inseridas sigam uma sintaxe pr-definida. Levando em considerao o tamanho, possvel classificar as opes em dois tipos: Opes de 1 byte; Opes com tamanho especificado no prprio campo P Options; As opes de 1 byte normalmente so utilizadas para controle do prprio P Options. So definidas somente duas opes deste tipo (RFC 791, 1981): EOOL(.nd o( Option 4ist) Representada pelo byte 0 (zero), deve delimitar o final das opes, ou seja, no deve existir entre uma opo e outra, caso exista mais de uma opo; NOOP ('o Operation) Representada pelo byte 1 (um), uma opo que no causa efeito nenhum e normalmente inserida entre duas opes somente para alinhamento de bytes. As demais opes obrigatoriamente devem seguir o padro demonstrado na Figura 4 (RFC 791, 1981). 13 Figura 4 - Estrutura do campo P Options. Ti5o da O501o (8 bits): byte dividido em 3 subcampos: Co56 "it (1 bit): indica se a opo deve ser copiada para todos os fragmentos caso o pacote seja fragmentado; C&asse (2 bits) : indica se o campo para controle ou para de1ug; Numero da o501o (5 bits): nmero de identificao da opo; Tama)'o (8 bits): indica o tamanho total da opo, considerando o byte de "Tipo da Opo, o tamanho do campo de dados e o prprio campo "Tamanho; Dados (Tamanho 2 bytes): nformaes que se deseja transferir. As opes, portanto, so identificadas pelo primeiro byte (Tipo da Opo). Os nmeros de opo so controlados pelo ANA ("nternet ,ssigned 'u&1ers ,uthority), rgo responsvel pela padronizao dos nmeros de protocolos utilizados na nternet. O principal motivo de o P Options seguir esta estrutura de 3 sub-campos para cada opo (exceto as de 1 byte) permitir que um roteador que no conhea uma determinada opo possa repass-la mesmo sem saber como trat-la. Ao detectar um nmero de opo no conhecido durante a anlise do P Options, somente necessrio avanar no cabealho o nmero de bytes definido no campo "Tamanho, fazendo com que o byte atual seja o incio da prxima opo, caso exista. Caso no exista, certamente ser o byte 0 (zero), indicando o fim das opes. Exemplos de opes so 6ecord 6oute, Source 6oute e "nternet *i&esta&p (RFC 791, 1981). 14 O nmero de bytes no campo P Options condicionado ao valor presente no campo HL ("P 3eader 4ength) do cabealho P, que informa o tamanho total do cabealho P em palavras de 4 bytes. Somando todos os tamanhos dos campos do cabealho Pv4, tem-se o valor de 20 bytes, portanto o valor mnimo do HL 5 (4 x 5 = 20). Qualquer valor acima de 5 indica a existncia do campo P Options, e todo o espao adicional, alm dos 20 primeiros bytes, ser atribudo a ele. Devido ao fato de o tamanho do P Options ser sempre um nmero mltiplo de 4, qualquer espao no utilizado deve ser preenchido com zeros, tecnicamente chamado de padding. Hoje, por exemplo, possvel visualizar o funcionamento do campo P Options utilizando o comando ping -6 (ver Figura 5). Este comando insere a opo RR (6ecord 6oute) no campo P Options, que serve para gravar informaes sobre as rotas por onde o pacote passou para alcanar o destino e voltar origem. Estas rotas so armazenadas dentro do campo P Options. salem@rhapsody:/home/salem/rnat$ ping -R 192.168.1.35 PNG 192.168.1.35 (192.168.1.35) 56(124) bytes of data. 64 bytes from 192.168.1.35: icmp_seq=1 ttl=64 time=0.468 ms RR: 192.168.1.33 192.168.1.35 192.168.1.35 192.168.1.33 Figura 5 Utilizao do campo P Options com o comando ping. O cenrio apresentado na Figura 5 possvel, pois a opo 6ecord 6oute conhecida pelo 0ernel do sistema operacional. O fato que no possvel enviar um opo no conhecida pelo 0ernel dentro do P Options sem a permisso necessria. sto se deve ao fato de que, na hora em que a funo ip:options:co&pile;) (considerando um 0ernel Linux) chamada e uma opo no conhecida encontrada, uma checagem sobre as capacidades (ver Seo 4.1) do software em execuo feita. Caso este software no tenha a capacidade CAP_NET_RAW, a opo 15 ignorada e no enviada para a rede. A princpio somente o usurio root (administrador do sistema) executa os programas com esta capacidade ativada. Vale lembrar que estas consideraes so vlidas somente para o 0ernel do host cliente, visto que os roteadores situados entre os hosts origem e destino, quando no sabem como tratar uma determinada opo, conseguem pass-la adiante. +!- Net7i&ter Netfilter um sistema para manuseio de pacotes localizado no 0ernel do Linux (RUSSEL,2002). O 'et(ilter mostra seu funcionamento atravs de hoo0s (ganchos) colocados em lugares especficos dentro do cdigo do sistema operacional onde os pacotes podem ser manuseados. Para o Pv4 so definidos cinco hoo0s! NPUT: Trata pacotes com destino no host local; FORWARD: Trata pacotes com origem em um host (no o local) e com destino em outro; OUTPUT: Trata pacotes originados no host local; PREROUTNG: Trata pacotes antes da tomada de deciso de roteamento; POSTROUTNG: Trata pacotes depois da tomada de deciso de roteamento; possvel entender o caminho percorrido pelo pacote no 0ernel do Linux e a ordem na qual as hoo0s so atingidas atravs da Figura 6 (RUSSEL, 2002). Uma grande funcionalidade provida pelo Netfilter permitir que novos cdigos possam ser incorporados sem a alterao do 0ernel, normalmente atravs de mdulos. possvel, por exemplo, escrever um novo mdulo personalizado e associ-lo a uma determinada hoo0, de forma que qualquer pacote que passe por esta hoo0 tambm passe pelo mdulo. Na prtica estas hoo0s so funes escritas em C (linguagem na qual o Linux desenvolvido) e esto localizadas em lugares estratgicos na implementao da pilha TCP/P. Para o 0ernel, a hoo0 funciona 16 como uma caixa preta que receber um pacote, podendo retorn-lo modificado, permitindo o seu trajeto normal no 0ernel, ou simplesmente descart-lo. Um software muito popular em ambiente Linux e que utiliza recursos do net(ilter o ipta1les, comumente utilizado para criar estruturas de (ireall e, principalmente, executar Masquerading (ver Captulo 3). Figura 6 Disposio das 3oo0s do 'et(ilter no kernel do Linux. +!+ Sour(e Route O Source 6oute uma tcnica na qual o emissor de um pacote pode especificar alguns ou todos os roteadores pelo qual ele dever passar. sto feito colocando em seu campo P Options uma lista com os hops < at o destino. Devido ao desejo de desenvolver um esquema escalvel (mais de um nvel de roteamento) para o presente trabalho, a primeira tentativa foi a de utilizar o prprio Source 6oute, pois j est presente nos sistemas operacionais e roteadores. Existem basicamente dois tipos de Source 6oute (RFC 791, 1981): LSRR (4oose Source and 6ecord 6oute): o prximo endereo P na lista de roteadores por onde o pacote passar no precisa estar diretamente conectado rede do roteador atual, o que significa que para atingir o prximo hop o pacote pode passar por vrios roteadores intermedirios; 1 Nome tcnico dado para cada ponto de passagem de um pacote at seu destino. 17 SSRR (Strict Source and 6ecord 6oute): toda a rota at o destino deve ser especificada. O SSRR no serve para o presente trabalho, pois invivel que um host tenha que conhecer previamente todos os endereos dos roteadores do caminho at o destino. O LSRR aparentemente seria a soluo definitiva, porm no decorrer dos estudos apresentou uma srie de problemas. O principal que o Source 6oute foi praticamente eliminado da nternet por gerar problemas de segurana. Atualmente, muitos roteadores na nternet ao notar a presena de uma opo de Source 6oute descartam o pacote automaticamente. Como este no um problema que tenha soluo, os testes com Source 6oute foram abortados. Outro problema tcnico encontrado, porm com menor impacto e fcil soluo, que o mdulo M,S52.6,%. do net(ilter (ver Seo 4.3) no mascara pacotes que contenham o chec0su& TCP errado. Quando um pacote TCP utilizando Source 6oute enviado, seu chec0su& calculado utilizando um pseudo-cabealho baseado em camada de rede, que contm, entre outros campos, o P de destino, porm, no Source 6oute o pacote no enviado diretamente para o destino, mas sim para um roteador intermedirio (o especificado no campo P Options), o que faz com que o chec0su& TCP trafegue errado na internet at que chegue em seu host final. O fato de o chec0su& estar incorreto o suficiente para que o mascaramento no seja efetuado, tornando a idia de usar Source 6oute novamente invlida. +!8 DNS O DNS (%o&ain 'a&e Syste&) um mecanismo comumente utilizado para converter nomes de domnios em endereos P. A existncia deste sistema facilita o acesso a hosts, sendo que a origem no precisa conhecer previamente o endereo P do destino, somente o seu domnio, que visivelmente de mais fcil memorizao, como por exemplo um domnio www.dainf.cefetpr.br em vez do endereo P. A arquitetura do DNS segue uma forma hierrquica, onde cada site pode ser autoridade para responder requisies DNS pelo seu prprio domnio. O DNS funciona baseado no conceito de registros (6esource 6ecords ou 18 66=s), que so os tipos de informaes que podem ser traduzidas tomando como base um domnio. O cliente, ao fazer uma consulta ao servidor DNS, deve indicar qual o tipo de registro associado ao domnio consultado que ele deseja obter. Atualmente, existem mais de 30 tipos de registros DNS cadastrados no ANA (ANA, 2006). Exemplos de registros so: A Endereo Pv4 genrico; AAAA Endereo Pv6; MX Mail ./changer (Servidor responsvel por receber e-mails para um domnio; TXT Texto qualquer. Cada consulta DNS pode retornar mais de um registro do mesmo tipo. Muitos sites utilizam este recurso como forma de equilibrar o acesso entre servidores, disponibilizando mais de um registro do tipo A para um mesmo domnio. Em resumo, o DNS hoje uma pea fundamental para o funcionamento da nternet, principalmente devido a sua vasta extenso e a inviabilidade de se decorar endereos P. 19 8 IM*LEMENTAO DO RNAT 9!outa"le NAT: O principal objetivo do presente trabalho alterar o Pv4 de forma que, com o menor nmero de modificaes possvel, um host de uma rede privada possa se conectar diretamente a um host de outra rede privada, ambos com P's invlidos, utilizando os protocolos mais comuns na internet: UDP, TCP, CMP ("nternet +ontrol Message Protocol). Faz parte da proposta achar uma identificao universal para que o endereo de cada host seja nico no mundo, assim como desenvolver todas as modificaes mantendo a mxima compatibilidade com o Pv4, aplicaes e demais protocolos. 8!1 O501o RNAT Como no possvel simplesmente aumentar o nmero de bytes no cabealho P para estender os endereos de origem e destino, a identificao universal proposta composta de dois endereos: um P vlido (referente ao roteador que executa o mascaramento) e um P invlido (referente ao host final que passa pelo processo de mascaramento e que est localizado em uma rede privada). Para manter a compatibilidade com o Pv4 criou-se uma nova opo para o campo P Options (ver Captulo 2) nomeada RNAT. O RNAT armazena os endereos P da rede privada, ou seja, o P Options um campo que pode receber opes personalizadas do emissor do pacote, o qual pode inserir o endereo P adicional, que seria o endereo P do host da outra rede privada com o qual deseja se comunicar. Como descrito no Captulo 2, o campo P Options deve seguir um formato bem definido. Para a opo RNAT, os campos do P Options contm os seguintes valores (representao em base binria): Ti5o da O501o Co56 "it: 1 (opo deve ser copiada nos fragmentos); C&asse: 00 (classe de controle); N;mero da o501o: 11001 (25 em decimal) prximo nmero 20 disponvel. Tama)'o: 0xB (11 em base decimal); Dados: 4 bytes (P da rede privada de origem), 4 bytes (P da rede privada de destino), 1 byte (reservado para uso futuro). Os campos de origem e destino mudam de posio durante a comunicao. Agrupando todos os oito bits iniciais tem-se o primeiro byte, nmero 153 em base decimal (ou 0x99 em hexadecimal). O segundo byte do campo P Options relativo ao tamanho total da opo, medido em bytes. Devido ao fato de ter sido includa uma opo extra para uso futuro com o tamanho de 1 byte, o tamanho total ser de 11 bytes (ou 0xB em hexadecimal), pois a opo dever comportar 2 P's de 32 bits (8 bytes) + 1 byte inicial + 1 byte de tamanho + 1 byte para uso futuro. Assim tem-se 1+1+8+1 = 11. possvel entender melhor a representao da opo analisando a Figura 7. Figura 7 Estrutura da opo RNAT no campo P Options O desempenho da comunicao Pv4, mesmo aps a adio dos 11 bytes da opo RNAT ao cabealho, pode ser conferido no Apndice A. A forma como esta opo ser utilizada est descrita a seguir. 8!% *roto(o&o RNAT Como o Source 6oute no foi a melhor escolha como base para o presente trabalho, desenvolveu-se um protocolo prprio, nomeado 6outa1le ',* 21 (RNAT), pelo fato de permitir o acesso direto atravs da nternet entre hosts que esto passando pelo processo de mascaramento. Este protocolo dita as regras de como tratar a nova opo para o campo P Options descrita no captulo 5.1. A idia que toda vez que um roteador receber um pacote e detectar a presena da opo RNAT, tomar uma deciso de roteamento baseada nela. Nesta opo sempre estaro os endereos P referentes aos hosts que passam pelo processo de mascaramento. Em uma viso macro, a comunicao sempre feita entre os dois roteadores, porm estes ltimos ao analisar a opo conseguem rotear corretamente os pacotes para os hosts das redes privadas e com P's invlidos que esto se comunicando realmente. Figura 8 Redes privadas com acesso nternet O cenrio demonstrado na Figura 8, redes privadas com acesso nternet, algo muito comum tanto em ambientes corporativos como em ambientes residenciais. Vamos supor que o host 192.168.0.1 da rede privada A deseje se comunicar com o roteador 100.100.100.100. Esta uma comunicao possvel graas ao NAT efetuado no servidor 200.200.200.200, que mascara a origem. Ou seja, para o host 100.100.100.100, a comunicao feita entre ele e o host 200.200.200.200, sendo que na verdade o host com o qual ele se comunica o 192.168.0.1. O grande problema quando o host 192.168.0.1 deseja se comunicar com um host que est depois do roteador 100.100.100.100, como, por exemplo, o host 10.0.0.1. Supondo que o acesso esteja sendo feito na porta TCP 80, este 22 cenrio possvel somente se o roteador da rede privada B possuir uma regra baseada na camada de transporte para direcionar todo o trfego recebido na porta TCP 80 para o host 10.0.0.1 (DNAT). Esta soluo tem pelo menos dois problemas graves: O emissor no sabe previamente qual o host que ele ir acessar, pois feito um redirecionamento no destino; No possvel atingir outro host nesta mesma rede privada (10.0.0.2, por exemplo) que atenda na porta 80, pois todas as conexes nesta porta sero redirecionadas para 10.0.0.1. O segundo problema o mais comum e, atualmente, pode-se citar muitos exemplos de como isto interfere na comunicao entre dois hosts, como em uma transferncia de arquivos via um M ("nstant Messenger) qualquer. A comunicao direta entre estes hosts no pode acontecer, devido aos dois hosts estarem atrs de um roteador executando Masquerading. sso obriga o envolvimento de um terceiro host na nternet com P vlido para servir como ponte, fazendo com que a segurana seja comprometida (pelo fato de enviar os dados para um host intermedirio, o qual pode capturar o trfego) e a velocidade reduzida devido ao consumo de banda duplicado. A idia utilizar a opo RNAT para contornar os problemas expostos acima. A explicao do seu funcionamento ser baseada no cenrio demonstrado na Figura 8, levando em considerao uma comunicao entre o host 192.168.0.1 da rede privada A e o host 10.0.0.1 da rede B. O host 192.168.0.1 inicia o processo de conexo fazendo uma solicitao ao sistema operacional para abrir um soc0et > com o host 100.100.100.100. Porm, antes de chamar a funo connect;), a qual efetivamente manda o primeiro pacote para o destino, a funo setsoc0opt;) deve ser invocada passando para ela o formato da opo RNAT (descrito na Seo 5.1). O host 192.168.0.1 no dever informar o P da rede privada de origem, ou seja, o seu prprio P. Por questes de segurana, este endereo ser preenchido no roteador 200.200.200.200 antes de enviar o pacote para a nternet. Desta forma, qualquer valor preenchido no campo destinado ao P da rede privada ser sobrescrito. 2 Referncia de uma cone!"o. #m soc$et para comunica%"o em rede pode ser considerado como uma associa%"o &'gica entre um () e uma porta *+) ou #,). 23 Para seguir um padro sugerido que o host cliente sempre preencha este campo com o endereo P 255.255.255.255. A Figura 9 mostra como a opo RNAT estar disposta no pacote ao sair do host de origem. Figura 9 Opo RNAT ao sair do host de origem Ao chegar no roteador 200.200.200.200, o sistema detectar que o pacote teve origem em sua rede privada e far o NAT normalmente, porm, trocar o contedo do campo destinado ao P da LAN (4ocal ,rea 'etor0) de origem pelo verdadeiro P do host que enviou o pacote. A Figura 10 demonstra o contedo da opo RNAT no momento em que o pacote deixa o roteador 200.200.200.200. Figura 10 Opo RNAT ao ser enviada para a nternet Quando o pacote chegar no roteador 100.100.100.100, o mesmo dever detectar a presena da opo RNAT e, como o pacote teve origem externa, assumir que este pacote dever ser roteado para sua rede privada. Para saber qual ser o host destino, consultar a opo RNAT e colocar no endereo destino do cabealho P o verdadeiro endereo, neste caso 10.0.0.1. Alm desta alterao, os endereos de origem e destino da opo RNAT so trocados de posio. sto feito para que, no momento em que a opo chegue no host destino, somente seja necessrio copi-la de volta ao pacote sem precisar efetuar nenhuma alterao. A Figura 11 demonstra a opo RNAT no momento em que chega ao host destino. 24 Figura 11 Opo RNAT ao ser enviado para o host destino. Neste ponto necessrio considerar dois cenrios: a) Se o 0ernel do host destino no conhecer a opo RNAT, esta no ser copiada de volta para o pacote, porm a comunicao efetuada com sucesso, pois o host destino retornar o pacote para o host 200.200.200.200. Este por sua vez j manteve uma referncia previamente em sua tabela NAT ao processar o pacote, e desta forma o rotear normalmente para o verdadeiro host emissor. b) Se o 0ernel do host destino conhecer a opo, esta ser copiada de volta para o pacote. No momento em que este pacote passar pelo host 100.100.100.100 com destino ao host 200.200.200.200, ser detectada que existe a opo RNAT e que o pacote teve origem em sua rede privada, assumindo desta forma que o endereo de origem na opo RNAT deve ser preenchido com o endereo do verdadeiro emissor (10.0.0.1), fechando o ciclo de comunicao. Com estas regras a comunicao entre os dois hosts (192.168.0.1 e 10.0.0.1) torna-se possvel, mesmo considerando que ambos tenham P's invlidos e passem pelo processo de mascaramento. 8!- M<du&o r)at=router Para que a comunicao proposta no presente trabalho, entre dois hosts que passam pelo processo de mascaramento, seja possvel, necessrio que os roteadores saibam como tratar os pacotes contendo a P Option RNAT. Normalmente, o cdigo que trata estes pacotes est localizado 25 internamente no sistema operacional dos roteadores, o que dificulta a sua alterao. Felizmente, o 0ernel Linux prov uma forma simples para que novas funcionalidades sejam agregadas sem a necessidade de recompilao: Kernel Modules (Mdulos do 0ernel). Um mdulo um trecho de cdigo compilado em linguagem C e formatado de forma especfica, podendo se agregar ao 0ernel sem a necessidade de reinicializao do sistema. Para tratar a opo RNAT foi desenvolvido um mdulo para o 0ernel nomeado rnat:router. Este mdulo se registra em duas hoo0s do net(ilter (ver Seo 4.3): PREROUTNG e POSTROUTNG. Este registro permite que todos os pacotes sejam tratados por este mdulo sempre que atingirem as hoo0s especificadas. A criao do mdulo rnat:router elimina a necessidade de ter uma verso modificada do 0ernel Linux nos roteadores em um primeiro momento, porm a idia que, posteriormente, os roteadores implementem nativamente o suporte opo RNAT. O cdigo fonte do mdulo rnat_router mostrado no Apndice B. O funcionamento interno do mdulo segue exatamente a especificao do protocolo RNAT (ver Seo 5.2). 8!+ Resour(e Re(ord RNAT Para o presente trabalho, percebeu-se que o padro atual de DNS (descrito na Seo 4.5) no era suficiente para se referenciar 2 P's ao invs de um, ou seja, os endereos P do roteador e do host da rede privada. Apesar de o DNS suportar mais de um registro do mesmo tipo por domnio, a idia atual que, quando o DNS retornar mais de um endereo por domnio, o software cliente escolha um destes endereos para fazer o acesso (ver Seo 4.5), o que no verdade considerando o sistema RNAT. Para o RNAT, obrigatoriamente um dos endereos P deve ser o do roteador e o outro do host da rede privada. Como no possvel fazer esta especificao atravs do DNS, criou-se um novo registro chamado RNAT. Este novo RR na verdade uma cpia do RR A, somente com algumas informaes trocadas. Desta forma possvel que o software cliente consulte o servidor DNS solicitando o RR RNAT para obter o P da outra rede privada e, posteriormente, faa a mesma 26 solicitao com o RR A para obter o P do roteador. A criao do RR RNAT prov uma forma elegante de se referenciar um host de outra rede privada, porm para poder utilizar este RR necessrio que o servidor DNS tenha suporte ele. Este suporte exige que o servidor DNS seja alterado. Para que esta alterao seja evitada, um mtodo de compatibilidade foi planejado, utilizando um RR hoje j presente nos servidores DNS. O RR escolhido para este fim foi o TXT, ou seja, em vez de retornar o endereo P, retornado um texto com uma formatao bem definida representando o endereo P. Quando utilizado o RR na forma TXT, deve-se seguir o seguinte padro: "RNAT 192.168.0.1. Ou seja, a string "RNAT deve ser inserida para que o software cliente reconhea esta opo como sendo um P invlido, seguida do P propriamente dito. Um exemplo de arquivo para configurao de um domnio para o servidor DNS 7"'% (SC, 2006) mostrado no Apndice C. No software cliente sugerido que primeiro seja feita uma consulta pelo RR RNAT. Caso no seja retornado um resultado, a consulta deve ser feita pelo RR TXT. Como dito anteriormente, consultas com o RR TXT somente devem ser utilizadas para manter a compatibilidade com as implementaes de servidores DNS atuais, porm tendem a ficar obsoletas no caso de o RR RNAT fazer parte nativamente de implementaes posteriores destes servidores. 8!8 Bi"&iote(a de 7u)0>es RNAT Como explicado na Seo 5.2, os softwares clientes necessitam de uma pequena alterao em seu cdigo, mais especificamente na solicitao de abertura de um soc0et ao sistema operacional. Para facilitar a migrao dos programas ao novo padro, uma biblioteca escrita em C foi desenvolvida. Atualmente, possui somente duas funes, que esto descritas abaixo. Devido ao fato de a estrutura da opo RNAT no campo P Options ser sempre a mesma, apenas alterando o P invlido de destino, foi criada uma funo chamada do:rnat ;int soc0et, unsigned int ip), a qual recebe como parmetros a referncia do soc0et (retornada pela funo soc0et;)) e o P propriamente dito. A 27 funo do:rnat;) se encarregar de fazer as modificaes necessrias internamente atravs da syste& call setsoc0opt;). A outra funo presente na biblioteca chama-se ns:rnat:query ;char ?do&ain). Esta funo capaz de consultar o servidor DNS pedindo por um RR do tipo RNAT e em caso de falha consultar o RR TXT (modo de compatibilidade). possvel ver um exemplo de uso da biblioteca RNAT no Apndice D. 8!? I)7orma0>es im5orta)tes so"re o RNAT Algumas informaes relevantes sobre a arquitetura das redes utilizando RNAT so fornecidas abaixo: Roteadores de redes privadas que no implementam o RNAT permitem que seus hosts acessem hosts de outras redes privadas utilizando RNAT, porm no permitem que hosts de outras redes privadas acessem os hosts de sua prpria rede privada@ Softwares servidores no necessitam de alteraes para se comunicar utilizando RNAT; Softwares clientes necessitam de uma pequena alterao na abertura do soc0et para poder inserir a opo RNAT nos pacotes. Esta alterao pode ser feita com ajuda da biblioteca RNAT, desde que o software esteja escrito em linguagem C; Devido ao fato de o 0ernel do host cliente no conhecer a opo RNAT, no possvel inser-la nos pacotes utilizando um usurio comum, somente com um usurio privilegiado (root em sistemas Linux), pois o pacote considerado RAW, ou seja, no obedece os padres de rede impostos pelo 0ernel. Esta situao pode ser solucionada utilizando um 0ernel alterado para reconhecer a opo RNAT, ou utilizando o mdulo do 0ernel chamado rnat_host, fornecido junto com o software RNAT, que sobrescreve a funo que impede a insero da opo RNAT (ip_options_compile), fazendo com que o 0ernel passe a reconhec-la sem a necessidade de ser recompilado; Caso o roteador da rede conectado nternet no seja um computador com o 0ernel Linux e se deseje receber conexes externas para os 28 hosts da rede privada, possvel redirecionar as portas todas TCP e UDP via NAT para um computador com Linux localizado entre a rede privada e o roteador, que por sua vez poder ter suporte ao RNAT. 29 ? FUNCIONAMENTO DO RNAT O presente captulo tem como objetivo demostrar o funcionamento do RNAT de forma prtica. Para que isto seja possvel, modificaes (patches) para alguns softwares populares foram feitas, utilizando como base a biblioteca RNAT (Seo 5.5). As modificaes disponibilizadas visam apenas provar a funcionalidade do RNAT, e no devem ser consideradas como as modificaes oficiais. Modificaes oficiais devem ser disponibilizadas pelos mantenedores do software em questo. ?!1 RNAT em roteadores Para que roteadores das redes privadas permitam que seus hosts sejam acessados a partir de outras redes privadas, necessrio que ele utilize o mdulo rnat:router. Este mdulo pode ser adquirido na pgina oficial do projeto RNAT (RNAT, 2006). Para compilar o mdulo necessrio ter o cdigo fonte do 0ernel utilizado. Distribuies Linux normalmente disponibilizam este cdigo em um pacote chamado kernel-sources. Para executar a compilao do mdulo somente necessrio digitar 'make' no diretrio 'rnat_router' dentro do cdigo fonte do RNAT. Este processo, ao ser executado com sucesso, criar um arquivo chamado rnat:router.0o, que o mdulo propriamente dito. Para carreg-lo no kernel basta executar o comando 'ins&od rnat:router.0o'. possvel certificar-se que seu carregamento ocorreu com sucesso analisando a sada do comando 'd&esg A grep 6',*', que dever retornar o seguinte texto: root@rhapsody:~/rnat# insmod rnat_router.ko root@rhapsody:~/rnat# dmesg | grep RNAT RNAT: Masquerade interface for rnat is eth0 RNAT: ntranet interface for rnat is eth1 RNAT: This is an experimental module, use at your own risk. root@rhapsody:~/rnat# 30 Neste ponto, todos os pacotes recebidos pelo roteador esto passando pelo mdulo rnat:router, porm ele s processar pacotes RNAT que cheguem pela interface de rede eth0 e que o host com P invlido de destino seja acessvel atravs da interface eth1. Estes valores so atribudos automaticamente quando nenhum parmetro passado ao mdulo no momento do seu carregamento. Como nem sempre esta configurao de interfaces de rede igual em roteadores, h duas forma de mudar os valores padro definidos pelo mdulo: Passagem de parmetros na hora da carga do mdulo; Utilizar arquivos especiais para alterar o funcionamento do mdulo em tempo de execuo, sem necessitar descarreg-lo e carreg-lo novamente. Para o primeiro caso, considerando que as interfaces de rede para a nternet e para a rede privada so respectivamente eth0 e eth3, possvel carregar o mdulo da seguinte forma: root@rhapsody:~/rnat# insmod rnat_router.ko dev_ext=eth0 dev_lan=eth3 Para o segundo caso, considerando a mesma configurao de interfaces de rede do exemplo anterior, possvel obter o mesmo resultado atravs dos comandos: root@rhapsody:~/rnat# insmod rnat_router.ko root@rhapsody:~/rnat# echo -n eth0 > /sys/module/rnat_router/parameters/dev_ext root@rhapsody:~/rnat# echo -n eth3 > /sys/module/rnat_router/parameters/dev_lan ?!% RNAT em 'osts ?!%!1 @er)e& Para que usurios sem privilgios especiais possam enviar a opo RNAT dentro de pacotes, necessrio que o 0ernel dos hosts clientes tenham o mdulo rnat:host carregado. O cdigo fonte mostrado no Apndice E. O processo 31 de compilao exatamente igual ao do mdulo rnat:router para o 0ernel dos roteadores (seo 6.1). O carregamento no exige nenhum parmetro especial. ?!%!% O5e)SS2 O software OpenSSH amplamente utilizado para efetuar acesso a hosts remotos. A alterao efetuada em seu cdigo basicamente adiciona suporte a consultas DNS pela RR RNAT e a insero da opo RNAT nos pacotes enviados por ele. Uma sesso ssh utilizando RNAT pode ser conferida abaixo: salem@rhapsody:~$ ./ssh usage: ssh [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port] [-e escape_char] [-F configfile] [-i identity_file] [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-R [bind_address:]port:host:hostport] [-S ctl_path] [-w tunnel:tunnel] [user@]hostname [command] ABr RNAT 'ost I*C salem@rhapsody:~$ ./ssh 200.200.200.200 -r 192.168.0.1 -l usuario Password: usuario@host:~/$ ?!%!- *utt6 O Putty um software popular por permitir conexes ssh (Secure Shell) utilizando uma interface grfica. As modificaes efetuadas foram as mesmas do software OpenSSH (Seo 6.2.2), porm com alteraes em sua interface, conforme ilustrado na Figura 12. 32 Figura 12 Software putty com suporte a RNAT. ?!%!+ *i)g O software ping popular em diversas plataformas. Comumente utilizado para testar a conectividade entre dois hosts. Para isto utiliza mensagens CMP do tipo echo request-reply. possvel encontrar a modificao completa do seu cdigo fonte para suportar RNAT no Apndice F. Um exemplo de sua utilizao com RNAT pode ser conferido abaixo. root@rhapsody:~/netkit-base-0.17/ping# ./ping 200.200.200.200 -a 192.168.0.1 -c 3 PNG 200.200.200.200 (200.200.200.200 - 192.168.0.1): 56 octets data 64 octets from 200.200.200.200 - 192.168.0.1: icmp_seq=0 ttl=254 time=34.1 ms 64 octets from 200.200.200.200 - 192.168.0.1: icmp_seq=1 ttl=254 time=32.1 ms 64 octets from 200.200.200.200 - 192.168.0.1: icmp_seq=2 ttl=254 time=37.1 ms 3 packets transmitted, 3 packets received, 0% packet loss root@rhapsody:~/netkit-base-0.17/ping# 33 CONCLUSO Com a utilizao do RNAT, o acesso direto a hosts que passam por um processo de mascaramento torna-se possvel. Apesar de todo o estudo ter sido baseado em plataforma GNU/Linux, o conceito foi desenvolvido de forma genrica e tende a ser compatvel com qualquer sistema operacional. Uma grande vantagem em sua utilizao permitir que redes privadas consigam se comunicar com outras sem alteraes em suas topologias. importante enfatizar que o RNAT no pretende ser uma alternativa ao Pv6, mas apenas um conceito que adiciona uma funcionalidade no provida pelo NAT: a conexo direta. Apesar de o endereamento com RNAT ser estendido (por se tratar de dois endereos de 32 bits), ainda notavelmente pequeno comparado aos 128 bits do Pv6. O RNAT prov alta compatibilidade com so(tares servidores j existentes e requer pequenas alteraes em so(tares clientes, tornando-se assim uma soluo a curto prazo para a conexo direta entre redes privadas enquanto um protocolo mais robusto, como o Pv6, no utilizado em toda a nternet. 34 TRABAL2OS FUTUROS Como trabalho futuro prope-se a modificao na implementao de soc0ets dos sistemas operacionais, fazendo com que o endereo RNAT seja reconhecido nativamente como um identificador, alm das portas TCP/UDP e do endereo P do roteador de origem. Desta forma softwares servidores poderiam identificar o P da rede privada de origem atravs de uma chamada de sistema e o NAT no se faria mais necessrio a longo prazo. Outra proposta seria adicionar todo o cdigo que hoje est localizado nos mdulos rnat:router e rnat:host internamente no 0ernel, fazendo com que ele reconhea a opo nativamente e evite que hosts clientes precisem ter privilgios especiais ou utilizem o mdulo rnat_host para poder enviar a opo RNAT nos pacotes. 35 A*DNDICE A ANELISE DE DESEM*EN2O DO RNAT 36 As Figuras A1 e A2 ilustram os testes realizados para analisar o desempenho da comunicao Pv4 sem e com o uso do RNAT, respectivamente. Os testes foram efetuados calculando o tempo de resposta de 60 mensagens CMP do tipo echo request-reply (ping). Vale lembrar que todo teste de desempenho efetuado via nternet no garante resultados precisos, devido ao fato de no ser um ambiente totalmente controlado e imune a interferncias externas. Figura A1 - Tempo de resposta para um host com P vlido. Figura A2 - Tempo de resposta para um host com P invlido de outra intranet. 37 A*DNDICE B CFDIGO FONTE DO MFDULO RNAT=ROUTER 38 -. * Copyright (C) 2006 Tiago Salem Herrmann <tiagosh@gmail.com> * * This program is free softare! yo" can re#istri$"te it an#%or * mo#ify it "n#er the terms of the &'( &eneral )"$lic *icense * as p"$lishe# $y the +ree Softare +o"n#ation! only ,ersion * 2 of the *icense. * *% -incl"#e <lin".%mo#"le.h> -incl"#e <lin".%s/$"ff.h> -incl"#e <lin".%tcp.h> -incl"#e <lin".%inet#e,ice.h> -incl"#e <lin".%icmp.h> -incl"#e <lin".%"#p.h> -incl"#e <net%ip.h> -incl"#e <net%ro"te.h> -incl"#e <lin".%mo#"leparam.h> %% sysfs -incl"#e <lin".%netfilter0ip,1.h> -if#ef C2'+3&0)42C0+S %% only if e ha,e procfs -incl"#e <lin".%proc0fs.h> -en#if %% #efine the rnat option n"m$er. %% 5 6 $its 5 6 $its 5 1 $ytes 5 1 $ytes 5 7 $yte 5 %% 888888888888888888888888888888888888888888888888888888 %% 575005770075 0.09 5 :.:.:.: 5 :.:.:.: 5 : 5 %% 588888888888888888888888888888888888888888888888888888 %% 5 7;< class5 si=e 5 ip 7 5 ip 2 5e.ten#e#5 %% -#efine 3)2)T04'>T (2;53)2)T0C2'T42*53)2)T0C2)?) -#efine 3)2)T04'>T0S3@A 0.$ -#efine BA+>(*T03+>CA0A:T Ceth0C -#efine BA+>(*T03+>CA0*>' Ceth7C %* 'ADA4 (SA &*29>* D>43>9*ASE 2FG *% static str"ct nf0hoo/0ops netfilter0ops0in! %* '+03)0)4A042(T3'& *% static str"ct nf0hoo/0ops netfilter0ops0o"t! %* '+03)0)4A042(T3'& *% -if#ef C2'+3&0)42C0+S static str"ct proc0#ir0entry *proc0#e,0e.t! static str"ct proc0#ir0entry *proc0#e,0lan! -en#if static char #e,0e.tH70I! static char #e,0lanH70I! J2B(*A0*3CA'SA(C&)*C)! J2B(*A0>(TH24(CTiago Salem Herrmann <tiagosh@gmail.com>C)! J2B(*A0BASC43)T32'(C'etfilter mo#"le hich allos ro"ta$le '>TC)! mo#"le0param0string(#e,0e.tE#e,0e.tE si=eof(#e,0e.t)E 0600)! mo#"le0param0string(#e,0lanE#e,0lanE si=eof(#e,0lan)E 0600)! J2B(*A0)>4J0BASC(#e,0e.tE C3nternet o"tp"t '3CC)! J2B(*A0)>4J0BASC(#e,0lanE C3ntranet o"tp"t '3CC)! 39 %* stolen from net%ip,1%ip0options.c * This is a mo#ifie# ,ersion of ip0options0compile() * only to allo "s to /no if there is a rnat option. * This f"nction ret"rns 0 if there isnKt a rnat optionE * or if e fin# some error in the 3) options. * >ny other ,al"e is the offset of rnat option from ip * hea#er. *% int ip0options0rnat(str"ct s/0$"ff * s/$) L int l! "nsigne# char * iph! "nsigne# char * optptr! int optlen! int is0rnatM0! int rnat0offsetM0! "nsigne# char * pp0ptr M '(**! str"ct ip0options *optM'(**! optM/malloc(si=eof(str"ct ip0options)E&+)0FA4'A*)! if (opt) L memset(optE0Esi=eof(str"ct ip0options))! iph M s/$8>nh.ra! opt8>optlen M ((str"ct iph#r *)iph)8>ihl*1 8 si=eof(str"ct iph#r)! optptr M iph N si=eof(str"ct iph#r)! opt8>is0#ata M 0! OelseL ret"rn 0! O for (l M opt8>optlen! l > 0! ) L sitch (*optptr) L case 3)2)T0A'BP for (optptrNNE l88! l>0! optptrNNE l88) L if (*optptr QM 3)2)T0A'B) L *optptr M 3)2)T0A'B! opt8>is0change# M 7! O O goto eol! case 3)2)T0'22)P l88! optptrNN! contin"e! O optlen M optptrH7I! if (optlen<2 55 optlen>l) L pp0ptr M optptr! goto error! O if (*optptr MM 3)2)T04'>T)L %% the si=e is fi.e# if(optlenQM3)2)T04'>T0S3@A) goto error! is0rnat M 7! rnat0offset M (optptr 8 iph)! 40 l8Moptlen! optptrNMoptlen! $rea/! O l 8M optlen! optptr NM optlen! O eolP if (Qpp0ptr) L /free(opt)! if(is0rnat) ret"rn rnat0offset! else ret"rn 0! O errorP /free(opt)! ret"rn 0! O %* Stolen from >le.eyKs ip0nat0#"m$. *% static int nat0hea#er(str"ct s/0$"ff *s/$E "<2 sa##rE "<2 #a##r) L str"ct iph#r *iph M s/$8>nh.iph! "<2 o#a##r M iph8>#a##r! "<2 osa##r M iph8>sa##r! "76 chec/! %* 4erite 3) hea#er *% iph8>sa##r M sa##r! iph8>#a##r M #a##r! iph8>chec/ M 0! iph8>chec/ M ip0fast0cs"m(("nsigne# char *)iphE iph8>ihl)! %* 3f it is the first fragmentE rerite protocol hea#ers *% if (Q(iph8>frag0off R htons(3)02++SAT))) L "76 *c/s"m! sitch(iph8>protocol) L case 3))42T20TC)P c/s"m M ("76*)R((str"ct tcph#r*) (((char*)iph)N(iph8>ihl<<2)))8>chec/! if (("6*)(c/s"mN7) > s/$8>tail) ret"rn 0! chec/ M *c/s"m! if (s/$8>ip0s"mme# QM CHACFS(J0HS) chec/ M Tchec/! chec/ M cs"m0tcp"#p0magic(iph8>sa##rE iph8>#a##rE 0E 0E chec/)! chec/ M cs"m0tcp"#p0magic(Tosa##rE To#a##rE 0E 0E Tchec/)! if (s/$8>ip0s"mme# MM CHACFS(J0HS) chec/ M Tchec/! *c/s"m M chec/! $rea/! case 3))42T20(B)P 41 c/s"m M ("76*)R((str"ct "#ph#r*) (((char*)iph)N(iph8>ihl<<2)))8>chec/! if (("6*)(c/s"mN7) > s/$8>tail) ret"rn 0! if ((chec/ M *c/s"m) QM 0) L chec/ M cs"m0tcp"#p0magic(iph8>sa##rE iph8>#a##rE 0E 0E Tchec/)! chec/ M cs"m0tcp"#p0magic(Tosa##rE To#a##rE 0E 0E Tchec/)! *c/s"m M chec/ G P 0.++++! O $rea/! case 3))42T203CJ)P L str"ct icmph#r *icmph M (str"ct icmph#r*)((char*)iphN(iph8>ihl<<2))! str"ct iph#r *ciph! "<2 i#a##rE isa##r! if ((icmph8>type QM 3CJ)0BAST0('4A>CH) RR (icmph8>type QM 3CJ)0T3JA0A:CAABAB) RR (icmph8>type QM 3CJ)0)>4>JATA4)429)) $rea/! ciph M (str"ct iph#r *) (icmph N 7)! if (("6*)(ciphN7) > s/$8>tail) ret"rn 0! isa##r M ciph8>sa##r! i#a##r M ciph8>#a##r! %* Change a##resses insi#e 3CJ) pac/et. *% ciph8>#a##r M iph8>sa##r! ciph8>sa##r M iph8>#a##r! c/s"m M Ricmph8>chec/s"m! %* (sing tcp"#p primiti,e. Shy notG *% chec/ M cs"m0tcp"#p0magic(ciph8>sa##rE ciph8>#a##rE 0E 0E T(*c/s"m))! *c/s"m M cs"m0tcp"#p0magic(Tisa##rE Ti#a##rE 0E 0E Tchec/)! $rea/! O #efa"ltP $rea/! O O ret"rn 7! O %* * This f"nction is calle# in the )2ST42(T3'& hoo/. * Here e nee# to chec/ if the o"tgoing interface * is the specifie# in the #e,0e.t ,aria$le. This ,al"e * can $e the #efa"lt Ceth0C or another interface name * specifie# ith the arg K#e,0e.tK. A.P * mo#pro$e rnat #e,0e.tMlan0 * * *% 42 "nsigne# int main0hoo/0postro"ting("nsigne# int hoo/n"mE str"ct s/0$"ff **s/$7E const str"ct net0#e,ice *inE const str"ct net0#e,ice *o"tE int (*o/fn)(str"ct s/0$"ff*)) L str"ct iph#r *iph! str"ct rta$le *rt! str"ct rta$le *rt2! str"ct s/0$"ff *s/$! int err! s/$M*s/$7! if(Qs/$ 55 Qo"t) ret"rn '+0>CCA)T! %% hyG iph M s/$8>nh.iph! %% store the c"rrent ro"ting ta$le rt M (str"ct rta$le*)s/$8>#st! s/$8>#st M '(**! %% try to generate a ne ro"ting information err M ip0ro"te0inp"t(s/$E iph8>#a##rE iph8>sa##rE iph8>tosE s/$8 >#e,)! %% store the KneK c"rrent ro"ting ta$le. rt2 M (str"ct rta$le*)s/$8>#st! %% The ne #estination J(ST $e ('3C>ST (another host) or *2C>*. if (err 55 (rt28>rt0type QM 4T'0('3C>ST RR rt28>rt0type QM 4T'0*2C>*)) L ip0rt0p"t(rt2)! s/$8>#st M Rrt8>".#st! ret"rn '+0>CCA)T! O %% e #onKt ant to #o S'>T hen the pac/et m"st $e %% #eli,ere# "sing another iface than the specifie# in #e,0e.t. %% only S'>T hen #e,0lan is the so"rce iface if(s/$8>#st8>#e,) L %% +3:JA 8 fi. $y so"rce too if(Qstrcmp(s/$8>#st8>#e,8>nameE#e,0e.t))L nat0hea#er(s/$Einet0select0a##r(o"tErt8>rt0gateayE 4T0SC2)A0('3DA4SA)Eiph8>#a##r)! O O %% let it li,e ret"rn '+0>CCA)T! O %* This f"nction is calle# hen the pac/et hits the )4A42(T3'& hoo/. * Here e nee# to chec/ if the pac/et is a K4'>T pac/etKE * change its so"rce a##ress if the #estination is to another * host or change the #estination if the c"rrent #estination * is for local #eli,ery. * 9eca"se >** pac/ets hits hereE e nee# to >CCA)T all pac/etsE * e.cept 4'>T malforme# ones. * * *% "nsigne# int main0hoo/0prero"ting("nsigne# int hoo/n"mE str"ct s/0$"ff **s/$7E const str"ct net0#e,ice *inE const str"ct net0#e,ice *o"tE 43 int (*o/fn)(str"ct s/0$"ff*)) L str"ct iph#r *iph! "nsigne# char * optptr! str"ct rta$le *rt! str"ct rta$le *rt2! str"ct s/0$"ff *s/$! int err! int rnat! "<2 temp! s/$M*s/$7! if(Qs/$) ret"rn '+0>CCA)T! %% hyG iph M s/$8>nh.iph! s/$8>#ataM("nsigne# char*)s/$8>nh.iph! %% if there is no 3) optionsE the pac/et m"st go aay. if(iph8>ihl<6) ret"rn '+0>CCA)T! %% if there is no 4'>T optionE let the pac/et go aay. rnatMip0options0rnat(s/$)! if(Qrnat) ret"rn '+0>CCA)T! if (s/$8>p/t0type QM )>CFAT0H2ST) ret"rn '+0>CCA)T! %% try to generate a ne ro"ting information. s/$8>#st M '(**! err M ip0ro"te0inp"t(s/$E iph8>#a##rE iph8>sa##rE iph8>tosE s/$8 >#e,)! rt M (str"ct rta$le*)s/$8>#st! if(Qrt) ret"rn '+0>CCA)T! %% pro$a$ly ip0forar# #isa$le# %% is this pac/et "nicastG (another host) if (rt8>rt0type MM 4T'0('3C>ST) L %% test if this #e,ice is alloe# to recei,e rnat if(s/$8>#e,)L if(strcmp(s/$8>#e,8>nameE#e,0lan)) ret"rn '+0B42)! O %% point to the ip hea#er N rnat offset optptr M s/$8>nh.ra N rnat! %% p"t the *>' so"rce a##ress in the 3) option %% $efore the #eli,ery process. %% 3tKs not "se# act"ally $eca"se e "se 3) J>SU(A4>BA %% an# it /nos ho to #eli,er this pac/et $ac/ to %% the sen#erE anyayE it can $e "sef"l later. memcpy(RoptptrH6IE Riph8>sa##rE 1)! %% o/E none changes leftE e can calc"late the chec/s"m no. nat0hea#er(s/$Eiph8>sa##rEiph8>#a##r)! 44 ret"rn '+0>CCA)T! O %% is this pac/et for local #eli,eryG(hen e on the #estination 3)) if (rt8>rt0type MM 4T'0*2C>*) L %% point to the ip hea#er N rnat offset optptr M s/$8>nh.ra N rnat! %% the pac/et ill hit here if the ser,er anser %% "sing the 4'>T optionsE $"t it can $e possi$le only %% if the ser,er si#e /ernel is mo#ifie#. >t this moment %% the masV"era#e #oes the or/(#eli,er the pac/et %% $ac/ to the client). %% 9eca"se e are in )4A42(T3'&E is o"r KfateK %% change the pac/et #estination. Se rea# the 3) %% insi#e the option an# p"t it in the #estination. memcpy(RtempERoptptrH2IE1)! memcpy(RoptptrH2IE RoptptrH6IE 1)! memcpy(RoptptrH6IE RtempE 1)! %% time to "p#ate the chec/s"m an# #estination. nat0hea#er(s/$Eiph8>sa##rEtemp)! %% store the c"rrent ro"ting ta$le rt M (str"ct rta$le*)s/$8>#st! s/$8>#st M '(**! %% try to generate a ne ro"ting information %% noteP e nee# to call ip0ro"te0inp"t here %% $eca"se e nee# to chec/ if the #e,0lan an# %% #e,0e.t ere "se#. (nfort"nally this f"nction %% ill $e calle# later anyay insi#e the /ernel. err M ip0ro"te0inp"t(s/$E iph8>#a##rE iph8>sa##rE iph8>tosE s/$8>#e,)! %% store the ne ro"ting information rt2 M (str"ct rta$le*)s/$8>#st! %% the ne ro"te m"st 9A ('3C>ST(another host)E ne,er *2C>*. if (err 55 (rt28>rt0type QM 4T'0('3C>ST)) L ip0rt0p"t(rt2)! s/$8>#st M Rrt8>".#st! ret"rn '+0B42)! O ip0rt0p"t(rt)! if(Qs/$8>#st) %% e #ont ant n"ll pointer e.ceptionE o/G ret"rn '+0B42)! %% e only forar# to o"r #e,0lan pac/ets %% coming from o"r #e,0e.t if(Q(Qstrcmp(s/$8>#st8>#e,8>nameE#e,0lan) RR Qstrcmp(s/$8>#e,8>nameE#e,0e.t))) ret"rn '+0B42)! %% if e hit hereE the pac/et ill $e #eli,ere# to another %% host insi#e o"r *>'. 9yeE 9yeQ ret"rn '+0>CCA)T! O %% if e hit hereE this is a $a# pac/et. B42) it. H"nftQ ret"rn '+0B42)! O -if#ef C2'+3&0)42C0+S ssi=e0t #e,0e.t0rite( str"ct file *filpE const char 00"ser *$"ffE 45 "nsigne# long lenE ,oi# *#ata ) L if(len < 70) L if (copy0from0"ser( #e,0e.tE $"ffE len )) ret"rn 8A+>(*T! #e,0e.tHlenIM0! O ret"rn len! O ssi=e0t #e,0lan0rite( str"ct file *filpE const char 00"ser *$"ffE "nsigne# long lenE ,oi# *#ata ) L if(len < 70) L if (copy0from0"ser( #e,0lanE $"ffE len )) ret"rn 8A+>(*T! #e,0lanHlenIM0! O ret"rn len! O int #e,0e.t0rea#( char *pageE char **startE off0t offE int co"ntE int *eofE ,oi# *#ata ) L int len! if (off > 0) L *eof M 7! ret"rn 0! O len M snprintf(pageE co"ntE CWsXnCE #e,0e.t)! ret"rn len! O int #e,0lan0rea#( char *pageE char **startE off0t offE int co"ntE int *eofE ,oi# *#ata ) L int len! if (off > 0) L *eof M 7! ret"rn 0! O len M snprintf(pageE co"ntE CWsXnCE #e,0lan)! ret"rn len! O -en#if %% C2'+3&0)42C0+S int rnat0init0mo#"le(,oi#) L if(#e,0e.tH0IQM0)L print/(FA4'0'2T3CA C4'>TP JasV"era#e interface for rnat is WsXnCE#e,0e.t)! O else L strcpy(#e,0e.tEBA+>(*T03+>CA0A:T)! print/(FA4'0'2T3CA C4'>TP JasV"era#e interface for rnat is WsXnCE#e,0e.t)! O if(#e,0lanH0IQM0)L print/(FA4'0'2T3CA C4'>TP 3ntranet interface for rnat is WsXnCE#e,0lan)! 46 O else L strcpy(#e,0lanEBA+>(*T03+>CA0*>')! print/(FA4'0'2T3CA C4'>TP 3ntranet interface for rnat is WsXnCE#e,0lan)! O netfilter0ops0in.hoo/ M main0hoo/0prero"ting! netfilter0ops0in.pf M )+03'AT! netfilter0ops0in.hoo/n"m M '+03)0)4A042(T3'&! netfilter0ops0in.priority M '+03)0)430+34ST! netfilter0ops0o"t.hoo/ M main0hoo/0postro"ting! netfilter0ops0o"t.pf M )+03'AT! netfilter0ops0o"t.hoo/n"m M '+03)0)2ST042(T3'&! netfilter0ops0o"t.priority M '+03)0)430*>ST! nf0register0hoo/(Rnetfilter0ops0in)! %* '+03)0)4A042(T3'& hoo/ *% nf0register0hoo/(Rnetfilter0ops0o"t)!%* '+03)0)2ST042(T3'& hoo/ *% print/(FA4'0S>4'3'& C4'>TP This is an e.perimental mo#"leE "se at yo"r on ris/.XnC)! -if#ef C2'+3&0)42C0+S proc0#e,0e.t M create0proc0entry( Cnet%rnat0#e,0e.tCE 0611E '(** )! proc0#e,0lan M create0proc0entry( Cnet%rnat0#e,0lanCE 0611E '(** )! if (proc0#e,0e.t MM '(** 55 proc0#e,0lan MM '(** ) L print/(FA4'03'+2 C4'>TP Co"l#nKt create proc entryXnC)! ret"rn 8A'2JAJ! O proc0#e,0e.t8>rea#0proc M #e,0e.t0rea#! proc0#e,0e.t8>rite0proc M #e,0e.t0rite! proc0#e,0e.t8>oner M TH3S0J2B(*A! proc0#e,0lan8>rea#0proc M #e,0lan0rea#! proc0#e,0lan8>rite0proc M #e,0lan0rite! proc0#e,0lan8>oner M TH3S0J2B(*A! -en#if %% C2'+3&0)42C0+S
ret"rn 0! O ,oi# rnat0clean"p0mo#"le(,oi#) L nf0"nregister0hoo/(Rnetfilter0ops0in)! %% "nregister this mo#"le nf0"nregister0hoo/(Rnetfilter0ops0o"t)! %% this too -if#ef C2'+3&0)42C0+S remo,e0proc0entry(Cnet%rnat0#e,0e.tCE '(**)! remo,e0proc0entry(Cnet%rnat0#e,0lanCE '(**)! -en#if print/(C4'>TP mo#"le "nloa#e#XnC)! O mo#"le0init(rnat0init0mo#"le)! mo#"le0e.it(rnat0clean"p0mo#"le)! 47 A*DNDICE C CONFIGURAO DO SOFTGARE BIND *ARA SU*ORTE A RNAT 48 Exemplo de arquivo de configurao de zona para servidor BND com suporte tanto ao RR RNAT quanto ao modo de compatibilidade (RR TXT). YTT* 66100 @ 3' S2> teste.com.$r. root.teste.com.$r. ( 2006062607 ! serial n"m$er ??JJBB'' 26600 ! 4efresh Z200 ! 4etry 661000 ! A.pire 66100 ! Jin TT* ) 'S teste.teste.com.$r. Y243&3' teste.com.$r. teste 3' > 200.200.200.200 ! en#ere[o #o rotea#or teste 3' 4'>T 70.0.0.2 ! en#ere[o #o host final com 44 4'>T teste 3' T:T C4'>T 70.0.0.2C ! en#ere[o #o host final com 44 T:T host7 3' > 200.200.200.200 ! en#ere[o #o rotea#or host7 3' 4'>T 70.0.0.< ! en#ere[o #o host final com 44 4'>T host7 3' T:T C4'>T 70.0.0.<C ! en#ere[o #o host final com 44 T:T host2 3' > 200.200.200.200 ! en#ere[o #o rotea#or host2 3' 4'>T 70.0.0.1 ! en#ere[o #o host final com 44 4'>T host2 3' T:T C4'>T 70.0.0.1C ! en#ere[o #o host final com 44 T:T 49 A*DNDICE D EHEM*LO DO USO DA BIBLIOTECA RNAT 50 Exemplo em linguagem C da utilizao da biblioteca RNAT -incl"#e <sys%types.h> -incl"#e <sys%soc/et.h> -incl"#e <netinet%in.h> -incl"#e <net#$.h> #include "rnat_functions.h" extern unsigned int ip_rnat; main() L int soc/EportM72<1! char #omainHIMC.thisisan"ll#omain.com.$rC! str"ct soc/a##r0in ser,0a##r! str"ct hostent *ser,er! soc/ M soc/et(>+03'ATE S2CF0ST4A>JE 0)! ser,er M gethost$yname(#omain)! $=ero((char *) Rser,0a##rE si=eof(ser,0a##r))! ser,0a##r.sin0family M >+03'AT! $copy((char *)ser,er8>h0a##rE (char *)Rser,0a##r.sin0a##r.s0a##rEser,er8>h0length)! ser,0a##r.sin0port M htons(port)! ns_rnat_query(domain); // procura no servidor D! pelo "" "#$ // ou $%$ if(ip_rnat&'()) do_rnat(soc*+ip_rnat); // fa, com que a op-.o "#$ // se/a inserida nos pacotes connect(soc/ERser,0a##rEsi=eof(ser,0a##r))! O 51 A*DNDICE E CFDIGO FONTE DO MFDULO RNAT=2OST 52 %* original hi\ac/ co#e from httpP%%e$.n\it.e#"%Tr$\2%hi\ac/2.c * an# ip0options0compile() from net%ip,1%ip0options.c * * Copyright (C) 2006 Tiago Salem Herrmann <tiagosh@gmail.com> * * This program is free softare! yo" can re#istri$"te it an#%or * mo#ify it "n#er the terms of the &'( &eneral )"$lic *icense * as p"$lishe# $y the +ree Softare +o"n#ation! only ,ersion * 2 of the *icense. * *% -incl"#e <lin".%mo#"le.h> -incl"#e <lin".%mo#"leparam.h> -incl"#e <lin".%/ernel.h> -incl"#e <lin".%init.h> -incl"#e <lin".%stat.h> -incl"#e <asm%page.h> -incl"#e <lin".%s/$"ff.h> -incl"#e <lin".%tcp.h> -incl"#e <lin".%icmp.h> -incl"#e <net%tcp.h> -incl"#e <net%icmp.h> J2B(*A0*3CA'SA(C&)*C)! J2B(*A0>(TH24(CTiago Salem Herrmann <tiagosh@gmail.com>C)! J2B(*A0BASC43)T32'(CJo#"le hich forces the /ernel to recogni=e the 4'>T 3) 2ptionC)! static spinloc/0t /ern0loc/ M S)3'0*2CF0('*2CFAB! "nsigne# long sloc/0flags! -#efine *2CF0FA4' spin0loc/0irVsa,e(R/ern0loc/E sloc/0flags) -#efine ('*2CF0FA4' spin0"nloc/0irVrestore(R/ern0loc/E sloc/0flags) -#efine 3)2)T04'>T (2;53)2)T0C2'T42*53)2)T0C2)?) -#efine 3)2)T04'>T0S3@A 0.$ %* stolen from net%ip,1%ip0options.c *% int change#0ip0options0compile(str"ct ip0options * optE str"ct s/0$"ff * s/$) L int l! "nsigne# char * iph! "nsigne# char * optptr! int optlen! "nsigne# char * pp0ptr M '(**! str"ct rta$le *rt M s/$ G (str"ct rta$le*)s/$8>#st P '(**! if (Qopt) L opt M R(3)C9(s/$)8>opt)! memset(optE 0E si=eof(str"ct ip0options))! iph M s/$8>nh.ra! opt8>optlen M ((str"ct iph#r *)iph)8>ihl*1 8 si=eof(str"ct iph#r)! optptr M iph N si=eof(str"ct iph#r)! opt8>is0#ata M 0! 53 O else L optptr M opt8>is0#ata G opt8>00#ata P ("nsigne# char*)R(s/$8 >nh.iphH7I)! iph M optptr 8 si=eof(str"ct iph#r)! O for (l M opt8>optlen! l > 0! ) L sitch (*optptr) L case 3)2)T0A'BP for (optptrNNE l88! l>0! optptrNNE l88) L if (*optptr QM 3)2)T0A'B) L *optptr M 3)2)T0A'B! opt8>is0change# M 7! O O goto eol! case 3)2)T0'22)P l88! optptrNN! contin"e! O optlen M optptrH7I! if (optlen<2 55 optlen>l) L pp0ptr M optptr! goto error! O sitch (*optptr) L case 3)2)T0SS44P case 3)2)T0*S44P if (optlen < <) L pp0ptr M optptr N 7! goto error! O if (optptrH2I < 1) L pp0ptr M optptr N 2! goto error! O %* '9P cf 4+C87672 ;.2.1.7 *% if (opt8>srr) L pp0ptr M optptr! goto error! O if (Qs/$) L if (optptrH2I QM 1 55 optlen < Z 55 ((optlen8<) R <)) L pp0ptr M optptr N 7! goto error! O memcpy(Ropt8>fa##rE RoptptrH<IE 1)! if (optlen > Z) memmo,e(RoptptrH<IE RoptptrHZIE optlen8Z)! O opt8>is0strictro"te M (optptrH0I MM 3)2)T0SS44)! opt8>srr M optptr 8 iph! $rea/! case 3)2)T044P if (opt8>rr) L pp0ptr M optptr! goto error! O 54 if (optlen < <) L pp0ptr M optptr N 7! goto error! O if (optptrH2I < 1) L pp0ptr M optptr N 2! goto error! O if (optptrH2I <M optlen) L if (optptrH2IN< > optlen) L pp0ptr M optptr N 2! goto error! O if (s/$) L memcpy(RoptptrHoptptrH2I87IE Rrt8>rt0spec0#stE 1)! opt8>is0change# M 7! O optptrH2I NM 1! opt8>rr0nee#a##r M 7! O opt8>rr M optptr 8 iph! $rea/! case 3)2)T0T3JAST>J)P if (opt8>ts) L pp0ptr M optptr! goto error! O if (optlen < 1) L pp0ptr M optptr N 7! goto error! O if (optptrH2I < ;) L pp0ptr M optptr N 2! goto error! O if (optptrH2I <M optlen) L 00"<2 * timeptr M '(**! if (optptrH2IN< > optptrH7I) L pp0ptr M optptr N 2! goto error! O sitch (optptrH<IR0.+) L case 3)2)T0TS0TS2'*?P opt8>ts M optptr 8 iph! if (s/$) timeptr M (00"<2*)RoptptrHoptptrH2I87I! opt8>ts0nee#time M 7! optptrH2I NM 1! $rea/! case 3)2)T0TS0TS>'B>BB4P if (optptrH2INZ > optptrH7I) L pp0ptr M optptr N 2! goto error! O opt8>ts M optptr 8 iph! if (s/$) L memcpy(RoptptrHoptptrH2I87IE Rrt8 >rt0spec0#stE 1)! timeptr M (00"<2*)RoptptrHoptptrH2IN<I! 55 O opt8>ts0nee#a##r M 7! opt8>ts0nee#time M 7! optptrH2I NM 6! $rea/! case 3)2)T0TS0)4AS)ACP if (optptrH2INZ > optptrH7I) L pp0ptr M optptr N 2! goto error! O opt8>ts M optptr 8 iph! L "<2 a##r! memcpy(Ra##rE RoptptrHoptptrH2I87IE 1)! if (inet0a##r0type(a##r) MM 4T'0('3C>ST) $rea/! if (s/$) timeptr M (00"<2*)RoptptrHoptptrH2IN<I! O opt8>ts0nee#time M 7! optptrH2I NM 6! $rea/! #efa"ltP if (Qs/$ RR Qcapa$le(C>)0'AT04>S)) L pp0ptr M optptr N <! goto error! O $rea/! O if (timeptr) L str"ct time,al t,! 00"<2 mi#time! #o0gettimeof#ay(Rt,)! mi#time M htonl((t,.t,0sec W 66100) * 7000 N t,.t,0"sec % 7000)! memcpy(timeptrE Rmi#timeE si=eof(00"<2))! opt8>is0change# M 7! O O else L "nsigne# o,erflo M optptrH<I>>1! if (o,erflo MM 7;) L pp0ptr M optptr N <! goto error! O opt8>ts M optptr 8 iph! if (s/$) L optptrH<I M (optptrH<IR0.+)5((o,erfloN7)<<1)! opt8>is0change# M 7! O O $rea/! case 3)2)T04>P if (optlen < 1) L pp0ptr M optptr N 7! goto error! O if (optptrH2I MM 0 RR optptrH<I MM 0) opt8>ro"ter0alert M optptr 8 iph! $rea/! 56 case 3)2)T04'>TP if(optlenQM3)2)T04'>T0S3@A) goto error! l8Moptlen! optptrNMoptlen! $rea/! case 3)2)T0SACP case 3)2)T0S3BP #efa"ltP if (Qs/$ RR Qcapa$le(C>)0'AT04>S)) L pp0ptr M optptr! goto error! O $rea/! O l 8M optlen! optptr NM optlen! O eolP if (Qpp0ptr) ret"rn 0! errorP if (s/$) L icmp0sen#(s/$E 3CJ)0)>4>JATA4)429E 0E htonl((pp0ptr8iph)<<21))! O ret"rn 8A3'D>*! O
static "nsigne# char pr0\"mpHZIMCX.$6X.00X.00X.00X.00X.ffX.e0C! static "nsigne# char pr0sa,eHZI! "nsigne# char * ol#charptr M ("nsigne# char *) 0.::::::::! static int 00init hi\ac/0init(,oi#) L *(long *)Rpr0\"mpH7I M (long)change#0ip0options0compile! *2CF0FA4'! memcpy(pr0sa,eE ol#charptrE Z)! memcpy(ol#charptrE pr0\"mpE Z)! ('*2CF0FA4'! ret"rn 0! O
%* * 'oteP on some systems #ropping root ma/es the process #"mpa$le or @@ 87Z0EZ N7Z7EZ @@ %* #estination *% static str"ct soc/a##r0in hereto! %* ho to ping *% static const char *hostname! 8 Nchar *ip0rnat2! %* * inp"t $"ffer * @@ 8Z;6E6 NZ;ZE7< @@ rite(STB2(T0+3*A'2E R9S)>CAE 7)! O else L 8 printf(CW# octets from WsP icmp0seVMW"CE pac/lenE 8 inet0ntoa(from8>sin0a##r)E icp8>icmp0seV)! N if(ip0rnatQM87) N printf(CW# octets from Ws 8 WsP icmp0seVMW"CE pac/lenE N inet0ntoa(from8>sin0a##r)E ip0rnat2 E icp8>icmp0seV)! N else N printf(CW# octets from WsP icmp0seVMW"CE pac/lenE N inet0ntoa(from8>sin0a##r)E icp8 >icmp0seV)! N printf(C ttlMW#CE ip8>ip0ttl)! 59 if (timing) L printf(C timeMWl#.Wl# msCE triptime%70E @@ 87066EZ N70^2EZ @@ fprintf(st#errE C"sageP ping H8*4#fnVr,I H8c co"ntI H8i aitI H8l preloa#IXnC CXtH8p patternI H8s pac/etsi=eI H8t ttlI C 8 CH83 interface a##ressI hostXnC)! N CH83 interface a##ressIXnXtH8a 4'>T >##ressI hostXnC)! e.it(2)! O
@@ 87762E77 N7766E70 @@ "0char ttlM0E loop! int am0i0root! char rspaceH< N 1 * '42(TAS N 7I! %* recor# ro"te space *% 8 am0i0root M sec"re0start"p()! 8 N ip0rnatM87! preloa# M 0! 8 hile ((ch M getopt(argcE arg,E C3P*4cP#fhPiPlPnpPVrsPtP,PC))QMA2+) L N hile ((ch M getopt(argcE arg,E C3P*4cP#fhPiPlPnpPVrsPtP,PaPC))QMA2+) L sitch(ch) L case KcKP npac/ets M atoi(optarg)! @@ 872Z2E70 N72ZZE20 @@ e.it(2)! O $rea/! N case KaKP N ip0rnatMinet0a##r(str#"p(optarg))! N if(ip0rnatMM87) L N fprintf(st#errECpingP WsP 'ame or ser,ice not /nonXnCEoptarg)! N e.it(2)! N O N ip0rnat2Mstr#"p(optarg)! N $rea/! #efa"ltP "sage()! O O N N if (options R +0+*22B RR options R +03'TA4D>*) L fprintf(st#errE CpingP 8f an# 8iP 3ncompati$le options.XnC)! e.it(2)! @@ 87<2^E6 N7<11E^ @@ O O
N if (ip0rnatQM87) N #o0rnat(soc/Eip0rnat)! N %* * Shen pinging the $roa#cast a##ressE yo" can get a lot of ansers. * Boing something so e,il is "sef"l if yo" are trying to stress the @@ 87<60E6 N7<Z6E72 @@ 60 O
if (hereto.sin0family MM >+03'AT) L 8 printf(C)3'& Ws (Ws)P W# octets #ataXnCE 8 hostnameE inet0ntoa(hereto.sin0a##r)E #atalen)! N if(ip0rnatQM87) N printf(C)3'& Ws (Ws 8 Ws)P W# octets #ataXnCE N hostnameE inet0ntoa(hereto.sin0a##r)E ip0rnat2E #atalen)! N else N printf(C)3'& Ws (Ws)P W# octets #ataXnCE N hostnameE inet0ntoa(hereto.sin0a##r)E #atalen)! O else L printf(C)3'& WsP W# octets #ataXnCE hostnameE #atalen)! #iff 8'a"r ..%net/it8$ase80.7Z8orig%ping%rnat0f"nctions.c .%ping%rnat0f"nctions.c 888 ..%net/it8$ase80.7Z8orig%ping%rnat0f"nctions.c 7^6^8728<7 27P00P00.000000000 80<00 NNN .%ping%rnat0f"nctions.c 200687080; 27P1;P1<.000000000 80<00 @@ 80E0 N7E720 @@ N%* N * Copyright (C) 2006 Tiago Salem Herrmann <tiagosh@gmail.com> N * N * This program is free softare! yo" can re#istri$"te it an#%or N * mo#ify it "n#er the terms of the &'( &eneral )"$lic *icense N * as p"$lishe# $y the +ree Softare +o"n#ation! only ,ersion N * 2 of the *icense. N * N *% N N-incl"#e <sys%types.h> N-incl"#e <netinet%in.h> N-incl"#e <arpa%nameser.h> N-incl"#e <resol,.h> N-incl"#e <string.h> N-incl"#e <st#io.h> N-incl"#e <errno.h> N-incl"#e <arpa%inet.h> N-incl"#e Crnat0f"nctions.hC N N-#efine 9(++A40J>:0S3@A 10^6 N Nint ns0rnat0V"ery(char *#omain) NL N "0char *ip0rnat0resM'(**! N ns0msg anser! N ns0rr rr! N int si=eM0! N int lengthM0! N char final0#omainH7021IML0O! N "nion N L N HA>BA4 hea#er! N "0char #ataH9(++A40J>:0S3@AI! N O V"ery! N N ip0rnatM87! N 61 N if (Q#omain) N ret"rn 87! %% o"chE '(** isnKt goo#. N N %% is it a root #omainG appen# a #ot N length M strlen(#omain)! N if (#omainHlength87I MM K.K) N memcpy(final0#omainE #omainElength)! N else N sprintf(final0#omainE CWs.CE #omain)! N N length M res0V"ery(final0#omainE C03'E T04'>TE ("0char *)RV"eryE si=eof(V"ery))! N ns0initparse(V"ery.#ataE lengthE Ranser)! N if (ns0msg0co"nt(anserE ns0s0an) MM 0) N goto rnat0t.t! N N if (ns0parserr(RanserE ns0s0anE 0E Rrr) < 0) N goto rnat0t.t! N N %% if 3 hit hereE the B'S ser,er has a real 4'>T 44 s"pport N ip0rnat0res M("0char*) ns0rr0r#ata(rr)! N memcpy(Rip0rnatEip0rnat0resE1)! N ret"rn 0! N Nrnat0t.tP N length M res0V"ery(final0#omainE C03'E T0T:TE ("0char *)RV"eryE si=eof(V"ery))! N ns0initparse(V"ery.#ataE lengthE Ranser)! N if (ns0msg0co"nt(anserE ns0s0an) MM 0) N ret"rn 87! N N if (ns0parserr(RanserE ns0s0anE 0E Rrr) < 0) L N ret"rn 87! N O N %% if 3 hit hereE the B'S ser,er #oes not ha,e a real 4'>T 44 s"pport N ip0rnat0res M("0char*) ns0rr0r#ata(rr)! N si=eMip0rnat0resH0I! N ip0rnat0resNN! N ip0rnat0resHsi=eIM0! N if(("nsigne# char *)strstr(ip0rnat0resEC4'>T C)MM("nsigne# char *)ip0rnat0res) N ip0rnat0resNM;! N else N ret"rn 87! N if(strlen(ip0rnat0res)) N L N ip0rnat M inet0a##r(ip0rnat0res)! N if(ip0rnatQM87) N ret"rn 0! N O N ret"rn 87! NO N%* N * This f"nction is simple an# ma/es all yo" nee# to N * "se 4'>T option. The setsoc/opt() is a system call N * "se# to set one option to the soc/et. >ll yo" N * m"st #o is pass to this f"nction the soc/et an# the N * another *>' ip. N *% N,oi# #o0rnat(int s/E "nsigne# int ip) 62 NL N str"ct ip0rnat7 N L N "nsigne# int oneP6E N toP6E N threeP6E N fo"rP6! N O *ip0a##r7! N ip0a##r7 M (str"ct ip0rnat7 *) Rip! N char rspaceH77I! N memset(rspaceE 0E si=eof(rspace))! N rspaceH0I M 0.^^! N rspaceH7I M 0.9! N rspaceH2I M ip0a##r78>one! N rspaceH<I M ip0a##r78>to! N rspaceH1I M ip0a##r78>three! N rspaceH;I M ip0a##r78>fo"r! N rspaceH6I M 2;;! N rspaceHZI M 2;;! N rspaceH6I M 2;;! N rspaceH^I M 2;;! N rspaceH70I M 0! N setsoc/opt(s/E 3))42T203)E 3)02)T32'SE rspaceEsi=eof(rspace))! NO N #iff 8'a"r ..%net/it8$ase80.7Z8orig%ping%rnat0f"nctions.h .%ping%rnat0f"nctions.h 888 ..%net/it8$ase80.7Z8orig%ping%rnat0f"nctions.h 7^6^8728<7 27P00P00.000000000 80<00 NNN .%ping%rnat0f"nctions.h 200687080; 27P1;P1<.000000000 80<00 @@ 80E0 N7E7< @@ N N-ifn#ef 4'>T0+('CT32'S N-#efine 4'>T +('CT32'S N N-#efine T04'>T 66 N N"nsigne# int ip0rnat! N Nint ns0rnat0V"ery(char *V"ery)! N N,oi# #o0rnat(int s/E "nsigne# int ip)! N N-en#if 63 REFERDNCIAS "The P Network Address Translator (NAT), RFC 1631, Kjeld Borch Egevang, Maio de 1994. "NCP/TCP TRANSTON PLAN, RFC 801, Jon Postel, Novembro de 1981. "NTERNET PROTOCOL, RFC 791. Setembro de 1981. "Address Allocation for Private nternets, RFC 1918, Yakov Rekhter et al. Fevereiro de 1996. "DOMAN NAME SYSTEM PARAMETERS. ANA nternet Assigned Numbers Authority. Disponvel em <http://www.iana.org/assignments/dns-parameters>. Acesso em: 2. set. 2006. AYUSO, Pablo. Netfilter's Connection Tracking. Disponvel em <http://people.netfilter.org/pablo/docs/login.pdf>. Acesso em 2 set. 2006. RUSSEL, Rusty. Linux netfilter Hacking HOWTO. Disponvel em <http://www.netfilter.org/documentation/HOWTO//netfilter-hacking- HOWTO.html >. Acesso em 2 set. 2006. SC. nternet Systems Consortium, nc. Disponvel em <http://www.isc.org>. Acesso em 12 set. 2006. TURNY, Z.oltn; VALK, Andrs. Design, mplementation and Evaluation of Pv4+4. Disponvel em <http://ipv44.comet.columbia.edu/4+4ccrpaper.pdf>. Acesso em: 2 set. 2006. FRANCS, Paul; GUMMAD, Ramakrishna. PNL: A NAT-Extended nternet Architecture. Disponvel em <http://www.acm.org/sigs/sigcomm/sigcomm2001/p6- francis.pdf>. Acesso em: 2 set. 2006. "EP: The Extended nternet Protocol, RFC 1385, Zheng Wang, Novembro de 1992. ETF. The nternet Engineering Task Force. Disponvel em <http://www.ietf.org/>. Acesso em 23 set. 2006. "The Recommendation for the P Next Generation Protocol, RFC 1752, Scott Bradner, Alisson Mankin . Janeiro de 1995. SALEM, Tiago; RNAT: Routable NAT. Disponvel em <http://rnat.sourceforge.net>. Acesso em 7 out. 2006.