Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 12 Aug 2010 10:39:53 +0200 (CEST)
From:      Oliver Fromme <olli@lurza.secnetix.de>
To:        freebsd-questions@FreeBSD.ORG, Matthew Seaman <m.seaman@infracaninophile.co.uk>, Fbsd8 <fbsd8@a1poweruser.com>, Brice ERRANDONEA <berrandonea@yahoo.fr>,  "Randal L. Schwartz" <merlyn@stonehenge.com>
Subject:   Re: How to connect a jail to the web ?
Message-ID:  <201008120839.o7C8drvm073516@lurza.secnetix.de>
In-Reply-To: <AANLkTi=k_t0iFoL4M1KyRKmc8OzQ9501tVLH=T5eqdyC@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
David Allen <the.real.david.allen@gmail.com> wrote:
 > I've read comments in the past about setting up jails using local
 > loopback addresses, but I'm wondering if you wouldn't mind elaborating
 > on what the actual pf rules would look like.
 > 
 > Say you have 3 jails and more than one public IP address:
 > 
 >   ns    127.0.0.2   public_ip_1
 >   mail  127.0.0.3   public_ip_2
 >   www   127.0.0.4   public_ip_3
 > 
 > You want to pass port 25 traffic to/from the 'mail' jail.  But you also
 > need that jail to use the correct public_ip address.  Is that possible
 > without using, for example, pf's binat?

Just for completeness, this is a little "how-to" that
describes how you do it with IPFW.  You do not have to
configure NAT.  One single fwd rule is sufficient.
The following example works on FreeBSD 8.1.

In this example, I'll use port 42, the jail has address
127.0.0.2 on lo0, and nc (netcat) is used in place of a
real daemon.  The real (external) address of the host
machine is 10.5.5.5.

HOST# is the prompt of the server machine that hosts the
jail, JAIL# is the prompt within that host machine's
jail, and CLIENT$ is the prompt of a separate physical
machine on the same network which is used for testing
purposes.

First add an alias IP to the lo0 (localnet) interface.

    HOST# ifconfig lo0 inet 127.0.0.2/32 alias

In order to make that permament, you have to add an
alias line to /etc/rc.conf, of course:

    ifconfig_lo0_alias0="inet 127.0.0.2/32"

Check the addresses:

    HOST# ifconfig lo0 | grep -w inet
            inet 127.0.0.1 netmask 0xff000000 
            inet 127.0.0.2 netmask 0xffffffff 

Install the IPFW fwd rule:

    HOST# ipfw add 1 fwd 127.0.0.2 tcp from any to 10.5.5.5 42
    00001 fwd 127.0.0.2 tcp from any to 10.5.5.5 dst-port 42

To make that permanent, add these lines to /etc/rc.conf:

    firewall_enable="YES"
    firewall_type="/etc/ipfw.conf"

And create a file /etc/ipfw.conf containing these lines:

    -f flush
    add fwd 127.0.0.2 tcp from any to 10.5.5.5 42

Ok, now start the jail.  For the sake of this example,
we simply re-use the host's installed base, i.e. the
jail's root path is "/".  For a real jail you would
use the jail's root directory, of course.

    HOST# jail / testjail 127.0.0.2 /bin/sh -E

Finally start a netcat (nc) process in the jail.
In a real jail, this would be an apache process on
port 80, a mail transfer agent on port 25, whatever.

    JAIL# nc -ln 42

Now the netcat process is listening on port 42 inside
the jail on the localnet address 127.0.0.2.  You can
verify that with sockstat(1) on the host:

    HOST# sockstat | grep -w 42
    root     nc         1953  3  tcp4   127.0.0.2:42          *:*

You can now connect to that "service" from a different
system on the network, using the external IP address
of the host.  The IPFW fwd rule reroutes the packets
destined for port 42 to the jail's localnet address.

    CLIENT$ echo Hello world | nc 10.5.5.5 42

As a result, netcat will echo the string "Hello world"
in the jail, and the nc process will terminate.

Note:  In order to be able to use IPFW fwd rules, you
should have these two lines in your kernel config:

    options    IPFIREWALL
    options    IPFIREWALL_FORWARD

If you don't intend to use IPFW for anything else than
fwd, you can also include the following line, so you
don't have to install any additional "allow" rules:

    options    IPFIREWALL_DEFAULT_TO_ACCEPT

That's especially useful if you want to use IPFW for
forwarding only, and use another software for actual
packet filtering (i.e. pf or ipf).

Best regards
   Oliver

-- 
Oliver Fromme, secnetix GmbH & Co. KG, Marktplatz 29, 85567 Grafing b. M.
Handelsregister: Registergericht Muenchen, HRA 74606,  Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsregister: Registergericht Mün-
chen, HRB 125758,  Geschäftsführer: Maik Bachmann, Olaf Erb, Ralf Gebhart

FreeBSD-Dienstleistungen, -Produkte und mehr:  http://www.secnetix.de/bsd

"With sufficient thrust, pigs fly just fine.  However, this
is not necessarily a good idea.  It is hard to be sure where
they are going to land, and it could be dangerous sitting
under them as they fly overhead." -- RFC 1925



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008120839.o7C8drvm073516>