Invia traffico su diverse interfacce in base alla porta di destinazione


23

La mia domanda è sostanzialmente la stessa di Consentire solo un certo traffico in uscita su determinate interfacce .

Ho due interfacce eth1(10.0.0.2) e wlan0(192.168.0.2). Il mio percorso predefinito è per eth1. Diciamo che voglio che tutto il traffico https passi wlan0. Ora, se utilizzo la soluzione suggerita nell'altra domanda, il traffico https passerà wlan0, ma avrà comunque l'indirizzo di origine di eth1(10.0.0.2). Poiché questo indirizzo non è instradabile per il wlan0gateway, le risposte non torneranno mai più. Il modo più semplice sarebbe semplicemente impostare correttamente il bind-addr nell'applicazione, ma in questo caso non è applicabile.

Immagino di dover riscrivere src-addr:

# first mark it so that iproute can route it through wlan0
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

Ora tcpdump vede bene i pacchetti in uscita e i pacchetti in arrivo arrivano per 192.168.0.2, tuttavia probabilmente non finiscono mai nell'applicazione, perché tutto ciò che vedo è che l'applicazione sta rinviando il pacchetto SYN, sebbene SYN- ACK era già stato ricevuto.

Quindi ho pensato che forse avrei bisogno di riscrivere anche l'indirizzo in arrivo:

iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2

ma neanche quello ha funzionato. Quindi sono un po 'bloccato qui. Eventuali suggerimenti?

Risposte:


24

Sei vicino

Il vero motivo per cui l'applicazione non sta vedendo il traffico di ritorno è a causa della protezione da spoofing IP integrata nel kernel. Vale a dire, il traffico di ritorno non corrisponde alla tabella di routing e pertanto viene eliminato. È possibile risolvere questo problema disattivando la protezione da spoofing in questo modo:

sudo sysctl net.ipv4.conf.wlan0.rp_filter=0

Ma non lo consiglierei. Il modo più corretto è creare un'istanza di routing alternativa.

  1. Il marchio è necessario Tienilo.
  2. È necessario anche il NAT di origine.
  3. Il DNAT finale non è necessario, quindi è possibile rimuoverlo.

Assicurati di avere iprouteinstallato il pacchetto. Se hai il ipcomando, allora sei impostato (come sembra, ma se non lo ottieni prima).

Modifica /etc/iproute2/rt_tablese aggiungi una nuova tabella aggiungendo la seguente riga:

200 wlan-route

È quindi necessario configurare la nuova tabella di routing denominata wlan-routecon un gateway predefinito e creare regole per inviare il traffico a quella tabella in modo condizionale. Presumo che il gateway predefinito sia 192.168.0.1. Naturalmente questo deve corrispondere alla tua rete reale, e non solo ai miei presupposti.

ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route

Lo script annotato finale sarebbe simile al seguente:

# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

Grazie per aver dedicato del tempo per esaminare questo. Tuttavia, questo è già quello che stavo usando (come descritto nell'altra domanda), quindi ho impostato il percorso aggiuntivo, ma è sempre lo stesso. I SYN-ACK tornano a 192.168.0.2 ma a quanto pare non raggiungono mai l'applicazione.
rumpel,

Torna indietro e leggi di nuovo la mia risposta. L'ho affrontato.
bahamat,

La parte sulla protezione da spoofing? Nessun cambiamento anche dopo aver provato. Mi dispiace, leggilo avanti e indietro un paio di volte, ma non ho ancora capito cosa mi sto perdendo.
rumpel,

È necessario aggiungere srcun'opzione ai ip routecomandi per specificare l'indirizzo di origine corretto.
David Schwartz,

@DavidSchwartz: se POSTROUTING SNATne occuperà.
bahamat,

8

la soluzione di bahamat è corretta; tuttavia, tieni presente che l'unico modo per farlo funzionare era disabilitare rp_filter per ogni interfaccia del sistema, non solo i due (eth1 e wlan0 in questo caso) coinvolti nel NATing.

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush

(vedi la nota IMPORTANTE alla fine di questa pagina: Howto routing avanzato - il link pubblicato lì non esiste più, ma l'ho trovato attraverso la macchina di ritorno)


Grazie per questa risposta, anche io ho potuto far funzionare la soluzione bahamats solo considerando la tua risposta.
Dynalon,

per me su un box Ubuntu 12.04 LTS abbastanza standard, oltre a disabilitare rp_filter e svuotare la cache delle rotte ho anche dovuto eliminare il nome dell'interfaccia dagli argomenti di iptables. non ha avuto abbastanza tempo per indagare sul perché.
Costin Gușă,

0

Un suggerimento: dovresti sempre usare --sportinvece che --dportnella catena di output.

I NAT cambiano dporte ciò renderà la tua regola inammissibile.


2
C'è qualcosa che non sto ricevendo? Il dport, come nella porta di destinazione, non può cambiare. È la porta del servizio che la sessione sta cercando di raggiungere, ad esempio http, ssh, smtp. O hai confuso lo sport e il dport, o mi manca qualcosa di ovvio. : P
Qualcuno il

0

Penso che di seguito sia necessario:

ip ru add from 192.168.0.2 table 3 prio 300
ip ro add table 3 default via 192.168.0.1 dev wlan0
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.