iptables & portforwarding in ein privates netz

Gemeinsam ins Internet mit Firewall und Proxy.
Antworten
Blacksheep
Beiträge: 4
Registriert: 29.04.2016 08:30:18

iptables & portforwarding in ein privates netz

Beitrag von Blacksheep » 29.04.2016 08:42:58

Hallo,

ich beschäftige mich zur Zeit mit iptables und folgendes Problem macht mich gerade wahnsinnig:

Auf einem Debian läuft KVM (Hostet einen Windows 2008 R2) und Docker. Docker hat eine Bridge docker0 angelegt die ich mit KVM teile. Der Windows Server kommt einwandfrei ins Netz.
Nun möchte ich bestimmte ankommende Ports auf dem Host mit iptables an den Win2k8R2 Server weiter routen.
Setup:

o eth0 ist ans Netz angeschlossen
o docker0 ist die Bridge die auf das Netz 172.17.0.0/24 zeigt
o Windows hat die IP 172.17.0.100
o Windows kann ohne Probleme ins Netz (browse, ping, ftp usw.)

ifconfig:

Code: Alles auswählen

docker0   Link encap:Ethernet  HWaddr 02:42:6d:4c:63:59
           inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:365500 errors:0 dropped:0 overruns:0 frame:0
           TX packets:487830 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0
           RX bytes:30608447 (29.1 MiB)  TX bytes:2820497169 (2.6 GiB)

 eth0      Link encap:Ethernet  HWaddr 55:55:55:55:55:55
           inet addr:555.55.55.109  Bcast:555.55.55.127  Mask:255.255.255.224
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:178690566 errors:0 dropped:0 overruns:0 frame:0
           TX packets:307543734 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:1000
           RX bytes:86757606262 (80.7 GiB)  TX bytes:128953728252 (120.0 GiB)

 lo        Link encap:Local Loopback
           inet addr:127.0.0.1  Mask:255.0.0.0
           UP LOOPBACK RUNNING  MTU:65536  Metric:1
           RX packets:639846160 errors:0 dropped:0 overruns:0 frame:0
           TX packets:639846160 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0
           RX bytes:177336092518 (165.1 GiB)  TX bytes:177336092518 (165.1 GiB)

 vnet0     Link encap:Ethernet  HWaddr fe:54:00:38:de:57
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:60678 errors:0 dropped:0 overruns:0 frame:0
           TX packets:79867 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:500
           RX bytes:7488594 (7.1 MiB)  TX bytes:78071872 (74.4 MiB)

Route

Code: Alles auswählen

Destination     Gateway         Genmask         Flags Metric Ref   Use Iface
0.0.0.0         555.55.55.97    0.0.0.0         UG    0      0        0 eth0
555.55.55.96    555.55.55.97    255.255.255.224 UG    0      0        0 eth0
555.55.55.96    0.0.0.0         255.255.255.224 U     0      0        0 eth0
555.55.55.97    0.0.0.0         255.255.255.255 UH    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0

Ich hab ein kleines Script geschrieben was mir die entsprechenden Regeln bauen soll:

Code: Alles auswählen

#!/bin/bash
INT_IFACE=eth0
EXT_IFACE=docker0
INT_IP="172.17.0.100"
PORT_FORW_TCP="2344 2345"
PORT_FORW_UDP="2312 2123 2124 2125"

# Set SNAT rule
echo "iptables -t nat -A POSTROUTING -o $EXT_IFACE -j SNAT --to-source=$INT_IP"

# Loop over TCP & UDP Ports

for i in $PORT_FORW_TCP; do
    echo "iptables -t nat -I PREROUTING -i $INT_IFACE -p tcp --dport $i -j DNAT --to-destination $INT_IP:$i"
    echo "iptables -A FORWARD -i $INT_IFACE -o $EXT_IFACE -d $INT_IP -p tcp --dport $i -j ACCEPT"
done
for i in $PORT_FORW_UDP; do
    echo "iptables -t nat -I PREROUTING -i $INT_IFACE -p udp --dport $i -j DNAT --to-destination $INT_IP:$i"
    echo "iptables -A FORWARD -i $INT_IFACE -o $EXT_IFACE -d $INT_IP -p udp --dport $i -j ACCEPT"
done
Dieses Script generiert also folgende Befehle:

Code: Alles auswählen

iptables -t nat -A POSTROUTING -o docker0 -j SNAT --to-source=172.17.0.100 iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 2344 -j DNAT --to-destination 172.17.0.100:2344 
iptables -A FORWARD -i eth0 -o docker0 -d 172.17.0.100 -p tcp --dport 2344 -j ACCEPT 
iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 2345 -j DNAT --to-destination 172.17.0.100:2345 
iptables -A FORWARD -i eth0 -o docker0 -d 172.17.0.100 -p tcp --dport 2345 -j ACCEPT 
iptables -t nat -I PREROUTING -i eth0 -p udp --dport 2312 -j DNAT --to-destination 172.17.0.100:2312 
iptables -A FORWARD -i eth0 -o docker0 -d 172.17.0.100 -p udp --dport 2312 -j ACCEPT 
iptables -t nat -I PREROUTING -i eth0 -p udp --dport 2123 -j DNAT --to-destination 172.17.0.100:2123 
iptables -A FORWARD -i eth0 -o docker0 -d 172.17.0.100 -p udp --dport 2123 -j ACCEPT 
iptables -t nat -I PREROUTING -i eth0 -p udp --dport 2124 -j DNAT --to-destination 172.17.0.100:2124 
iptables -A FORWARD -i eth0 -o docker0 -d 172.17.0.100 -p udp --dport 2124 -j ACCEPT 
iptables -t nat -I PREROUTING -i eth0 -p udp --dport 2125 -j DNAT --to-destination 172.17.0.100:2125
iptables -A FORWARD -i eth0 -o docker0 -d 172.17.0.100 -p udp --dport 2125 -j ACCEPT
iptables -L

