Modifica la route predefinita senza influire sulle connessioni TCP esistenti


3

Supponiamo di avere due indirizzi di rete pubblici sul mio server: un NAT tramite un ISP (192.168.99.0/24) e una VPN tramite un altro ISP (192.168.1.0/24), già configurato con un percorso per host verso il Server VPN tramite il mio ISP.

Ecco la mia tabella di routing iniziale. Attualmente sto instradando attraverso il mio ISP sulla sottorete 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

Ora, voglio nuove connessioni TCP per passare al mio 192.168.1.0/24, quindi scrivo quanto segue:

$ route add -net 0.0.0.0 gw 192.168.1.1 dev tap0

Quando lo faccio, si blocca alcune connessioni TCP di vecchia data. Esiste un modo per modificare in modo sicuro l'interfaccia predefinita per le nuove connessioni, consentendo allo stesso tempo alle connessioni TCP esistenti di utilizzare la vecchia route (ovvero è necessario abilitare una sorta di tabella di routing con stato)?

Sto bene con una soluzione che funziona solo con connessioni TCP stabilite e non mi interessa quanto sia confusa. Ad esempio, se esiste un modo per aggiungere regole iptables temporanee per le connessioni esistenti per forzarle sul vecchio percorso. Ma ci deve essere un modo per farlo.

EDIT: solo una nota su un semplice "route add -host ..." per connessioni esistenti: questa soluzione funzionerebbe se sto bene lasciando un sottoinsieme di IP sulla vecchia interfaccia. Tuttavia, nella mia applicazione, questo in realtà non risolve il mio problema perché voglio consentire a nuove connessioni di entrare nella nuova interfaccia anche se hanno lo stesso IP di origine. Sto ora cercando di utilizzare il comando "ip route" per impostare le regole di routing basate sull'origine.


Dovresti davvero ripararlo correttamente per sempre e utilizzare il routing basato su sorgenti (policy).
David Schwartz,

@DavidSchwartz Cool! Questo è esattamente il tipo di risposta che stavo cercando. Onestamente non sapevo nemmeno che esistesse un concetto del genere: in effetti avrei dovuto guardare "ip route" piuttosto che una semplice "route" - me ne sono completamente dimenticato. Se si risponde formalmente alla domanda con un modo per abilitare il routing basato sull'origine o più specifici sui tipi di comandi ip che potrebbero creare semplici tabelle di routing basate sull'origine, sarei felice di accettare la risposta.
Patrick Horn,

Risposte:


1

Il comando seguente esaminerà le connessioni tcp aperte ed elencherà le destinazioni al di fuori della rete locale:

$ 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

Quindi dobbiamo solo scorrere questo elenco e inserire percorsi specifici verso il router principale prima di modificare il percorso predefinito:

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

(Ho lasciato il comando "echo" lì in modo che tu possa vedere cosa fa, puoi rimuoverlo quando vuoi davvero farlo.

Quindi modifica il percorso predefinito:

$ route add -net 0.0.0.0 gw 192.168.1.1 dev tap0

Poiché i percorsi aggiunti sono più specifici, verranno presi in preferenza rispetto al percorso predefinito. Ovviamente puoi metterlo in uno script per renderlo più semplice.


La soluzione tabella di routing avrebbe funzionato se mi trovo benissimo con lasciando un sottoinsieme di IP sulla vecchia interfaccia. Tuttavia, nella mia applicazione, questo in realtà non risolve il mio problema perché voglio consentire a nuove connessioni di entrare nella nuova interfaccia anche se hanno lo stesso IP di origine. Inoltre, ho posto questa domanda parzialmente perché speravo nella possibilità di un approccio meno rozzo.
Patrick Horn,

@PatrickHorn Vale la pena di modificare la tua domanda per chiarire questo, in quanto altre persone in cerca di aiuto potrebbero non trovare questo commento
Paul
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.