Roteamento de pacotes de interface Linux tun

Roteamento de pacotes de interface Linux tun

Tenho dúvidas sobre o fluxo de pacotes IP para o seguinte cenário.

O cenário é:

  1. 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,
  2. 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),
  3. executei " echo 1 > /proc/sys/net/ipv4/ip_forward" no lado do servidor,
  4. 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 é :

  1. o NAT reverso reverteria o endereço IP de destino da resposta http para 10.0.0.2,
  2. como o servidor eth0 sabe para onde encaminhar a resposta http com NAT reverso?
  3. 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?
  4. preciso adicionar uma rota no lado do servidor para roteamento/encaminhamento adequado da resposta http com NAT reverso? se sim, como?
  5. 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:

  1. O cliente enviará o pacote para 10.0.0.1.
  2. No lado do servidor, o pacote recebido em tun0 será traduzido de 10.0.0.2 para 192.168.1.38.
  3. Uma entrada de mapeamento será criada na tabela NAT.
  4. O pacote será enviado para internet via 192.168.1.1 (gateway).
  5. A resposta será recebida em 192.168.1.38.
  6. O NAT reverso ocorrerá de acordo com a entrada de mapeamento criada na etapa 3.
  7. O pacote de resposta será roteado de volta para 10.0.0.2.

Espero não estar perdendo nenhum passo importante :)

informação relacionada