Rispondi sulla stessa interfaccia di incoming?


51

Ho un sistema con due interfacce. Entrambe le interfacce sono connesse a Internet. Uno di questi è impostato come route predefinita; un effetto collaterale di ciò è che se un pacchetto arriva sull'interfaccia di route non predefinita, la risposta viene rinviata attraverso l'interfaccia di route predefinita. C'è un modo per usare iptables (o qualcos'altro) per tracciare la connessione e rispedire la risposta attraverso l'interfaccia da cui proviene?

Risposte:


61
echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> dev <interface> table isp2
ip route add default via <gateway_IP> dev <interface> table isp2

Quanto sopra non richiede alcun contrassegno di pacchetto con ipfilter. Funziona perché i pacchetti (risposta) in uscita avranno l'indirizzo IP originariamente utilizzato per connettersi alla seconda interfaccia come indirizzo di origine (da) sul pacchetto in uscita.


7
Wow, questo è esattamente quello che stavo cercando. Nel caso in cui qualcuno stia cercando, per le distribuzioni basate su RH, è possibile inserire la regola pertinente e instradare i comandi nei file denominati 'rule-eth0' o 'route-eth0' (ad esempio) che verranno aggiunti o rimossi su ifup / ifdown. Posiziona questi file accanto al file ifcfg-eth0. Per IPv6, c'è la funzionalità 'route6-eth0' integrata, ma nessuna 'rule6-eth0' integrata (ancora).
Kyle Brantley il

18
Per me ha funzionato solo quando ho lasciato fuori il devparametro nel ip rulecomando, quindi in esecuzioneip rule add from <interface_IP> table isp2
cdauth il

2
Puoi farli creare quando l'interfaccia sale aggiungendo up ip rule add from <interface_IP> table isp2e up ip route add default via <gateway_IP> dev ppp0 table isp2alla tua / etc / network / interfacce sotto l'interfaccia pertinente.
g.rocket,

4
Ho dovuto rimuovere dev <interface>da ip ruleper farlo funzionare sulla mia scatola. Se ho capito bene, dev <interface>stava filtrando i pacchetti che erano in qualche modo impostati sull'interfaccia sbagliata che doveva essere intercettata sull'interfaccia corretta dal percorso ignorato, ma il filtro delle regole dall'interfaccia stava impedendo che ciò accadesse.
binki,

2
Come la maggior parte delle altre persone, ho dovuto rimuovere dev <interface>dal ip rulecomando perché questo funzionasse. Si prega di aggiornare la risposta! Fatta eccezione per quel dettaglio, ha funzionato come un fascino. Grazie mille, @Peter!
MoonSweep,

6

I seguenti comandi creano una tabella di routing alternativa tramite eth1per i pacchetti che hanno il segno 1 (tranne i pacchetti verso localhost). Il ipcomando proviene dalla suite iproute2 (Ubuntu: iproute Installa iproute http://bit.ly/software-small , iproute-doc Installa iproute-doc http://bit.ly/software-small ).

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth1

L'altra metà del lavoro sta riconoscendo i pacchetti che devono ottenere il segno 1; quindi utilizzare iptables -t mangle -A OUTPUT … -j MARK --set-mark 1su questi pacchetti per farli instradare attraverso la tabella di instradamento 1. Penso che dovrebbe essere fatto quanto segue (sostituire 1.2.3.4 con l'indirizzo dell'interfaccia non predefinita-route):

iptables -t mangle -A OUTPUT -m conntrack --ctorigdst 1.2.3.4 -j MARK --set-mark 1

Non sono sicuro che sia abbastanza, forse è necessaria un'altra regola sui pacchetti in arrivo per dire al modulo conntrack di seguirli.


Bello. Ho dimenticato tutto sulla marcatura. Questo dovrebbe portarmi lì.
Shawn J. Goff,

5

Ho avuto problemi con i pacchetti generati localmente con la soluzione suggerita da Peter, ho scoperto che quanto segue corregge questo:

echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 priority 900
ip rule add from dev <interface> table isp2 priority 1000
ip route add default via <gateway_IP> dev <interface> table isp2
ip route add <interface_prefix> dev <interface> proto static scope link src <interface_IP> table isp2

NOTA: è possibile riscontrare problemi di sintassi con la quarta riga sopra. In tali casi la sintassi per il 4o comando potrebbe essere questa ora:

ip rule add iif <interface> table isp2 priority 1000

Ho provato così tanto ma nulla ha funzionato nel mio scenario, tranne questo .. molte grazie.
agaggi,

3

Suppongo che tu stia eseguendo Linux e, inoltre, che tu stia utilizzando una distribuzione basata su RedHat / CentOS. Altri Unix e distribuzioni richiederanno passaggi simili, ma i dettagli saranno diversi.


Inizia test (nota che questo è molto simile alla risposta di @ Peter. Sto assumendo quanto segue:

  • eno0 è isp0 e ha il gateway predefinito complessivo
  • eno1 è isp1 e ha l'IP / range 192.168.1.2/24 con gateway 192.168.1.1

I comandi sono i seguenti:

$ echo 200 isp1 >> /etc/iproute2/rt_tables
$ ip rule add from eno1 table isp1
$ ip route add default via 192.168.1.1 dev eno1 table isp1

Il firewall non è coinvolto in alcun modo. I pacchetti di risposta sarebbero sempre stati inviati dall'IP corretto, ma in precedenza venivano inviati tramite l'interfaccia errata. Ora questi pacchetti dall'IP corretto verranno inviati tramite l'interfaccia corretta.


Supponendo che ciò abbia funzionato, ora puoi rendere permanenti le modifiche alla regola e al percorso. Questo dipende dalla versione di Unix che stai utilizzando. Come prima, presumo una distribuzione Linux basata su RH / CentOS.

$ echo "from eno1 table isp1" > /etc/sysconfig/network-scripts/rule-eno1
$ echo "default via 192.168.1.1 dev eno1 table isp1" > /etc/sysconfig/network-scripts/route-eno1

Verifica che la modifica della rete sia permanente:

$ ifdown eno1 ; ifup eno1

Se ciò non ha funzionato, nelle versioni successive di RH / CentOS devi anche scegliere una delle due opzioni:

  • Non utilizzare il NetworkManager.service predefinito ; Utilizzare invece network.service . Non ho esplorato i passaggi esatti necessari per questo. Immagino che coinvolga i comandi standard chkconfig o systemctl per abilitare / disabilitare i servizi.
  • Installa il pacchetto NetworkManager-dispatcher-routing-rules

Personalmente preferisco installare il pacchetto di regole in quanto è l'approccio più semplice e supportato:

$ yum install NetworkManager-dispatcher-routing-rules

Un'altra forte raccomandazione è quella di abilitare il filtro arp in quanto ciò impedisce altri problemi correlati con configurazioni a doppia rete. Con RH / CentOS, aggiungi il seguente contenuto al file /etc/sysctl.conf:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1
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.