[OpenBSD]

[Anterior: Filtragem de Pacotes] [Conteúdo] [Próximo: Redirecionamento de Tráfego ("Port Forwarding")]

PF: Tradução do Endereço de Rede (NAT)


Conteúdo


Introdução

A Tradução do Endereço de Rede (NAT - "Network Address Translation") é uma forma de mapear toda uma rede (ou redes) para apenas um endereço IP. NAT é necessária quando o número de endereços IP atribuídos a você pelo seu Provedor de Serviços de Internet é menor que o número total de computadores para os quais você quer prover acesso à Internet. NAT está descrita na RFC 1631, "The IP Network Address Translator (NAT)".

NAT permite que você faça uso dos blocos de endereços reservados descritos na RFC 1918, "Address Allocation for Private Internets". Tipicamente, sua rede interna é configurada com endereços IP de um ou mais desses blocos de redes. São eles:

	10.0.0.0/8       (10.0.0.0 - 10.255.255.255)
	172.16.0.0/12    (172.16.0.0 - 172.31.255.255)
	192.168.0.0/16   (192.168.0.0 - 192.168.255.255)

Um sistema OpenBSD fazendo NAT deve ter ao menos dois adaptadores de rede, um para a Internet e outro para a rede interna. A NAT traduz as requisições da rede interna de forma que elas pareçam se originar do sistema OpenBSD fazendo NAT.

Como Funciona a NAT

Quando um cliente na rede interna procura uma máquina na Internet, ele envia pacotes IP destinados a essa máquina. Esses pacotes contêm toda a informação de endereçamento necessária para chegar a seu destino. Informação pertinente à NAT:

Quando o pacote passa pelo gateway NAT, ele é alterado para que pareça ter sido originado no próprio gateway. O gateway NAT registra então as alterações feitas por ele em sua tabela de estados para que ele possa a) reverter as alterações nos pacotes que retornam e b) certificar-se de que os pacotes que retornam cruzem o firewall sem serem bloqueados. Por exemplo, as seguintes alterações devem ser feitas:

Nem a máquina interna nem a máquina na Internet percebem esse trabalho de tradução. Para a máquina interna, o sistema de NAT é simplesmente um gateway de Internet. Para a máquina na Internet, os pacotes parecem vir diretamente do sistema NAT; ele nem mesmo suspeita da existência da estação de trabalho interna.

Quando a máquina na Internet responde aos pacotes da máquina interna, eles são endereçados ao IP externo do gateway NAT (24.5.0.5) na porta da tradução (53136). O gateway NAT então pesquisa na sua tabela de estados para determinar se os pacotes de resposta correspondem a uma conexão já estabelecida. Uma ocorrência única será encontrada baseando-se na combinação endereço IP/porta, que diz ao PF que os pacotes pertencem à conexão iniciada pela máquina interna 192.168.1.35. O PF então faz as alterações reversas feitas nos pacotes que estabeleceram a conexão e transfere os pacotes de resposta para a máquina interna.

A tradução de pacotes ICMP ocorre de maneira similar, mas sem alteração da porta de origem.

NAT e Filtragem de Pacotes

NOTA: Pacotes traduzidos ainda devem passar pelo sistema de filtragem e serão aceitos ou bloqueados baseando-se nas regras de filtragem definidas. A única exceção à regra se dá quando a palavra-chave pass é usada em uma regra nat. Isso faz com que os pacotes "NATeados" passem direto pelo sistema de filtragem.

Saiba também que, como a tradução ocorre antes da filtragem, o sistema de filtragem enxerga o pacote já traduzido para o endereço IP e porta conforme explicado em Como Funciona a NAT.

IP Forwarding

Como a NAT é quase sempre usada em roteadores e gateways de rede, provavelmente será necessário habilitar o IP forwarding para que pacotes possam trafegar entre as interfaces de rede na máquina OpenBSD. IP forwarding é habilitado usando o mecanismo sysctl(3):

# sysctl net.inet.ip.forwarding=1
# sysctl net.inet6.ip6.forwarding=1 (se estiver usando IPv6)

Para que essa alteração seja permanente, as linhas a seguir devem ser acrescentadas ao arquivo /etc/sysctl.conf:

net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

