iptables - Port Forwarding

Bad Horse

Cadet 4th Year
Registriert
März 2011
Beiträge
65
Hallo,

ich habe derzeit folgendes Setup:

- Server: kvm0; IP: 172.16.101.79, Netz: 172.16.101.0/24
- Server: mcftb; IP: 192.168.100.101; Netz 192.168.100.0/24​
- Server: wiki; IP: 192.168.100.102; Netz 192.168.100.0/24​


Auf dem Server kvm0 ist kvm installiert und Virtualisiert die beiden anderen Server. Alle Server verwenden Debian 6.

Wenn ich auf kvm0 per SSH eingeloggt bin kann ich die server mcftb und wiki pingen und mich auch weiter per SSH auf den Servern einloggen.

Ich will das wenn man eine Verbindung zu 172.16.101.79:25565 aufbaut der kvm0 Server das ganze auf 192.168.100.101:25565 weiterleitet.

Ich habe bis jetzt mich ein bisschen in iptables eingelesen und folgendes probiert.

Code:
kvm0 ~ # cat /proc/sys/net/ipv4/ip_forward
1

Code:
iptables -t nat -A PREROUTING -p tcp -i eth0 -d 172.16.101.79 --dport 25565 -j DNAT --to 192.168.100.101:25565
iptables -A FORWARD -p tcp -i eth0 -d 172.16.101.79 --dport 25565 -j ACCEPT

folgende regeln sind schon vorhanden. Ich glaube die sind dafuer das damit ich vom kvm0 ins 192.168.100.0 Netz komme.
Code:
# Generated by iptables-save v1.4.8 on Sun Dec 16 10:04:49 2012
*nat
:PREROUTING ACCEPT [19:1648]
:POSTROUTING ACCEPT [17:1166]
:OUTPUT ACCEPT [17:1166]
-A POSTROUTING -s 192.168.100.0/24 ! -d 192.168.100.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.100.0/24 ! -d 192.168.100.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.100.0/24 ! -d 192.168.100.0/24 -j MASQUERADE
COMMIT
# Completed on Sun Dec 16 10:04:49 2012
# Generated by iptables-save v1.4.8 on Sun Dec 16 10:04:49 2012
*filter
:INPUT ACCEPT [537:38349]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [456:38003]
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.100.0/24 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.100.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Sun Dec 16 10:04:49 2012

leider glaube ich das ich da komplett falsch liege und weiss nicht mehr weiter..
 
Ich glaub dein Interface heisst nicht eth. Kannst du mal ein
Code:
ip a
brctl show
pasten?

Edit: Und ein
Code:
ip r
. Eventuell kennt dein router das 172er Netz nicht.
 
Zuletzt bearbeitet:
Bad Horse schrieb:
iptables -t nat -A PREROUTING -p tcp -i eth0 -d 172.16.101.79 --dport 25565 -j DNAT --to 192.168.100.101:25565
iptables -A FORWARD -p tcp -i eth0 -d 172.16.101.79 --dport 25565 -j ACCEPT

Gefühlt würde ich sagen, dass du bei der zweiten Regel die schon genattete IP nehmen musst, da PREROUTING afaik vor der FORWARD-Chain bearbeitet wird:
Code:
iptables -A FORWARD -p tcp -i eth0 -d 192.168.100.101 --dport 25565 -j ACCEPT
 
der router kennt das 172.16er netz sicher. hier sind alle andern rechner in dem Netz (keine ahnung wieso..)

172.16.101 /24 ist das netz auf eth0
192.168.100 /24 ist das netz auf virbr0 das die virtuellen machienen verwenden

ich will aber das die leute in der wg auf den minecraft und wiki server nur ueber eine ip zugreifen.
- 172.16.101.79:25565 ist der Minecraft Server - wird das intern weitergeleitet auf 192.168.100.101:25565
- 172.16.101.79:80 ist das Wiki - wird intern weitergeleitet auf 192.168.100.102:8080

wenn ich die weiterleitung auf den Minecraft Server schaffe (ist derzeit auch wichtiger) kann ich das auf den webserver auch selbst machen. hoffe ich zumindest.

