BlogBlog ÜbersichtjailscriptportsoptFreeBSDLinksThermoskanne

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 (8)  Permalink

Comments

Christoph Schug @ 07.01.2009 11:42 UTC
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"
Sascha @ 13.04.2012 11:58 UTC
Kann man eine Jail auch unter FreeBSD 9.0 auf diese Art konfigurieren?
Beat @ 14.04.2012 21:19 UTC
Sollte eigentlich immer noch funktionieren. Ich wurde per Zufall vor ein paar Wochen das Gleiche schon gefragt. Werd da man nachfragen obs geklappt hat.
Sascha @ 15.04.2012 05:16 UTC
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.
Kai @ 24.05.2012 14:16 UTC
@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)
Sascha @ 24.05.2012 14:32 UTC
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?
Kai @ 24.05.2012 14:38 UTC
Hi,

ja ... funzt einwandfrei ... hatte nur nicht auf das "inet" geachtet am Anfang.
Sascha @ 24.05.2012 15:02 UTC
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?
No new comments allowed (anymore) on this post.