
Tenho dúvidas sobre o fluxo de pacotes IP para o seguinte cenário.
O cenário é:
- Uma interface tun0 (10.0.0.2/8) e uma placa LAN sem fio física wlan0 (endereço IP não corrigido) no lado do cliente, wlan0 pode se conectar à Internet,
- Outra interface tun0 (10.0.0.1/8) e uma placa Ethernet física eth0 (192.168.1.38/24) no lado do servidor (Ubuntu 12.04 amd64), eth0 está em uma rede privada atrás de um firewall NAT e pode se conectar à Internet através o firewall (firewall como gateway),
- executei "
echo 1 > /proc/sys/net/ipv4/ip_forward
" no lado do servidor, - executei "
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
" no lado do servidor,
Aqui está o diagrama do cenário:
--------------- ----------------
| | | |
| client tun0 |----------| client wlan0 |
| 10.0.0.2 | | ip not fix |
| | | |
--------------- ----------------
|
|
internet
|
|
----------------
| |
| firewall |
| (gateway) |
| 192.168.1.1 |
| |
----------------
|
| private network
| 192.168.1.0/24
|
--------------- ----------------
| | | |
| server tun0 |----------| server eth0 |
| 10.0.0.2 | | 192.168.1.38 |
| | | |
--------------- ----------------
Eu usei dois programas cliente/servidor muito simples, semelhantes a VPN, para ler/escrever pacotes IP das duas interfaces tun0 e criar um túnel entre wlan0 e eth0, para que os pacotes IP de 10.0.0.2 possam chegar a 10.0.0.1 e vice-versa ( por exemplo, pode executar FTP de 10.0.0.1 a 10.0.0.2).
No entanto, se eu quiser usar o cliente tun0 (10.0.0.2) para navegar em páginas da web, a solicitação http seria originada em 10.0.0.2 e destinada a um endereço IP da Internet (certamente não 10.0.0.1). A solicitação http, (eu acho) depois de atingir o servidor tun0 (10.0.0.1), seria então encaminhada para o servidor eth0 (já que ip_forward está ativado, e acho que essa solicitação http encaminhada ainda teria um endereço IP de origem 10.0.0.2, corrija-me se eu estiver errado) e lá o NAT ocorre para reembalar a solicitação http como proveniente de eth0 (ou seja, o endereço IP de origem muda para 192.168.1.38, pois executei o comando iptables) e então a solicitação http reembalada passa pelo firewall (e depois a internet) até o seu destino.
Quando a resposta http (do site) chegar ao servidor eth0, o NAT reverso deverá ocorrer lá. Minha pergunta é :
- o NAT reverso reverteria o endereço IP de destino da resposta http para 10.0.0.2,
- como o servidor eth0 sabe para onde encaminhar a resposta http com NAT reverso?
- a eth0 encaminharia a resposta http para o servidor tun0 (10.0.0.1), já que o endereço IP de destino da resposta tem NAT reverso como 10.0.0.2?
- preciso adicionar uma rota no lado do servidor para roteamento/encaminhamento adequado da resposta http com NAT reverso? se sim, como?
- preciso adicionar algumas regras de iptables no lado do servidor para roteamento/encaminhamento adequado da resposta http com NAT reverso? se sim, como?
Responder1
Supondo que seu cliente envie todo o tráfego através do tun0, você precisa adicionar o seguinte no lado do servidor (depois de ativar /proc/sys/net/ipv4/ip_forward):
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
Após esta etapa, quando você navegar nas páginas da web do seu cliente, o seguinte será o fluxo de pacotes:
- O cliente enviará o pacote para 10.0.0.1.
- No lado do servidor, o pacote recebido em tun0 será traduzido de 10.0.0.2 para 192.168.1.38.
- Uma entrada de mapeamento será criada na tabela NAT.
- O pacote será enviado para internet via 192.168.1.1 (gateway).
- A resposta será recebida em 192.168.1.38.
- O NAT reverso ocorrerá de acordo com a entrada de mapeamento criada na etapa 3.
- O pacote de resposta será roteado de volta para 10.0.0.2.
Espero não estar perdendo nenhum passo importante :)