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

4

Eu usei o seguinte guia para configurar o meu pi de framboesa como um ponto de acesso:

Raspberry Pi 3 como ponto de acesso wi-fi

Estou encaminhando wlan0 para eth0 e NATing todo o meu tráfego. Funciona muito 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, desejo configurar as mesmas regras, exceto usar a interface tun0-00 e encaminhar todo meu tráfego por meio do meu túnel VPN. Eu quero enviar tudo isso, não quero nada vazando 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 estas regras do iptables não estão completas ... O problema é que eth0 fica em cima; a regra original para encaminhar tráfego para eth0 ainda existe.

Eu quero enviar todo o meu tráfego pelo túnel se o túnel estiver aberto; se não, estou bem com isso usando eth0 .

Atualização:

Usou 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 da 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 muito bem e reflete um IP público diferente. Os clientes ainda mostram o pi como seu gateway, mas eles não podem se conectar mais.

Solução

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

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

Então os comandos apropriados do iptables eram:

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!

    
por Shrout1 18.05.2016 / 00:27

2 respostas

8

Você precisará dos dois conjuntos de regras em iptables . Os dois conjuntos de regras garantem que o tráfego que sai pelas interfaces especificadas seja adequadamente mascarado. Aqui está a 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 está faltando é o roteamento. Se o túnel está em alta, você quer "todo" o tráfego de saída para usá-lo. Caso contrário, use a rota normal.

Isso é tratado no OpenVPN usando o parâmetro redirect-gateway def1 em seu configuração do cliente.

    
por 18.05.2016 / 01:09
1

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 a opção -D :

iptables -t filter -D FORWARD 1

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

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

isso inseriria uma nova regra no início de uma tabela, então ela será consultada em um primeiro turno.

Editar:

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

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

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

E sim, você precisa configurar o roteamento de políticas para encaminhar seu wlan de tráfego não para o gateway padrão que provavelmente pode ser acessado pela interface ethernet , mas pela interface vpn .

    
por 18.05.2016 / 00:48