Altere a rota padrão sem afetar as conexões TCP existentes

3

Digamos que eu tenha dois endereços de rede pública no meu servidor: um NAT por meio de um ISP (192.168.99.0/24) e uma VPN por meio de um ISP diferente (192.168.1.0/24), já configurado com um host por host. rota para o servidor VPN através do meu ISP.

Aqui está minha tabela de roteamento inicial. No momento, estou roteando pelo meu provedor na sub-rede 192.168.99.0/24.

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.99.1    0.0.0.0         UG    0      0        0 eth1
55.66.77.88     192.168.99.1    255.255.255.255 UGH   0      0        0 eth1
192.168.99.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 tap0

Agora, quero que novas conexões TCP mudem para o 192.168.1.0/24, então eu digito o seguinte:

$ route add -net 0.0.0.0 gw 192.168.1.1 dev tap0

Quando faço isso, algumas conexões TCP de longa data são interrompidas. Existe uma maneira de alterar com segurança a interface padrão para novas conexões, permitindo que as conexões TCP existentes usem a rota antiga (por exemplo, preciso ativar algum tipo de tabela de roteamento com monitoração de estado)?

Eu estou bem com uma solução que só funciona com conexões TCP estabelecidas, e eu não me importo como hacky é. Por exemplo, se houver uma maneira de adicionar regras temporárias de iptables para conexões existentes para forçá-las pela rota antiga. Mas tem que haver algum jeito de fazer isso.

EDIT: Apenas uma nota sobre um simples "route add -host ..." para conexões existentes: esta solução funcionaria se eu estivesse bem em deixar um subconjunto de IPs na interface antiga. No entanto, no meu aplicativo, isso realmente não resolve meu problema porque quero permitir que novas conexões entrem na nova interface, mesmo que tenham o mesmo IP de origem. Agora estou olhando para usar o comando "ip route" para definir regras de roteamento baseadas na origem.

    
por Patrick Horn 26.11.2012 / 09:31

1 resposta

1

O comando a seguir examinará as conexões tcp abertas e listará os destinos fora da rede local:

$ netstat -4ntu | tail -n +3 | cut -c45-65 | cut -d: -f1 | grep -v '192.168.99' | grep -v '192.168.1'
214.236.220.101
63.171.235.16
174.63.61.132
159.47.216.178
62.59.197.29
139.47.218.150
56.4.17.22
204.63.49.5
155.9.79.196
144.31.207.66

Portanto, precisamos apenas percorrer essa lista e colocar rotas específicas em direção ao roteador principal antes de alterar a rota padrão:

for i in $(netstat -4nt | tail -n +3 | cut -c45-65 | cut -d: -f1 |grep -v '192\.168\.99' | grep -v '192\.168\.1') ; do echo route add -host $i gw 192.168.1.99; done

(Eu deixei o comando "echo" lá para que você possa ver o que ele faz, você pode remover isso quando quiser realmente fazê-lo.

Em seguida, altere sua rota padrão:

$ route add -net 0.0.0.0 gw 192.168.1.1 dev tap0

Como as rotas adicionadas são mais específicas, elas serão escolhidas de preferência para a rota padrão. Obviamente, você pode colocar isso em um script para facilitar.

    
por 26.11.2012 / 10:18