La mia domanda è sostanzialmente la stessa di Consenti solo un determinato 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 attraverso wlan0
.
Ora, se utilizzo la soluzione suggerita nell'altra domanda, il traffico https passerà attraverso wlan0
, ma avrà ancora l'indirizzo sorgente di eth1
(10.0.0.2). Poiché questo indirizzo non è instradabile per il wlan0
gateway, le risposte non torneranno mai. 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 entrata arrivano per 192.168.0.2, tuttavia probabilmente non finiscono mai nell'applicazione, perché tutto ciò che riesco a vedere è che l'applicazione sta inviando nuovamente il pacchetto SYN, sebbene il SYN- ACK è già stato ricevuto.
Quindi ho pensato, forse devo 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. Qualche suggerimento?
Risposta accettata:
Sei vicino.
Il vero motivo per cui l'applicazione non vede il traffico di ritorno è a causa della protezione da spoofing IP integrata nel kernel. Cioè, il traffico di ritorno non corrisponde alla tabella di instradamento e quindi viene eliminato. Puoi risolvere il problema disattivando la protezione contro lo 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.
- Il segno è necessario. Tienilo.
- È necessario anche il NAT di origine.
- Il DNAT finale non è necessario, quindi puoi rimuoverlo.
Assicurati di avere iproute
pacchetto installato. Se hai il ip
comando, allora sei impostato (cosa che sembra che tu faccia, ma se non lo ottieni prima).
Modifica /etc/iproute2/rt_tables
e aggiungi una nuova tabella aggiungendo la seguente riga:
200 wlan-route
È quindi necessario configurare la nuova tabella di routing denominata wlan-route
con un gateway predefinito e creare regole per inviare condizionalmente il traffico a quella tabella. Presumo che il tuo gateway predefinito sia 192.168.0.1. Naturalmente questo deve corrispondere alla tua rete attuale e non solo alle mie ipotesi.
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route
Il tuo script annotato finale sarebbe simile a questo:
# 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