Roteamento de configuração e iptables para conexão VPN nova para redirecionar ** apenas ** as portas 80 e 443

8

Eu tenho uma nova conexão VPN (usando o openvpn) para me permitir rotear algumas restrições do ISP. Enquanto está funcionando bem, está tomando all o tráfego sobre o vpn. Isso está me causando problemas de download (minha conexão com a Internet é muito mais rápida do que a VPN permite) e para acesso remoto. Eu corro um servidor ssh, e tenho um daemon em execução que me permite baixar os downloads via meu telefone.

Eu tenho minha conexão Ethernet existente em eth0 e a nova conexão VPN em tun0.

Acredito que preciso configurar a rota padrão para usar minha conexão eth0 existente na rede 192.168.0.0/24 e configurar o gateway padrão como 192.168.0.1 (meu conhecimento é instável, já que não fiz isso por um número de anos). Se isso estiver correto, então não sei exatamente como fazer isso! Minha tabela de roteamento atual é:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface    MSS   Window irtt
0.0.0.0         10.51.0.169     0.0.0.0         UG    0      0        0 tun0     0     0      0
10.51.0.1       10.51.0.169     255.255.255.255 UGH   0      0        0 tun0     0     0      0
10.51.0.169     0.0.0.0         255.255.255.255 UH    0      0        0 tun0     0     0      0
85.25.147.49    192.168.0.1     255.255.255.255 UGH   0      0        0 eth0     0     0      0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0     0     0      0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0     0     0      0

Depois de consertar o roteamento, acredito que preciso usar o iptables para configurar o pré-layout ou o mascaramento para forçar tudo para a porta de destino 80 ou 443 sobre tun0. Mais uma vez, não sei exatamente como fazer isso!

Tudo o que encontrei na internet está tentando fazer algo muito mais complicado, e tentar separar a madeira das árvores está se mostrando difícil.

Qualquer ajuda seria muito apreciada.

UPDATE

Até agora, das várias fontes, reuni o seguinte:

#!/bin/sh

DEV1=eth0
IP1='ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 192.'
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2='ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.'
GW2='route -n | grep 'UG[ \t]' | awk '{print $2}''

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw 192.168.0.1 eth0

Agora, isso parece estar funcionando. Exceto não é!

As conexões para os sites bloqueados são , conexões não nas portas 80 e 443 são usando a conexão não-VPN.

No entanto as portas 80 e 443 que não são para os sites bloqueados também estão usando a conexão não VPN!

Como o objetivo geral foi alcançado, estou relativamente feliz, mas seria bom saber por que ele não está funcionando corretamente.

Alguma idéia?

Para referência, agora tenho 3 tabelas de roteamento, main, internet e vpn. A lista deles é a seguinte ...

Principal:

default via 192.168.0.1 dev eth0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1 

Internet:

default via 192.168.0.1 dev eth0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1 
192.168.0.1 dev eth0  scope link  src 192.168.0.73

VPN:

default via 10.38.0.205 dev tun0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1
    
por Steve 07.11.2011 / 20:01

2 respostas

4

Então, a maior parte disso está acima, mas a solução completa foi a seguinte:

Edite / etc / iproute2 / rt_tables e adicione duas linhas na parte inferior:

101 internet
102 vpn

Você pode dar a essas tabelas outros nomes que façam mais sentido, apenas sejam consistentes.

Então você precisa criar um script (eu chamei de rt_setup) em /etc/init.d

#!/bin/sh

DEV1=eth0
IP1='ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 192.'
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2='ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.'
GW2='route -n | grep 'UG[ \t]' | awk '{print $2}''

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw 192.168.0.1 eth0

Então, obviamente, associe-o de /etc/rc2.d (eu uso o Ubuntu, o nível de execução pode ser diferente para você). Certifique-se de dar um número S maior do que o link openvpn!

O script faz várias coisas. A parte superior configura as variáveis, com algumas instruções perl e awk usadas para selecionar os endereços IPs e de gateway dinâmicos. A segunda seção limpa as tabelas configuradas no ipruote2 e copia a tabela de roteamento atual para elas. Em seguida, ele cria duas novas rotas e dois gateways padrão para elas, com a VPN passando pela VPN e a Internet passando pela minha rede local.

Não estou convencido de que as próximas 2 linhas sejam necessárias, mas elas permitem o encaminhamento de ip para uso no iptables.

Em seguida, o script cria algumas regras sobre onde procurar tráfego originado no endereço IP relevante e onde procurar se o tráfego está especificamente marcado.

O POSTROUTING e o PREROUTING garantem que o tráfego proveniente de um endereço receba a resposta!

O iptables final PREROUTING é a parte que marca o tráfego e garante que qualquer coisa que vá para as portas 80 ou 443 esteja marcada para usar a Tabela 2 (VPN)

As duas últimas linhas removem o gateway da VPN da tabela de roteamento padrão e adicionam de volta o meu gateway de rede local.

Como está, o processo funciona brilhantemente. A VPN é iniciada quando a máquina é ativada, e esse script é executado alguns segundos depois (posso adicionar uma instrução de suspensão apenas para garantir que a VPN esteja totalmente inicializada antes de executar esse script). Minha conexão de acesso remoto (ssh etc.) funciona muito bem. Minhas conexões fora que não vão às portas 80 ou 443 estão usando minha conexão local, mas todo o tráfego da correia fotorreceptora está indo sobre o VPN, e contornando os controles postos por meu ISP!

Como eu disse no meu comentário sob a minha pergunta, eu nem teria começado a olhar para esta rota sem a sugestão de @anttir. Na parte de trás dessa sugestão, os sites link e link foram muito úteis (mesmo se o código não estiver 100% concluído!)

    
por 09.11.2011 / 10:08
1

O roteamento por protocolo é um pouco complicado. Normalmente, a tabela de roteamento é usada para verificar o gateway de acordo com o IP de destino e usar o gateway padrão openvpn ou 192.168.0.1.

Seria mais fácil configurar, e. Squid HTTP proxy na outra extremidade da VPN e defina o navegador para usar o proxy.

Você não usaria o iptables, pois mudaria o IP de destino da conexão HTTP e não funcionaria.

Você pode criar uma nova tabela de roteamento (/ etc / iproute2 / rt_tables) com a rota padrão definida para o ponto de extremidade VPN, usar iptables fwmark (-j MARK) para marcar todos os pacotes HTTP e usar ip para criar uma regra personalizada para os pacotes marcados para usar a nova tabela de roteamento.

    
por 07.11.2011 / 20:29