FreeBSD Jails mit NAT betreiben
Möchte man auf einem FreeBSD System mehrere Jails betreiben, ohne jedoch weitere öffentlichen IP-Adressen zur Verfügung zu haben, können die Jails an das Loopback-Interface gebunden werden und mit Hilfe der pf-Firewall ein NAT für die Jails erstellt werden. Dazu muss auf dem Hostsystem in der /etc/rc.conf die pf-Firewall und das IP-Forwarding aktiviert und die Jail entsprechend konfiguriert sein. Im folgenden Beispiel wird die Jail mit der IP 127.0.0.10 an die Schnittstelle lo0 gebunden:
pf_enable="YES gateway_enable="YES" ifconfig_lo0_alias0="inet 127.0.0.10 netmask 255.255.255.255" jail_enable="YES" jail_list="test" jail_test_rootdir="/usr/jails/test.chruetertee.ch" jail_test_hostname="test.chruetertee.ch" jail_test_ip="127.0.0.10" jail_test_exec="/bin/sh /etc/rc" jail_test_devfs_enable="YES" jail_test_devfs_ruleset="devfsrules_jail"
Danach muss das IP-Forwarding auf dem Hostsystem aktiviert werden:
# sysctl net.inet.ip.forwarding=1 net.inet.ip.forwarding: 0 -> 1
Nun kann die pf-Konfiguration so ergänzt werden, dass gewisse UDP und/oder TCP-Ports der Jail von aussen erreichbar sind und die Jail per NAT nach aussen zugreifen kann. Im folgenden Beispiel wird der Zugriff mit UDP auf Port 53 und mit TCP auf Port 53 und 465 von aussen (Schnittstelle bge0) zugelassen:
ext_if="bge0" testjail_tcp = "{ 53, 465 }" testjail_udp = "{ 53 }" testjail = 127.0.0.10 set skip on lo0 rdr pass on $ext_if proto tcp from any to $ext_if port $testjail_tcp -> $testjail rdr pass on $ext_if proto udp from any to $ext_if port $testjail_udp -> $testjail nat on $ext_if proto {tcp udp} from $testjail to any -> ($ext_if) [...] (weitere pf-Konfiguration des Hostsystemes)
Danach muss die neue pf-Konfiguration geladen werden:
# pfctl -f /etc/pf.conf
Nun kann in der /etc/rc.conf der Jail als Default-Gateway die IP-Adresse (in diesem Beispiel die IP-Adresse von bge0) des Hostsystemes angegeben werden:
defaultrouter="<IP-Adresse des Hostsystemes>"
Nun lässt sich aus der Jail via NAT durch die pf-Firewall nach aussen zugreifen.
Comments
Da das NAT-ing auf der selben Kiste stattfindet, ist
sysctl net.inet.ip.forwarding=1
nicht notwendig. Auch das explizite Erstellen eines alias auf dem lo0 sollte obsolet sein
ifconfig_lo0_alias0="inet 127.0.0.10 netmask 255.255.255.255"
statt dessen:
jail_test_interface="lo0"
Sollte eigentlich immer noch funktionieren. Ich wurde per Zufall vor ein paar Wochen das Gleiche schon gefragt. Werd da man nachfragen obs geklappt hat.
Ich hab ein Update von 8.2 auf 9.0 gemacht und konnte von Anfang an nur per Ping auf IP-Adressen aus der Jail netzwerken. UDP/TCP Requests auf verschiedene Ports (25,53,80) waren nicht mehr möglich... hab dann ein We gekämpft und letzten Endes eine IP aus dem LAN konfiguriert.
Mit 8.2 funktionierte es einwandfrei, und zwar wie in der Anleitung beschrieben.
@Sascha ... in die pf.conf gehört jetzt inet für IP V4 rein, da in FreeBSD 9 IP V6 standard ist ( in pf )
nat on $ext_if inet proto {tcp udp icmp} from lo0 to any -> ($ext_if)
das 'inet' hatte ich schon vorher in der NAT-Regel stehen:
nat on fxp0 inet proto { icmp, tcp, udp } from 127.0.0.2/32 to !127.0.0.0/8 -> fxp0:0
@Kai: nur interessehalber, hast du eine Jail über einen Loopback Alias unter 9.0 hinbekommen?
Hi,
ja ... funzt einwandfrei ... hatte nur nicht auf das "inet" geachtet am Anfang.
okay, dann muss ich bei mir noch irgendetwas übersehen haben...
mir fehlt im Augenblick auf, dass dein NAT-Regel etwas anders aufgebaut ist oben im Text...
ich hatte damals einen Thread auf bsd-foren.de eröffnet, trotz -gelöst-Flag habe ich es nicht hinbekommen, auf der zweiten Seite habe ich die Auszüge aus der rc.conf gepostet http://www.bsdforen.de/showpost.php?p=238694&postcount=21
Kannst du einmal schauen, ob ich noch irgendwo abweiche?