Code: Alles auswählen

... 
Chain FORWARD (policy DROP) target     prot opt source            destination ... 
ACCEPT     all  --  anywhere             anywhere     ctstate RELATED,ESTABLISHED 
ACCEPT     tcp  --  anywhere  172.17.0.100         tcp dpt:2444 
ACCEPT     udp  --  anywhere             172.17.0.100         udp dpt:2445 
ACCEPT     tcp  --  anywhere             172.17.0.100         tcp dpt:2344 
ACCEPT     tcp  --  anywhere             172.17.0.100         tcp dpt:2345 
ACCEPT     udp  --  anywhere             172.17.0.100         udp dpt:2312 
ACCEPT     udp  --  anywhere             172.17.0.100         udp dpt:2123 
ACCEPT     udp  --  anywhere             172.17.0.100         udp dpt:2124 
ACCEPT     udp  --  anywhere             172.17.0.100         udp dpt:2125
...
Warum auch immer, die Clients die an eth ankommen bekommen keine connection zu den Ports am Win2k8R2 Server.

Ich habe dann auch versucht explizit das routing zwischen eth0 und docker0 in beide Richtungen zu erlauben

Code: Alles auswählen

iptables -A FORWARD -i docker0 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 
iptables -A FORWARD -i eth0 -o docker0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-> Kein Erfolg.

Vielleicht kann mir ja von euch jemand sagen was ich hier falsch bache bzw. wie man das richtig macht.

Vielen Dank im voraus!

Gruß
Blacksheep

Benutzeravatar
MSfree
Beiträge: 10776
Registriert: 25.09.2007 19:59:30

Re: iptables & portforwarding in ein privates netz

Beitrag von MSfree » 29.04.2016 09:22:01

Blacksheep hat geschrieben:docker0 ist die Bridge die auf das Netz 172.17.0.0/24
Laß mal sehen, was brctl show ausgibt.

Blacksheep
Beiträge: 4
Registriert: 29.04.2016 08:30:18

Re: iptables & portforwarding in ein privates netz

Beitrag von Blacksheep » 29.04.2016 09:31:24

Bittesehr:

Code: Alles auswählen

bridge name	bridge id		STP enabled	interfaces
docker0		8000.02426d4c6359	no		vnet0

Benutzeravatar
MSfree
Beiträge: 10776
Registriert: 25.09.2007 19:59:30

Re: iptables & portforwarding in ein privates netz

Beitrag von MSfree » 29.04.2016 09:41:56

Blacksheep hat geschrieben:

Code: Alles auswählen

bridge name	bridge id		STP enabled	interfaces
docker0		8000.02426d4c6359	no		vnet0
Vielleicht solltest du eth0 ebenfalls zur Bridge zufügen.

Blacksheep
Beiträge: 4
Registriert: 29.04.2016 08:30:18

Re: iptables & portforwarding in ein privates netz

Beitrag von Blacksheep » 29.04.2016 09:51:10

Ich reboote dann mal und hoffe das der Server ohne rescue boot wieder ans Netz kommt ;)

Code: Alles auswählen

brctl addif docker0 eth0 
hat den server jedenfalls instant unerreichbar gemacht. Ich kann mir irgendwie auch nicht vorstellen das es das Problem ist:

o Docker container kommen (kamen) ins Netz
o Windows kommt (kamen) ins Netz

Aus meiner Sicht muss es mit dem forwarding zu tun haben

Edit: Nach einem Reset ist der server wieder online

Benutzeravatar
MSfree
Beiträge: 10776
Registriert: 25.09.2007 19:59:30

Re: iptables & portforwarding in ein privates netz

Beitrag von MSfree » 29.04.2016 11:14:34

Blacksheep hat geschrieben:hat den server jedenfalls instant unerreichbar gemacht.
Ups, mein Fehler. Ich hatte die paranoid unkenntlich gemachte IP-Adresse von eth0 übersehen und daraus gefolgert, daß eth0 gar nicht konfiguriert ist.

Ich bin mir gerade nicht ganz sicher, ob deine "iptables -A FORWARD"-Regeln nicht "iptables -A OUTPUT"-Reglen sein müßten.

Wenn du fogendes ans Ende deines Scripts einbaust, kannst du die verworfenen Pakete im Systemlog (journalctl) verfolgen:

Code: Alles auswählen

iptable -A OUTPUT  -m limit --limit 100/minute -j LOG --log-level info --log-prefix "outgoing: "
iptable -A OUTPUT  -j DROP
iptable -A INPUT   -m limit --limit 100/minute -j LOG --log-level info --log-prefix "incoming: "
iptable -A INPUT   -j DROP
iptable -A FORWARD -m limit --limit 100/minute -j LOG --log-level info --log-prefix "forward: "
iptable -A FORWARD -j DROP
Das hilft mir jedenfalls immer, wenn ich nicht genau weiß, welche Regeln zu erstellen sind.

Blacksheep
Beiträge: 4
Registriert: 29.04.2016 08:30:18

Re: iptables & portforwarding in ein privates netz

Beitrag von Blacksheep » 29.04.2016 12:14:24

Danke für den Tipp. Habe ich gleich eingebaut.

Leider sehe ich im log nichts spannendes. Vom Host werden einige Anfragen auf Port 27019 z.B. an Verisign verworfen. Von docker0 oder vnet0 werden nur die netbios anfragen auf Port 137/138 gedroppt. Die Interessanten Ports sind im Log nicht zu finden. Ich werde das heute abend mal weiter testen.

Antworten