Come DNAT i pacchetti locali

Sep 19 2020

Ho un programma che invia pacchetti UDP a 192.168.0.2:12345, riceve pacchetti sulla porta 54321 e utilizza l'indirizzo IP 192.168.0.1. Voglio che invii pacchetti a 10.10.10.10 con la stessa porta, perché questo programma e il server remoto accettano solo 12345 e 54321. Questo è il topo:

All'inizio utilizzo il prerouting di iptables:

iptables -t nat -A PREROUTING -s 192.168.0.1 -p udp --dport 12345 -j DNAT --to 10.10.10.10:12345

Ma non funziona, ho usato LOG, trovo che il nat non è mai successo (192.168.0.1 e 192.168.0.2 non necessita di routing?):

iptables -t nat -A PREROUTING -s 192.168.0.1 -p udp --dport 12345 -j LOG

Quindi trovo che questi pacchetti possono trovare nella catena INPUT:

iptables -A INPUT -s 192.168.0.1 -p udp --dport 12345 -j LOG

C'è un modo per usare DNAT se solo posso vedere questi pacchetti nell'INPUT?

A proposito, posso usare socat per reindirizzare questi pacchetti, ma non posso bloccare le porte su 12345 e 54321 sul lato server:

socat UDP4-RECVFROM:192.168.0.1,fork UDP4-SENDTO:10.10.10.10:12345
socat UDP4-RECVFROM:10.10.10.10,fork UDP4-SENDTO:192.168.0.1:54321

Alcuni aggiornamenti da parte mia, ora posso usare phydev per i pacchetti nat:

iptables -t nat -A PREROUTING -m physdev --physdev-in tap0 -s 192.168.0.1 -p udp --dport 12345 -j DNAT --to 10.10.10.10:12345

Da tcpdump di eth0, posso vedere i pacchetti da 192.168.0.1 a 10.10.10.10: (192.168.0.1 non può essere utilizzato nella mia rete)

tcpdump -n -i eth0 host 10.10.10.10 
12:36:22.250548 IP 192.168.0.1.54321 > 10.10.10.10.12345: UDP, length 16

Tuttavia, non riesco a vedere questi pacchetti dal server 10.10.10.10 ... Quindi eseguo tcpdump sul server remoto, posso vedere questi pacchetti:

21:55:44.980988 IP 192.168.0.1.54321 > 10.10.10.10.12345: UDP, length 16

Ma 192.168.0.1 non può essere utilizzato nella mia rete di laboratorio, è caduto.

Quindi la cosa rimanente diventa: come DNAT un pacchetto e poi SNAT lo stesso pacchetto ...

Risposte

1 codefarmer Sep 24 2020 at 17:09

Ho risolto questo problema eseguendo il comando

conntrack -F

Dopo tutte le mie regole di iptables. Non è necessario utilizzare --phydev, ma solo le seguenti due regole:

iptables -t nat -A PREROUTING -s 192.168.0.1 -d 192.168.0.2 -p udp --dport 12345 -j DNAT --to 10.10.10.10:12345
iptables -t nat -A POSTROUTING -d 10.10.10.10/24 -o eth0 -j SNAT --to-source 10.10.10.5
Tomek Sep 20 2020 at 16:00

Per eseguire DNAT di pacchetti generati localmente si dovrebbe usare la catena OUTPUT della tabella NAT, non la catena PREROUTING.

La tua regola dovrebbe probabilmente essere:

iptables -t nat -A OUTPUT -s 192.168.0.1 -p udp --dport 12345 -j DNAT --to 10.10.10.10:12345