[gelöst] Debian Lenny/Xen/iptables NAT

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
Benutzeravatar
#Frosty#
Beiträge: 10
Registriert: 24.10.2005 09:40:14

[gelöst] Debian Lenny/Xen/iptables NAT

Beitrag von #Frosty# » 31.07.2009 18:30:46

Hallo,

folgendes System ist die Basis:
- Installation Debian Lenny 64 Bit mit Xen auf einem Rootserver

Installation ist soweit eingerichtet und läuft auch einwandfrei.
Die zusätzlichen IPs sind auf der dom0 mit diesem Script http://wiki.hetzner.de/index.php/Zus%C3 ... sen_Debian angelegt.

Auf der dom0 ist eine Bridge angelegt mit dem Namen "br1"

Xen selbst läuft mit dem bridge Script, alle VMs werden mit der internen bridge ("br1") verbunden und bekommen eine Private IP aus dem Bereich 172.16.0.0/24.

die Öffentlichen IPs die auf der dom0 eingerichtet sind werden per Mapped IP (iptables SNAT und DNAT) zu der jeweiligen internen IPs verbunden.

Dies funktioniert soweit auch super die VMs sind unter den jeweiligen Öffentlichen IPs erreichbar und können auch nach aussen kommunizieren.

Nun mein Problem, es ist möglich aus VM1 (debian lenny) die externe IP von VM2 (debian lenny) anzupingen. Wenn man aber nun von VM1 eine Verbindung auf Port 25 zu der externen IP von VM2 aufbauen möchte erhält man folgende Meldung:

Code: Alles auswählen

mx1:~# telnet Externe IP VM2 25
Trying IPVM2... 
telnet: Unable to connect to remote host: Connection refused
könnt ihr mir hier einen Tip geben was verhindert das VM1 eine Verbindung zu VM2 aufbauen kann?

die Regeln für iptabels zum SNAT und DNAT wurden mit folgenden befehlen angelegt:

Code: Alles auswählen

iptables -t nat -A PREROUTING -i eth0 -d externeip -j DNAT --to-destination interneip

Code: Alles auswählen

iptables -t nat -A POSTROUTING -s interneip -o eth0 -j SNAT --to-source externeip
/proc/sys/net/ipv4/ip_forward steht natürlich auf 1 ;-)

Hier noch auszüg aus den IPTABLES TABELLEN

Code: Alles auswählen

xen0:~# iptables -L --line-numbers
Chain INPUT (policy ACCEPT) num  target     prot opt source            destination  

Chain FORWARD (policy ACCEPT) num  target     prot opt source               destination 
1    ACCEPT     all  --  anywhere             anywhere            PHYSDEV match --physdev-in vif19.0 
2    ACCEPT     all  --  anywhere             anywhere            PHYSDEV match --physdev-in vif20.0  

Chain OUTPUT (policy ACCEPT) num  target     prot opt source               destination

Code: Alles auswählen

xen0:~# iptables -t nat -L --line-numbers
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    DNAT       all  --  anywhere             vm2      to:172.16.0.90
2    DNAT       all  --  anywhere             vm1     to:172.16.0.81

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    SNAT       all  --  172.16.0.90          anywhere            to:188.40.x.x
2    SNAT       all  --  172.16.0.81          anywhere            to:188.40.x.x

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
Vielen Dank schonmal für eure Antworten.

#Frosty#
Zuletzt geändert von #Frosty# am 02.08.2009 12:54:01, insgesamt 1-mal geändert.

Benutzeravatar
DynaBlaster
Beiträge: 958
Registriert: 25.03.2004 18:18:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: DF0://dynablaster.adf

Re: Debian Lenny/Xen/iptables NAT

Beitrag von DynaBlaster » 31.07.2009 19:31:54

Hi,

1. Bei deinem 1. iptables-Auszug verstehe ich nicht, warum du die beiden FORWARD-Regeln mit dem "PHYSDEV --match..." drin hast. Deine Default-Policy für die FORWARD-Chain steht eh auf ACCEPT - demnach sollten die beiden Regeln eigentlich unnötig sein. Diese Dinger kommen mir allerdings irgendwie von meinen XEN-und-iptables-Experimenten bekannt vor - kann mich nur nicht mehr erinnern.

2. Das Problem, warum die VM's sich untereinander nicht errichen können, liegt vermutlich an fehlenden SNAT/DNAT-Regeln für br1.

Code: Alles auswählen

