Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 6 Feb 2010 00:47:01 +0000
From:      Peter Maxwell <peter@allicient.co.uk>
To:        Maurice <mauduro@gmail.com>, freebsd-pf@freebsd.org
Subject:   Re: using pf to NAT with only one NIC
Message-ID:  <7731938b1002051647y78be2d0dq56ac8f3c39d993e@mail.gmail.com>
In-Reply-To: <d3e0b6a01002051453o377d6e45p3b3991552f37310c@mail.gmail.com>
References:  <d3e0b6a01002051453o377d6e45p3b3991552f37310c@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi Maurice,

Yes, you can do it without much difficulty and I've got my server
setup in that manner: there's about twenty separate jails that can
access the internet via specific NAT rules and incoming services
handled via RDR rules.  Note: you won't be able to ping from a jail,
unless you want to allow your jailed processes to create raw sockets
(you don't) :-)

There's probably many ways it can be done, but what I did was something lik=
e:


i) create a second loopback interface, lo1 (c.f. cloned interfaces)
and assign appropriate alias netblocks for your jails on that
interface;


ii) create your pf.conf, set skip on lo0 but not the external or lo1 interf=
ace;


iii) I'd set "set state-policy if-bound" so you know what's going on;


iv) don't use the antispoof keyword, it will make a mess in this situation;


v) setting up bind to handle local dns resolution is a good idea -
point your jails towards this and you'll need to add in an appropriate
rule(s) later on;


vi) setup outgoing nat rules, e.g.

nat on $ext_if inet from $int_ip_smtp to ! $int_lo1_if:network port
smtp -> $ext_ip


vii) setup incoming services, e.g.

rdr on $ext_if proto tcp from any to $ext_ip port smtp -> $int_ip_mail port=
 smtp


viii) put in pass rules to allow nat out and rdr in; remember NAT is
done first, so your outgoing packets ALL have source IP of the
external IP now and not the jail IP

pass out log on $ext_if proto tcp from $ext_ip to any port smtp flags
S/SA modulate state
pass in log on $ext_if proto tcp from any to $int_ip_mail port smtp
flags S/SA modulate state


ix) allow jail implicit access to itself

pass log on $int_lo1_if proto { udp, tcp } from $int_ip_mail to
$int_ip_mail flags S/SA keep state


x) add in rules to allow any interjail communication as needed
(remember the incoming/outgoing packets appear the other way round
here - use tcpdump to check if in doubt)


If you have any problems, run tcpdump in a serarate terminal window to
determine what's going on.


Peter






On 5 February 2010 22:53, Maurice <mauduro@gmail.com> wrote:
> Hi,
>
> I have been looking for a couple days now, with no luck, for some directi=
on
> as to whether I can successfully configure my freebsd to NAT with only on=
e
> NIC. =A0This is because I am setting up my system to jail my webserver, a=
nd I
> don't think I can get it to work without NATting it. If you have an
> alternate solution that would be great too. This is what my pf.conf looks
> like right now:
>
>
> # =A0 =A0 =A0 $FreeBSD: src/share/examples/pf/pf.conf,v 1.1.2.1.6.1 2009/=
04/15
> 03:14:26 kensmith Exp $
> # =A0 =A0 =A0 $OpenBSD: pf.conf,v 1.34 2007/02/24 19:30:59 millert Exp $
> #
> # See pf.conf(5) and /usr/share/examples/pf for syntax and examples.
> # Remember to set net.inet.ip.forwarding=3D1 and/or net.inet6.ip6.forward=
ing=3D1
> # in /etc/sysctl.conf if packets are to be forwarded between interfaces.
>
> block in all
> block out all
>
> ext_if=3D"fxp0"
> #int_if=3D"int0"
> all_if=3D"{fxp0, lo0}"
>
> #Internal network subnet
> int_net=3D"10.0.0.0/32"
>
> #name and IP of webserver
> APACHE=3D"10.0.0.1"
>
> #table <spamd-white> persist
>
> set skip on lo
>
> scrub in
>
> #nat-anchor "ftp-proxy/*"
> #rdr-anchor "ftp-proxy/*"
> #nat on $ext_if from !($ext_if) -> ($ext_if:0)
> #rdr pass on $int_if proto tcp to port ftp -> 127.0.0.1 port 8021
> #no rdr on $ext_if proto tcp from <spamd-white> to any port smtp
> #rdr pass on $ext_if proto tcp from any to any port smtp \
> # =A0 =A0 =A0 -> 127.0.0.1 port spamd
>
> #anchor "ftp-proxy/*"
> #pass out
>
> #pass quick on $int_if no state
> #antispoof quick for { lo $int_if }
> block in quick from urpf-failed
>
> pass in on $ext_if proto tcp to ($ext_if) port ssh synproxy state
> rdr on $all_if proto tcp from any to fxp0 port 80 -> $APACHE port 80
> nat on $ext_if from $APACHE to any -> fxp0
>
> #pass in log on $ext_if proto tcp to ($ext_if) port smtp
> #pass out log on $ext_if proto tcp from ($ext_if) to port smtp
>
> That doesn't seem to be doing the trick, since I can't ping and DNS won't
> resolve anything from within the jail (APACHE). I am going off some examp=
les
> I found that would seem to suggest it is possible with only one NIC, but =
I
> can't seem to get it to work. Any help/advice would be greatly appreciate=
d.
>
> thanks,
>
> Maurice
> _______________________________________________
> freebsd-pf@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-pf
> To unsubscribe, send any mail to "freebsd-pf-unsubscribe@freebsd.org"
>



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