it-swarm.it

Rispondi sulla stessa interfaccia di incoming?

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?

54
Shawn J. Goff
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.

64
Peter

I seguenti comandi creano una tabella di routing alternativa tramite eth1 per i pacchetti che hanno il segno 1 (tranne i pacchetti per localhost). Il comando ip proviene dalla suite iproute2 (Ubuntu: iprouteInstalla iproute http://bit.ly/software-small =, iproute-docInstalla 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 usa iptables -t mangle -A OUTPUT … -j MARK --set-mark 1 su questi pacchetti per farli instradare attraverso la tabella di routing 1. Penso che dovrebbe essere eseguito 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.

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
5
Héctor Sánchez

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 non ha funzionato, nelle versioni successive di RH/CentOS devi anche scegliere una delle due opzioni:

  • Non utilizzare l'impostazione predefinita NetworkManager.service; 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 le 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
3
zaTricky