iptables - marca e direciona certos pacotes

2

Relevante para esta referência link

Eu quero marcar os pacotes enviados para uma certa porta (80 para simplificar) e encaminhá-los para o tun0 (que é criado pelo openvpn).

Marque os pacotes que wlan0 envia para a porta 80 com 1

$ iptables -A PREROUTING -i wlan0 -t mangle -p tcp --dport 80 -j MARK --set-mark 1

Adicione mytable

$ echo 201 mytable >> /etc/iproute2/rt_tables

Adicione a regra de que todos os pacotes marcados com 1 são roteados por mytable

$ ip rule add fwmark 1 table mytable

Adicione as regras que dizem que qualquer pacote enviado para toda a Internet é roteado por tun0

$ ip route add 128.0.0.0/1 via 10.8.0.13 dev tun0 table mytable
$ ip route add 0.0.0.0/1 via 10.8.0.13 dev tun0 table mytable

Ante não faz nada

Algumas coisas que vale a pena mencionar

1) Quando eu inicio o openvpn ele adiciona um monte de rotas para a tabela main, que faz com que todo pacote seja roteado através do tun0. Ifconfig mostra tun0 com inet 10.8.0.14 mas todas as rotas adicionadas pelo OpenVPN são para 10.8.0.13. O OpenVPN também adiciona a rota

10.8.0.13 dev tun0  proto kernel  scope link  src 10.8.0.14

Se eu rodar o OpenVPN com --route-nopull e criar as rotas sozinho, mas para 10.8.0.14 ele terá o mesmo efeito, não faço ideia enquanto o OpenVPN faz isso com 10.8.0.13.

2) Todas as rotas que eu adiciono à tabela principal funcionam bem. O problema deve ser que o iptables não está marcando os pacotes ou que as regras do ip não estão enviando os pacotes do mercado para a tabela correta. Muito estranho.

Saída das minhas configurações atuais:

$ ip route list table mytable
0.0.0.0/1 via 10.8.0.13 dev tun0 
10.8.0.13 dev tun0  proto kernel  scope link  src 10.8.0.14 
128.0.0.0/1 via 10.8.0.13 dev tun0 

$ ip rule ls
0:  from all lookup local 
32765:  from all fwmark 0x1 lookup mytable 
32766:  from all lookup main 
32767:  from all lookup default 

$ sudo iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
MARK       tcp  --  anywhere             anywhere             tcp dpt:http MARK set 0x1

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Obviamente, nenhum pacote está sendo marcado.

Antes eu estava usando o iptables para filtrar os pacotes wlan0 para a porta 80. Mudei isso para qualquer interface para as portas 80, todas, 443,22

$ sudo iptables -L -v -t mangle
Chain PREROUTING (policy ACCEPT 10341 packets, 15M bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MARK       tcp  --  any    any     anywhere             anywhere             tcp dpt:http MARK set 0x1
27110   39M MARK       tcp  --  any    any     anywhere             anywhere             MARK set 0x1
    0     0 MARK       tcp  --  any    any     anywhere             anywhere             tcp dpt:https MARK set 0x1
    0     0 MARK       tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh MARK set 0x1

Observe que 39 M de pacotes foram capturados pelo iptables, mas nenhum correspondeu à regra para as portas 80, 443 ou 22, embora eu tenha acessado serviços em todas essas portas. Muito estranho.

Iptables começou a marcar pacotes quando eu mudei --dport para o --sport mas ainda assim nada aconteceu. Eu sei que as regras de ip são aplicadas em ordem, portanto, se as rotas em mytable não funcionarem, os pacotes serão roteados pela tabela main. Eu pensei que poderia haver um problema com as pesquisas de DNS, mas eu configurei os servidores de nomes do resolv.conf para o DNS do Google e nada mudou.

Existe uma maneira de ver meu ip externo usando a linha de comando e sem uma pesquisa de DNS? Eu estava usando

$ curl 141.101.127.36 | grep "Your IP address"

E retirar os dados da página de erro do cloudflare dns, mas provavelmente há uma maneira mais oficial.

    
por beardedlinuxgeek 13.11.2012 / 16:22

0 respostas