Code:
kvm0 ~ # ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:1d:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 172.16.101.79/24 brd 172.16.101.255 scope global eth0
3: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
    link/ether fe:54:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.1/24 brd 192.168.100.255 scope global virbr0

kvm0 ~ # brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.fe5400fe8316       yes             vnet0

kvm0 ~ # ip r
172.16.101.0/24 via 172.16.101.1 dev eth0
172.16.101.0/24 dev eth0  proto kernel  scope link  src 172.16.101.1
192.168.100.0/24 dev virbr0  proto kernel  scope link  src 192.168.100.1
default via 172.16.101.1 dev eth0
ich habe ipv6 und die mac addressen geloescht/unkenntlich gemacht.

@Blutschlumpf: ich glaube diese regel braucht es gar nicht da die "Chain FORWARD (policy ACCEPT)" ist
 
Zuletzt bearbeitet:
Die policy steht auf Accept, aber vorher wird ja der Trafic von und zum bridge-Interface rejected:
Code:
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
 
Du hattest recht. Diese beiden Regeln blockieren den FORWARD.

ich habe jetzt einfach mal beide rausgenommen und es funktioniert.

dankeschoen.
 
Zuletzt bearbeitet:
Moin, ich hoffe Ihr seid mir nicht böse das ich hier auch mal eben schreibe.. Aber ich würde gerne eine einzige Regel bei mir am Server einrichten und hoffe das mir dabei kurz geholfen werden kann :)

Ich möchte gerne, dass Anfragen die über "tun0" und Port 3306 rein kommen, an "lo" und Port 3306 weitergeleitet werden. Und zwar möchte ich gerne von einem anderen System auf die SQL Datenbank zugreifen können, ohne das ich in der my.cnf sagen muss das man von überall auf die Datenbank zugreifen kann.. :)

Kann mir dafür "mal eben" jemand sagen, wie der Syntax aussehen soll?
Ich hatte es erst mit folgender Syntax probiert, aber das funktionierte leider nicht :(
Code:
iptables -A FORWARD -p tcp -i tun0 --sport 3306 -o lo --dport 3306 -j ACCEPT

Gruß, Domi
 
Das liegt daran, dass die passende Regel in der nat-table fehlt, die das Paket verändert. Deine Regel erlaubt ja nur nachher das veränderte Paket.
Sprich zum Natten brauchste etwas a la:

Code:
iptables -t nat -A PREROUTING -p tcp -i tun0 -d x.x.x.x --dport 3306  -j DNAT --to 127.0.0.1:3306

Vermutlich auch was um die Rückrichtung zu verändern, sprich ne MASQUERADE Regel in der POSTROUTING Chain.

Zudem weiß ich nicht ob deine Regel dann überhaupt in die FORWARD Chain muss, ich würde zu INPUT tendieren.

Last but not least weiß ich nicht ob das überhaupt funktioniert, mysql prüft bei der Angabe des Interfaces ja nicht das Destination-Interface sondern das Source-Interface. Und ob du das überhaupt verändern kannst, kann ich dir nicht beantworten.
 
Also mein Plan war eigentlich folgender... In der my.cnf steht ja drin "bind-address 127.0.0.1", und das wollte ich auch bestehen lassen da es sich um einen vServer im Rechenzentrum handelt. Auf einem anderen vServer ist das gleiche Spielchen, aber ich möchte gerne nur von dem einen Server auf die Datenbank des anderen Servers zugreifen.

Und da ich für eine andere Geschichte via OpenVPN eine bestehende Verbindung habe, dachte ich mir einfach das man alle Anfragen die vom VPN Tunnel kommen, einfach an die 127.0.0.1 weiter schicken kann. Natürlich nur für den MySQL Port :D

Was die Regel an sich angeht, habe ich es schon mal geschafft das der eine Server 5 sek benötigt, bis er merkt das er nicht verbinden darf, aber funktionieren tut es noch nicht so wirklich.. mal testen und probieren :D
Code:
iptables -A PREROUTING -t nat -i tun0 -p tcp --dport 3306 -j DNAT --to 127.0.0.1:3306
iptables -A POSTROUTING -t nat -o tun0 -j MASQUERADE
 
Zurück
Oben