iptables encaminha o tráfego para o túnel VPN se estiver aberto

iptables encaminha o tráfego para o túnel VPN se estiver aberto

Usei o seguinte guia para configurar meu Raspberry Pi como ponto de acesso:

Raspberry Pi 3 como ponto de acesso wifi

Estou encaminhando wlan0e eth0NAT todo o meu tráfego. Funciona bem!

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT  
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT 

Agora quero configurar as mesmas regras, exceto usar interface tun0-00e encaminhartodosmeu tráfego através do meu túnel VPN. Eu quero enviar tudo isso, não quero que nada vaze para a rede host. Pensando que é algo assim:

sudo iptables -t nat -A POSTROUTING -o tun0-00 -j MASQUERADE
sudo iptables -A FORWARD -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o tun0-00 -j ACCEPT

Infelizmente eu sei que essas regras do iptables não estão completas... O problema é que isso eth0permanece ativo; a regra original para encaminhar o tráfego eth0ainda existe.

Quero enviar todo o meu tráfego através do túnel se o túnel estiver aberto; se não, estou bem usando eth0.

Atualizar:

Usei o sinalizador -I para inserir minhas regras:

sudo iptables -t nat -I POSTROUTING 1 -o tun0-00 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0-00 -j ACCEPT

A cadeia FORWARD:

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  wlan0  tun0-00  0.0.0.0/0            0.0.0.0/0           
2        0     0 ACCEPT     all  --  tun0-00 wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
3        0     0 ACCEPT     all  --  eth0   wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
4        0     0 ACCEPT     all  --  wlan0  eth0    0.0.0.0/0            0.0.0.0/0           
5        0     0 ACCEPT     all  --  wlan1  wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
6        0     0 ACCEPT     all  --  wlan0  wlan1   0.0.0.0/0            0.0.0.0/0           

Ainda sem alegria, o encaminhamento parece não funcionar.

Configuração de VPN do cliente

Eu limpei coisas que pareciam sensíveis:

dev tun
persist-tun
persist-key
cipher AES-256-CBC
auth SHA1
tls-client
client
resolv-retry infinite
remote XXX.XXX.XXX.XXX PORT_NUM udp
lport XXX
verify-x509-name "VPN_Certificate" name
pkcs12 CERT_NAME.p12
tls-auth CERTIFICATE-tls.key 1
ns-cert-type server
redirect-gateway local def1

O pi se conecta perfeitamente e reflete um IP público diferente. Os clientes ainda mostram o pi como gateway, mas não conseguem mais se conectar.

Solução

Primeiro eu precisava adicionar redirect-gateway def1o arquivo .ovpn no pi.

Então eu precisei digitar o nome da minha interface corretamente... Ugh. Me sinto uma louca, mas aparentemente vi tun0-00no começo e foi a única vez que existiu. A interface é na verdade apenas tun0.

Portanto, os comandos apropriados do iptables foram:

sudo iptables -t nat -I POSTROUTING 1 -o tun0 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0 -j ACCEPT

Funciona muito bem agora!

Responder1

Você precisará dos dois conjuntos de regras do iptables. Os dois conjuntos de regras garantem que o tráfego que sai pelas interfaces especificadas seja mascarado adequadamente. Aqui está minha sugestão, que é um pouco mais simples que a sua:

# Masquerade outgoing traffic
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

# Allow return traffic
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Forward everything
iptables -A FORWARD -j ACCEPT

A parte do quebra-cabeça que falta é o roteamento. Se o túnel estiver ativo, você deseja que "todo" o tráfego de saída o utilize. Caso contrário, use a rota normal.

Isso é tratadodentro do OpenVPNusando o redirect-gateway def1parâmetro na configuração do seu cliente.

Responder2

A ferramenta útil é listar as regras existentes com números de linha:

iptables --line-numbers -t filter -L FORWARD

Você pode excluir as regras com -Da opção:

iptables -t filter -D FORWARD 1

Você pode inserir uma nova regra no local especificado com -Ia opção:

iptables -t filter -I FORWARD 0 blah-blah-blah

isso inseriria uma nova regra logo no início de uma tabela, para que ela fosse consultada em um primeiro turno.

Editar:

Geralmente, você precisa apenas de uma regra na FORWARDtabela que corresponda -m state --state RELATED,ESTABLISHED:

-I FORWARD 1 -m state --state RELATED,ESTABLISHED -j ACCEPT

já que o rastreamento de conexão permitiria que todas as conexões já conhecidas fossem roteadas.

E sim, você precisa configurarroteamento de políticapara encaminhar seu wlantráfego não para o gateway padrão que provavelmente é acessível por meio de sua ethernet interface, mas por meio da vpninterface.

informação relacionada