Anda di halaman 1dari 71

UNVERSDADE TECNOLOGCA FEDERAL DO PARAN

DEPARTAMENTO ACADMCO DE NFORMTCA DANF


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

static ,oi# 00e.it hi\ac/0e.it(,oi#)
L
*2CF0FA4'!
memcpy(ol#charptrE pr0sa,eE Z)!
('*2CF0FA4'!
O
mo#"le0init(hi\ac/0init)!
mo#"le0e.it(hi\ac/0e.it)!
57
A*DNDICE F
*ATC2 *ARA O SOFTGARE *ING
58
#iff 8'a"r ..%net/it8$ase80.7Z8orig%ping%Ja/efile .%ping%Ja/efile
888 ..%net/it8$ase80.7Z8orig%ping%Ja/efile 2000802801
0ZP<6P<Z.000000000 80200
NNN .%ping%Ja/efile 200687080; 27P1;P21.000000000 80<00
@@ 8<E70 N<E7< @@
incl"#e ..%JC2'+3&
incl"#e ..%J4(*AS

8pingP ping.o
8 Y(CC) Y(*B+*>&S) Y] Y(*39S) 8o Y@
NpingP ping.o rnat0f"nctions.o
N Y(CC) 8o Y@ ping.o rnat0f"nctions.o 8lresol, %"sr%li$%li$resol,.a
Y(*B+*>&S) Y(*39S)

ping.oP ..%,ersion.h pingpac/.h
N Y(CC) 8g 8c ping.c
Nrnat0f"nctions.oP
N Y(CC) 8g 8c rnat0f"nctions.c

installP ping
install 8s 8o root 8mY(S(3BJ2BA) ping Y(3'ST>**422T)Y(422T93'B34)
#iff 8'a"r ..%net/it8$ase80.7Z8orig%ping%ping.c .%ping%ping.c
888 ..%net/it8$ase80.7Z8orig%ping%ping.c 200080Z82< 07P76P27.000000000
80<00
NNN .%ping%ping.c 200687080; 27P1;P21.000000000 80<00
@@ 8Z6E6 NZ6EZ @@
-incl"#e <st#io.h>
-incl"#e <ctype.h>
-incl"#e <errno.h>
N-incl"#e Crnat0f"nctions.hC

%*
* '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.

Anda mungkin juga menyukai