Essas linhas estão presentes, mas comentadas (prefixadas por #). Remova o # e salve o arquivo. O IP forwarding será habilitado quando a máquina for reinicializada.

Configuração da NAT

A forma geral de regras NAT no arquivo pf.conf se parece com:
nat [pass] [log] on interface [fam_de_end] from end_de_or [port porta_de_or] to \
   end_de_dest [port porta_de_dest] -> end_ext [tipo_de_grupo] [static-port]
nat
A palavra-chave que inicia uma regra NAT.
pass
Faz com que pacotes traduzidos passem direto pelas regras de filtragem.
log
Pacotes que corresponderam são registrados via pflogd(8). Normalmente, apenas o primeiro pacote que corresponde é registrado. Para registrar todos os pacotes que corresponderam, use log (all).
interface
O nome ou grupo da interface de rede onde os pacotes devem ser traduzidos.
fam_de_end
A família de endereços, inet para IPv4 ou inet6 para IPv6. Normalmente o PF pode determinar essa informação com base no(s) endereço(s) de origem/destino.
end_de_or
O endereço de origem (interno) dos pacotes que serão traduzidos. O endereço de origem pode ser especificado como:
porta_de_or
A porta de origem no cabeçalho da Camada 4 do pacote. Portas são especificadas como: A opção port geralmente não é usada em regras nat porque o objetivo geralmente é fazer NAT de todo o tráfego, independente da(s) porta(s) sendo utilizada(s).
end_de_dest
O endereço de destino dos pacotes a serem traduzidos. Ele é especificado da mesma forma que o endereço de origem.
porta_de_dest
A porta de destino no cabeçalho da Camada 4 do pacote. Essa porta é especificada da mesma forma que a porta de origem.
end_ext
O endereço externo (de tradução) do gateway NAT em que os pacotes serão traduzidos. O endereço externo pode ser especificado como:
tipo_de_grupo
Especifica o tipo de grupo de endereços a usar para tradução.
static-port
Informa ao PF para não traduzir a porta de origem em pacotes TCP e UDP.

Isso nos levaria à criação de uma regra básica similar a esta:

nat on tl0 from 192.168.1.0/24 to any -> 24.5.0.5

Essa regra diz para fazer NAT na interface tl0 para quaisquer pacotes vindos de 192.168.1.0/24 e substituir o endereço IP de origem por 24.5.0.5.

Embora a regra acima esteja correta, essa forma de uso não é recomendada. A manutenção pode se tornar difícil, porque caso algum endereço na interface externa ou interna seja alterado, a linha também precisará ser alterada. Faça a comparação com uma linha que facilita um pouco a manutenção (tl0 é externa, dc0 interna):

nat on tl0 from dc0:network to any -> tl0

A vantagem deve ser clara: podemos alterar o endereço IP de qualquer interface sem haver necessidade de se alterar a regra.

Ao especificar um nome de interface para a tradução de endereços como mostrado acima, o endereço IP é determinado no carregamento do pf.conf, e não em tempo real. Caso esteja usando DHCP para configurar sua interface externa, isso pode se tornar um problema. Se o endereço atribuído for alterado, a NAT continua traduzindo pacotes saindo do firewall usando o endereço IP antigo. Isso faz com que as conexões parem de funcionar. Para evitar esse problema, você pode dizer ao PF para atualizar o endereço de tradução automaticamente, colocando o nome da interface entre parêntesis:

nat on tl0 from dc0:network to any -> (tl0)

Esse método funciona para tradução tanto de endereços IPv4 quanto IPv6.

Mapeamento Bidirecional (mapeamento 1:1)

Um mapeamento bidirecional pode ser estabelecido através do uso da regra binat. Uma regra binat estabelece o mapeamento um para um entre um endereço IP interno e um endereço externo. Isso pode ser útil, por exemplo, para disponibilizar um servidor Web na rede interna que possua seu próprio IP externo. As conexões vindas da Internet para esse endereço externo serão traduzidas para o endereço interno e as conexões do servidor Web (como pesquisas DNS) serão traduzidas para o endereço externo. Portas TCP e UDP nunca são alteradas por regras binat como acontece com regras nat.

Exemplo:

web_serv_int = "192.168.1.100"
web_serv_ext = "24.5.0.6"

binat on tl0 from $web_serv_int to any -> $web_serv_ext

Exceções em Regras de Tradução

Exceções às regras de tradução podem ser feitas usando-se a palavra-chave no. Por exemplo, se o exemplo de NAT acima fosse alterado para:
no nat on tl0 from 192.168.1.208 to any
nat on tl0 from 192.168.1.0/24 to any -> 24.2.74.79

Então toda a rede 192.168.1.0/24 teria seus pacotes traduzidos para o endereço externo 24.2.74.79, exceto a máquina 192.168.1.208.

Note que a primeira regra que corresponde vence; se for uma regra no, o pacote não é traduzido. A palavra-chave no também pode ser usada com regras binat e rdr.

Verificação do Status da NAT

O pfctl(8) com a opção -s state é usado para verificar as traduções NAT ativas. Essa opção lista todas as sessões NAT ativas:
   # pfctl -s state
   fxp0 TCP 192.168.1.35:2132 -> 24.5.0.5:53136 -> 65.42.33.245:22 TIME_WAIT:TIME_WAIT
   fxp0 UDP 192.168.1.35:2491 -> 24.5.0.5:60527 -> 24.2.68.33:53   MULTIPLE:SINGLE

Explicações (apenas da primeira linha):

fxp0
Indica a interface a qual o estado está vinculado. A palavra self aparecerá caso o estado seja floating.
TCP
O protocolo usado pela conexão.
192.168.1.35:2132
O endereço IP (192.168.1.35) da máquina na rede interna. A porta de origem (2132) é mostrada após o endereço. Esse também é o endereço substituído no cabeçalho IP.
24.5.0.5:53136
O endereço IP (24.5.0.5) e a porta (53136) no gateway onde os pacotes estão sendo traduzidos.
65.42.33.245:22
O endereço IP (65.42.33.245) e a porta (22) onde a máquina interna está se conectando.
TIME_WAIT:TIME_WAIT
Indica em qual estado o PF acredita que a conexão TCP esteja.

[Anterior: Filtragem de Pacotes] [Conteúdo] [Próximo: Redirecionamento de Tráfego ("Port Forwarding")]


[voltar] www@openbsd.org
$OpenBSD: nat.html,v 1.12 2009/11/16 12:38:13 ajacoutot Exp $