NAT (compartilhamento de conexão com a Internet) alternando entre várias interfaces públicas

7

Meu laptop Ubuntu 12.04 (preciso) tem três interfaces de rede:

  1. eth0 : interface conectada às vezes conectada à Internet
  2. wlan0 : interface sem fio às vezes conectada à Internet
  3. vboxnet0 : interface com fio (na verdade, uma interface virtual do VirtualBox) conectada a outro computador (na verdade, uma máquina virtual do VirtualBox com rede no modo somente host)

Eu gostaria de usar iptables para configurar o mascaramento de NAT / IP para compartilhar qualquer conexão com a Internet (preferindo o com fio se ambos estiverem ativos) com o outro computador.

O seguinte funciona quando eth0 está conectado:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward &&
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE &&
sudo iptables -A FORWARD -i eth0 -o vboxnet0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT &&
sudo iptables -A FORWARD -i vboxnet0 -o eth0 -j ACCEPT

Se eu alternar de com fio para sem fio, isso obviamente pára de funcionar.

Eu tentei:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward &&
sudo iptables -t nat -A POSTROUTING -o '!vboxnet0' -j MASQUERADE &&
sudo iptables -A FORWARD -i '!vboxnet0' -o vboxnet0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT &&
sudo iptables -A FORWARD -i vboxnet0 -o '!vboxnet0' -j ACCEPT

mas não funcionou. Eu poderia tentar fazer alguns scripts do Network Manager para mudar as regras de iptables sempre que uma interface fosse para cima ou para baixo, mas imaginei que seria possível sem passar por tais aros.

Alguma sugestão?

    
por Richard Hansen 16.05.2012 / 23:19

1 resposta

4

Simples

Aqui está um conjunto de regras iptables muito simples que mascara tudo. Este funciona para muitas configurações mais simples. Não funcionará se a caixa estiver funcionando como um roteador completo - ela tem um hábito potencialmente desagradável de ativar o tráfego all que sai do seu computador.

iptables -A POSTROUTING -o eth+ -t nat -j MASQUERADE
iptables -A POSTROUTING -o wlan+ -t nat -j MASQUERADE

Completa

Se a solução simples não funcionar ou se sua configuração for mais complexa, esse conjunto de regras poderá ajudar:

NATIF='vboxnet+'
MARK=1
iptables -A PREROUTING -t mangle -i $NATIF -j MARK --set-mark $MARK
iptables -A POSTROUTING -o eth+ -t nat -m mark --mark $MARK -j MASQUERADE
iptables -A POSTROUTING -o wlan+ -t nat -m mark --mark $MARK -j MASQUERADE

Marca os pacotes que chegam através de qualquer interface vboxnet* , e depois, mascara (SNAT) qualquer pacote saindo de eth* ou wlan* com o conjunto de marcações.

Também…

Além das regras iptables , você precisará transformar seu computador host em um roteador, ativando o encaminhamento de pacotes. Coloque:

net.ipv4.ip_forward=1

em /etc/sysctl.conf , depois diga

sudo sysctl -p /etc/sysctl.conf.

Alternativamente:

echo 1 | sudo tee /proc/sys/net/ipv4_ip_forward

O convidado também deve ter uma rota padrão que faça o gateways enviar pacotes através das interfaces externas do host (e, para isso, as chances são do modo somente host não funcionarão). Verifique sua tabela de roteamento (isso depende do sistema operacional convidado).

Além disso, instale wireshark ou tshark e use-os para examinar os pacotes. Não há melhor maneira de resolver problemas genéricos de rede como este.

Pessoalmente, sugiro alterar o convidado para usar o modo de rede em ponte e disponibilizar para ele ambas as interfaces do host. Em seguida, ele pode se conectar sozinho, usando o serviço DHCP no roteador para obter um endereço local por conta própria. Nenhum NAT necessário.

    
por 17.05.2012 / 10:58