iptables -t nat -A PREROUTING -i eth0 -d externeip -j DNAT --to-destination interneip
Diese Regel behandelt nur Pakete, die über eth0 reinkommen. Aber die Pakete, die von vm1 an vm2 geschickt werden sollen, kommen auf der Bridge br1 an. Und verlassen diese dann auch wieder über die br1. eth0 spielt also kein Rolle. Das die Pings auf die zusätzlichen IP's klappen ist zwar logisch, aber irreführend. Nicht die hintergeschalteten VM's beantworten die Ping-Anfragen, sondern die Debian-Dom0, auf der diese IP's an eth0 gebunden sind.

Ich würde testweise mal das "-i eth0" bzw. "-o eth0" aus den entsprechenden DNAT/SNAT-Regeln rausnehmen oder zusätzlichen Regeln mit "-i br1" und "-o br1" hinzufügen. Zu den FORWARD-Regeln mit dem PHYSDEV-Gedöns kann ich wie gesagt nicht so viel sagen. Wenn die notwendig sein sollten, könnte es auch notwendig sein, darüberhinaus auch was mit "br1" in dieser Chain "forzuwarden" <-- was für ein überzeugend eingedeutschtes Verb ;-)

Benutzeravatar
#Frosty#
Beiträge: 10
Registriert: 24.10.2005 09:40:14

Re: Debian Lenny/Xen/iptables NAT

Beitrag von #Frosty# » 02.08.2009 13:10:31

Hallo DynaBlaster,
DynaBlaster hat geschrieben:
1. Bei deinem 1. iptables-Auszug verstehe ich nicht, warum du die beiden FORWARD-Regeln mit dem "PHYSDEV --match..." drin hast. Deine Default-Policy für die FORWARD-Chain steht eh auf ACCEPT - demnach sollten die beiden Regeln eigentlich unnötig sein. Diese Dinger kommen mir allerdings irgendwie von meinen XEN-und-iptables-Experimenten bekannt vor - kann mich nur nicht mehr erinnern.
Ja DynaBlaster diese Regeln werden bei dem Starten einer VM unter XEN automatisch eingetragen, bitte also nicht wundern :wink:
DynaBlaster hat geschrieben: 2. Das Problem, warum die VM's sich untereinander nicht errichen können, liegt vermutlich an fehlenden SNAT/DNAT-Regeln für br1.

Code: Alles auswählen

iptables -t nat -A PREROUTING -i eth0 -d externeip -j DNAT --to-destination interneip
Diese Regel behandelt nur Pakete, die über eth0 reinkommen. Aber die Pakete, die von vm1 an vm2 geschickt werden sollen, kommen auf der Bridge br1 an. Und verlassen diese dann auch wieder über die br1. eth0 spielt also kein Rolle. Das die Pings auf die zusätzlichen IP's klappen ist zwar logisch, aber irreführend. Nicht die hintergeschalteten VM's beantworten die Ping-Anfragen, sondern die Debian-Dom0, auf der diese IP's an eth0 gebunden sind.

Ich würde testweise mal das "-i eth0" bzw. "-o eth0" aus den entsprechenden DNAT/SNAT-Regeln rausnehmen oder zusätzlichen Regeln mit "-i br1" und "-o br1" hinzufügen. Zu den FORWARD-Regeln mit dem PHYSDEV-Gedöns kann ich wie gesagt nicht so viel sagen. Wenn die notwendig sein sollten, könnte es auch notwendig sein, darüberhinaus auch was mit "br1" in dieser Chain "forzuwarden" <-- was für ein überzeugend eingedeutschtes Verb ;-)
Dieser Tip war genau das was mir noch gefehlt hat, ich hatte bei der Überlegung vollkommen vergessen das ich bei dem Anlegen der Regeln immer das Interface eth0 angegeben habe und dies natürlich bedeutet das Pakete die über die interne Bridge br1 gehen nicht davon betroffen sind.

Diese Regeln mal eben nachgeschoben und nun funktioniert auch die Kommunikation zwischen den VMs über die externen IP´s:

Code: Alles auswählen

iptables -t nat -A PREROUTING -i br1 -d externeip -j DNAT --to-destination interneip
iptables -t nat -A POSTROUTING -s internip -o br1 -j SNAT --to-source externip

An dieser Stelle nochmals vielen Dank an DynaBlaster für die schnelle Antwort :) .

So long

#Frosty#

Antworten