GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:traffico di output su interfacce diverse in base alla porta di destinazione?

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.

  1. Il segno è necessario. Tienilo.
  2. È necessario anche il NAT di origine.
  3. 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

Linux
  1. Linux – Porta seriale Raspberrypi?

  2. Linux:diversi formati di file oggetto in Linux?

  3. Linux – I diversi kernel Linux/unix sono intercambiabili?

  4. Controlla l'uso della porta in Linux

  5. tee Esempi di comandi in Linux

Come eseguire una scansione delle porte in Linux

Come installare e utilizzare l'analizzatore del traffico di rete Linux basato sul Web di Darkstat

Come eseguire il ping di un numero di porta in Linux

Spiegazione del reindirizzamento di input e output su Linux

Esempi di comandi echo Linux

Apertura di una porta su Linux