Saída de tráfego em diferentes interfaces com base na porta de destino

23

A minha pergunta é basicamente a mesma que Permitir apenas certos tipos de saída tráfego em determinadas interfaces .

Eu tenho duas interfaces eth1 (10.0.0.2) e wlan0 (192.168.0.2). Minha rota padrão é para eth1 . Digamos que eu queira que todo o tráfego de https passe por wlan0 . Agora, se eu usar a solução sugerida na outra pergunta, o tráfego de https passará de wlan0 , mas ainda terá o endereço de origem de eth1 (10.0.0.2). Como esse endereço não pode ser roteado para o gateway wlan0 , as respostas nunca retornarão. A maneira mais fácil seria simplesmente definir o bind-addr corretamente no aplicativo, mas, neste caso, não é aplicável.

Eu acho que preciso reescrever o src-addr:

# first mark it so that iproute can route it through wlan0
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

Agora o tcpdump vê os pacotes de saída muito bem e pacotes de entrada chegam para 192.168.0.2, no entanto eles provavelmente nunca acabam no aplicativo, porque tudo o que eu vejo é que o aplicativo está reenviando o pacote SYN, embora o SYN-ACK já foi recebido.

Então eu pensei, talvez eu precise reescrever o endereço de entrada também:

iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2

mas isso também não funcionou. Então estou meio preso aqui. Alguma sugestão?

    
por rumpel 20.09.2011 / 13:05

4 respostas

23

Você está perto.

O motivo real pelo qual o aplicativo não está vendo o tráfego de retorno é devido à proteção interna de falsificação de IP do kernel. Ou seja, o tráfego de retorno não corresponde à tabela de roteamento e, portanto, é descartado. Você pode corrigir isso desativando a proteção contra falsificação assim:

sudo sysctl net.ipv4.conf.wlan0.rp_filter=0

Mas eu não recomendaria isso. A maneira mais adequada é criar uma instância de roteamento alternativa.

  1. A marca é necessária. Guarde.
  2. NAT de origem também é necessário.
  3. O DNAT final é desnecessário, então você pode removê-lo.

Verifique se você tem o pacote iproute instalado. Se você tiver o comando ip , então você está definido (o que parece que você faz, mas se não conseguir isso primeiro).

Edite /etc/iproute2/rt_tables e adicione uma nova tabela adicionando a seguinte linha:

200 wlan-route

Em seguida, você precisa configurar sua nova tabela de roteamento denominada wlan-route com um gateway padrão e criar regras para enviar condicionalmente o tráfego para essa tabela. Eu suponho que seu gateway padrão é 192.168.0.1. Naturalmente, isso precisa corresponder à sua rede real, e não apenas às minhas suposições.

ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route

Seu script anotado final ficaria assim:

# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2
    
por 20.09.2011 / 17:35
7

A solução da bahamat está correta; no entanto, observe que a única maneira de fazer isso funcionar é desabilitar o rp_filter para todas as interfaces do sistema, e não apenas os dois (eth1 e wlan0, neste caso) envolvidos no NAT.

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush

(consulte a NOTA IMPORTANTE no final desta página: Guia de Roteamento Avançado - o link postado lá não existe mais, mas eu achei através da máquina de wayback)

    
por 22.02.2012 / 16:42
0

Uma sugestão: você deve sempre usar --sport em vez de --dport na cadeia de saída.

NATs alteram o dport e isso tornará sua regra unguarde.

    
por 24.06.2014 / 11:33
0

Acho que abaixo é necessário:

ip ru add from 192.168.0.2 table 3 prio 300
ip ro add table 3 default via 192.168.0.1 dev wlan0
    
por 24.07.2016 / 08:57