Hallo,
folgendes Szenario: Ein Rechner, zwei Netzwerkkarten. Ankommende TCP- Verbidnungen auf den Ports 50000 und 55000 auf enp1s0 (extern, 192.168.1.116) sollen über eno1 (intern, 192.168.0.1) auf ein Netzwerkgerät mit der IP 192.168.0.125 weitergeleitet werden. Das abfragende Gerät kommuniziert quasi mit der IP 192.168.1.116 und der Rechner steckt alles nur durch.
Das sind meine Regeln:
+ /usr/sbin/iptables -A FORWARD -i enp1s0 -o eno1 -p tcp --dport 50000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT + /usr/sbin/iptables -A PREROUTING -t nat -p tcp -d 192.168.1.116 --dport 50000 -m state --state NEW,ESTABLISHED,RELATED -j DNAT --to 192.168.0.125:50000 + /usr/sbin/iptables -A FORWARD -i enp1s0 -o eno1 -p tcp --dport 55000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT + /usr/sbin/iptables -A PREROUTING -t nat -p tcp -d 192.168.1.116 --dport 55000 -m state --state NEW,ESTABLISHED,RELATED -j DNAT --to 192.168.0.125:55000 + /usr/sbin/iptables -A FORWARD -i enp1s0 -o eno1 -m state --state ESTABLISHED,RELATED -j ACCEPT + /usr/sbin/iptables -A FORWARD -i eno1 -o enp1s0 -j ACCEPT + /usr/sbin/iptables -A FORWARD -j LOG + /usr/sbin/iptables -A POSTROUTING -t nat -o enp1s0 -j MASQUERADE
Wenn ich jetzt aber versuche, das zu testen:
nc 192.168.1.116 50000
bekomme ich nur ein "Ncat: Connection refused.". Und das abfragende Gerät bekommt auch keine Daten geliefert. Die notwendigen Module sind geladen. IP Forwarding ist eingeschaltet.
cat /proc/sys/net/ipv4/ip_forward > 1
Mache ich etwas falsch? Habe ich einen Denkfehler?
Gruß, Daniel
Hi,
On 06/03/2021 05:49, Daniel Leidert wrote:
Das sind meine Regeln:
- /usr/sbin/iptables -A FORWARD -i enp1s0 -o eno1 -p tcp --dport 50000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
- /usr/sbin/iptables -A PREROUTING -t nat -p tcp -d 192.168.1.116 --dport 50000 -m state --state NEW,ESTABLISHED,RELATED -j DNAT --to 192.168.0.125:50000
- /usr/sbin/iptables -A FORWARD -i enp1s0 -o eno1 -p tcp --dport 55000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
- /usr/sbin/iptables -A PREROUTING -t nat -p tcp -d 192.168.1.116 --dport 55000 -m state --state NEW,ESTABLISHED,RELATED -j DNAT --to 192.168.0.125:55000
- /usr/sbin/iptables -A FORWARD -i enp1s0 -o eno1 -m state --state ESTABLISHED,RELATED -j ACCEPT
- /usr/sbin/iptables -A FORWARD -i eno1 -o enp1s0 -j ACCEPT
- /usr/sbin/iptables -A FORWARD -j LOG
- /usr/sbin/iptables -A POSTROUTING -t nat -o enp1s0 -j MASQUERADE
Lass die IP mit -d ... weg. Das ist ein unnötiger Filter. Den Filter auf State würde ich im PREROUTING auch weglassen.
Ansonsten sollte das funktionieren - ich hatte mal ähnliche Regeln auf meinem Eigenbaurouter.
Konrad
Am Samstag, dem 06.03.2021 um 07:21 +0100 schrieb Konrad Rosenbaum:
On 06/03/2021 05:49, Daniel Leidert wrote:
Das sind meine Regeln:
[Regeln]
Lass die IP mit -d ... weg. Das ist ein unnötiger Filter. Den Filter auf State würde ich im PREROUTING auch weglassen.
OK. Die beiden Filter machen die Regeln halt spezifischer. Aber selbst wenn ich das weglasse, scheint es nicht zu funktionieren.
Ansonsten sollte das funktionieren - ich hatte mal ähnliche Regeln auf meinem Eigenbaurouter.
Vielleicht habe ich ja einen Denkfehler: Um das lokal zu testen, führe ich auf dem System ein
nc 192.168.1.116 50000
aus. Und da kommt "Ncat: Connection refused.". Mit
traceroute -i enp1s0 -p 50000 192.168.1.116
sehe ich auch keine Weiterleitung im syslog. In iptables:
root:~# iptables -S -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A FORWARD -i enp1s0 -o eno1 -p tcp -m tcp --dport 50000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i enp1s0 -o eno1 -p tcp -m tcp --dport 55000 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i enp1s0 -o eno1 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i eno1 -o enp1s0 -j ACCEPT -A FORWARD -j LOG
root:~# iptables -L -v -n Chain INPUT (policy ACCEPT 655 packets, 49662 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 3 156 ACCEPT tcp -- enp1s0 eno1 0.0.0.0/0 0.0.0.0/0 tcp dpt:50000 state NEW,RELATED,ESTABLISHED 0 0 ACCEPT tcp -- enp1s0 eno1 0.0.0.0/0 0.0.0.0/0 tcp dpt:55000 state NEW,RELATED,ESTABLISHED 0 0 ACCEPT all -- enp1s0 eno1 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT all -- eno1 enp1s0 0.0.0.0/0 0.0.0.0/0 0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 4 Chain OUTPUT (policy ACCEPT 218 packets, 27147 bytes) pkts bytes target prot opt in out source destination
root:~# iptables -t nat -S -P PREROUTING ACCEPT -P INPUT ACCEPT -P OUTPUT ACCEPT -P POSTROUTING ACCEPT -A PREROUTING -d 192.168.1.116/32 -p tcp -m tcp --dport 50000 -m state --state NEW,RELATED,ESTABLISHED -j DNAT --to-destination 192.168.0.125:50000 -A PREROUTING -d 192.168.1.116/32 -p tcp -m tcp --dport 55000 -m state --state NEW,RELATED,ESTABLISHED -j DNAT --to-destination 192.168.0.125:55000 -A POSTROUTING -o enp1s0 -j MASQUERADE
root:~# iptables -L -v -n -t nat Chain PREROUTING (policy ACCEPT 847 packets, 64757 bytes) pkts bytes target prot opt in out source destination 1 52 DNAT tcp -- * * 0.0.0.0/0 192.168.1.116 tcp dpt:50000 state NEW,RELATED,ESTABLISHED to:192.168.0.125:50000 0 0 DNAT tcp -- * * 0.0.0.0/0 192.168.1.116 tcp dpt:55000 state NEW,RELATED,ESTABLISHED to:192.168.0.125:55000 Chain INPUT (policy ACCEPT 158 packets, 21439 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 14 packets, 850 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 11 packets, 652 bytes) pkts bytes target prot opt in out source destination 4 250 MASQUERADE all -- * enp1s0 0.0.0.0/0 0.0.0.0/0
sind auch wirklich nur meine Regeln. Ich bin gerade völlig ratlos. ufw oder ähnliches ist nicht installiert.
Gruß, Daniel
Hallo Daniel,
On Sat, Mar 06, 2021 at 16:37:17 +0100, Daniel Leidert wrote:
Vielleicht habe ich ja einen Denkfehler: Um das lokal zu testen, führe ich auf dem System ein
nc 192.168.1.116 50000
aus. Und da kommt "Ncat: Connection refused."
Du kannst diese Regeln nicht lokal auf dem System testen. Das incoming Interface ist bei Deinem nc-Aufruf nie enp1s0, sondern immer lo.
Du musst schon wirlich Traffic von aussen schicken, der ueber enp1s0 eintrudelt. Das Routing kannst Du nicht verarschen, 192.168.1.116 ist eine lokal erreichbare Adresse und geht deshalb ueber lo.
Wenn Du es *unbedingt* mit einem einzigen System testen willst, brauchst Du ein weiteres physisches Ethernet-Inteface, das Du in einen Network Namespace verschiebst und per Crosskabel mit enp1s0 verbindest. Von dem Namespace aus kannst Du auf 192.168.1.116 zugreifen, ohne dass diese Adresse als lokal angesehen wird.
Gruss, Christian
Hallo,
On Sat, Mar 06, 2021 at 06:22:38PM +0100, Christian Perle wrote:
Wenn Du es *unbedingt* mit einem einzigen System testen willst, brauchst Du ein weiteres physisches Ethernet-Inteface, das Du in einen Network Namespace verschiebst und per Crosskabel mit enp1s0 verbindest. Von dem Namespace aus kannst Du auf 192.168.1.116 zugreifen, ohne dass diese Adresse als lokal angesehen wird.
Man könnte das physikalische Interface in ne Bridge packen, die IP des Interfaces auf die Bridge, ein veth Ende dazu und dann das andere veth Ende in den Namespace verschieben... würde einem das Crosskabel sparen. Wobei Crosscable ist mit GBit Interfaces eh nicht mehr notwending, da tut's nen normals Patchkabel... Bleibt die Frage warum kompliziert, wenn es auch einfach geht ;-)
Grüsse Andreas
Am Samstag, dem 06.03.2021 um 05:49 +0100 schrieb Daniel Leidert:
Hallo,
folgendes Szenario: Ein Rechner, zwei Netzwerkkarten. Ankommende TCP- Verbidnungen auf den Ports 50000 und 55000 auf enp1s0 (extern, 192.168.1.116) sollen über eno1 (intern, 192.168.0.1) auf ein Netzwerkgerät mit der IP 192.168.0.125 weitergeleitet werden. Das abfragende Gerät kommuniziert quasi mit der IP 192.168.1.116 und der Rechner steckt alles nur durch.
Das sind meine Regeln:
Ich habe jetzt auf dem Router in das Netz eine Port-Weiterleitung an den fraglichen Rechner eingerichtet und teste mittels:
sudo traceroute -4 -T -p 50000 <Public-IP>
und ich kann sehen, dass die Anzahl an Paketen in den Regeln hochzählt:
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 288 17208 ACCEPT tcp -- enp1s0 eno1 0.0.0.0/0 0.0.0.0/0 tcp dpt:50000 state NEW,RELATED,ESTABLISHED 0 0 ACCEPT tcp -- enp1s0 eno1 0.0.0.0/0 0.0.0.0/0 tcp dpt:55000 state NEW,RELATED,ESTABLISHED 0 0 ACCEPT all -- enp1s0 eno1 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT all -- eno1 enp1s0 0.0.0.0/0 0.0.0.0/0 0 0 LOG all -- * * 0.0.0.0/0 0.0.0.0/0 LOG flags 0 level 7 prefix "XXXXXX:"
Chain PREROUTING (policy ACCEPT 19078 packets, 1490K bytes) pkts bytes target prot opt in out source destination 274 16416 DNAT tcp -- * * 0.0.0.0/0 192.168.1.116 tcp dpt:50000 state NEW,RELATED,ESTABLISHED to:192.168.0.125:50000 0 0 DNAT tcp -- * * 0.0.0.0/0 192.168.1.116 tcp dpt:55000 state NEW,RELATED,ESTABLISHED to:192.168.0.125:55000
Chain POSTROUTING (policy ACCEPT 515 packets, 30964 bytes) pkts bytes target prot opt in out source destination 20 1717 MASQUERADE all -- * enp1s0 0.0.0.0/0 0.0.0.0/0
Der Rechner (eno1, 192.168.0.1) und das Gerät (192.168.0.125) sind direkt via Crossover-Kabel verbunden (Patchkabel haben wir auch schon probiert). Muss ich hier noch eine Route einrichten? Ich bin langsam echt frustriert.
Ein Ping auf 192.168.0.125 funktioniert. `nc 192.168.0.125 50000` funktioniert auch.
MfG Daniel
Am Samstag, dem 06.03.2021 um 23:54 +0100 schrieb Daniel Leidert:
[..]
Der Rechner (eno1, 192.168.0.1) und das Gerät (192.168.0.125) sind direkt via Crossover-Kabel verbunden (Patchkabel haben wir auch schon probiert). Muss ich hier noch eine Route einrichten? Ich bin langsam echt frustriert.
Ein Ping auf 192.168.0.125 funktioniert. `nc 192.168.0.125 50000` funktioniert auch.
ENDLICH! Mit tcpdump bin ich dem Problem auf die Schliche gekommen. Ich brauchte noch:
iptables -A POSTROUTING -t nat -p tcp -d 192.168.0.125 --dport 50000 -j SNAT --to-source 192.168.0.1 iptables -A POSTROUTING -t nat -p tcp -d 192.168.0.125 --dport 55000 -j SNAT --to-source 192.168.0.1
in meinen Regeln. Und jetzt funktioniert es.
Gruß, Daniel
Hallo Daniel,
On Sun, Mar 07, 2021 at 01:29:29 +0100, Daniel Leidert wrote:
ENDLICH! Mit tcpdump bin ich dem Problem auf die Schliche gekommen. Ich brauchte noch:
iptables -A POSTROUTING -t nat -p tcp -d 192.168.0.125 --dport 50000 -j SNAT --to-source 192.168.0.1 iptables -A POSTROUTING -t nat -p tcp -d 192.168.0.125 --dport 55000 -j SNAT --to-source 192.168.0.1
Dann lag es wirklich am Routing. Anscheinend kennt 192.168.0.125 nur das 192.168.0.0/24-Netz. Wenn Du auf 192.168.0.125 eine Default-Route via 192.168.0.1 eintraegst, kannst Du Dir die SNAT-Regel sparen.
Durch die MASQUERADE-Regel auf 192.168.0.1 hatte ich bisher angenommen, dass 192.168.0.125 eine Default-Route via 192.168.0.1 hat.
Gruss, Christian
Am Sonntag, dem 07.03.2021 um 10:17 +0100 schrieb Christian Perle:
On Sun, Mar 07, 2021 at 01:29:29 +0100, Daniel Leidert wrote:
ENDLICH! Mit tcpdump bin ich dem Problem auf die Schliche gekommen. Ich brauchte noch:
iptables -A POSTROUTING -t nat -p tcp -d 192.168.0.125 --dport 50000 -j SNAT --to-source 192.168.0.1 iptables -A POSTROUTING -t nat -p tcp -d 192.168.0.125 --dport 55000 -j SNAT --to-source 192.168.0.1
Dann lag es wirklich am Routing. Anscheinend kennt 192.168.0.125 nur das 192.168.0.0/24-Netz. Wenn Du auf 192.168.0.125 eine Default-Route via 192.168.0.1 eintraegst, kannst Du Dir die SNAT-Regel sparen.
Hinter der IP verbirgt sich eine "Black Box". Das ist ein vorgefertigtes Messgerät mit Datenports. Da kann ich leider gar nichts einrichten.
Durch die MASQUERADE-Regel auf 192.168.0.1 hatte ich bisher angenommen, dass 192.168.0.125 eine Default-Route via 192.168.0.1 hat.
Das Problem war einserseits, dass ich mit iptables nicht firm bin, und andererseits auch ein Stück weit, dass diese Regeln in der Vergangenheit scheinbar funktioniert haben, wobei ich die Netzwerktopologie nicht kenne, die dabei genutzt wurde. Ich habe gestern einiges dazugelernt :)
Vielleicht hat mal jemand Lust, einen Vortrag über iptables, DNAT, SNAT, etc. zu machen, sobald es die Situation zulässt? Ich wäre sehr interessiert und könnte im Gegenzug etwas über die aktuellen Methoden erzählen, Debian-Pakete mit Git (git-buildpackage) zu erstellen, oder den Salsa CI Service vorzustellen. Oder vielleicht existieren ja auch grundsätzliche Fragen zum Debian-Paketformat.
Gruss,
Christian
Hallo Daniel,
On Sun, Mar 07, 2021 at 19:37:37 +0100, Daniel Leidert wrote:
Dann lag es wirklich am Routing. Anscheinend kennt 192.168.0.125 nur das 192.168.0.0/24-Netz. Wenn Du auf 192.168.0.125 eine Default-Route via 192.168.0.1 eintraegst, kannst Du Dir die SNAT-Regel sparen.
Hinter der IP verbirgt sich eine "Black Box". Das ist ein vorgefertigtes Messgerät mit Datenports. Da kann ich leider gar nichts einrichten.
Naja, die 192.168.0.125 muss das Geraet ja auch irgendwo her bekommen haben, DHCP vermutlich? Mit DHCP laesst sich aber auch eine Defaulroute verteilen.
Vielleicht hat mal jemand Lust, einen Vortrag über iptables, DNAT, SNAT, etc. zu machen, sobald es die Situation zulässt?
Diese Woche Mittwoch (10.3.) ist ja wieder virtuelles lug-dd Treffen in Big Blue Button. Ich kann zwar nichts grossartiges vorbereiten, aber erzaehlen kann ich schon was zu dem Thema.
Gruss, Christian
lug-dd@mailman.schlittermann.de