Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Aug 2021 16:31:06 -0500
From:      Valeri Galtsev <galtsev@kicp.uchicago.edu>
To:        FreeBSD Mailing List <freebsd-questions@freebsd.org>
Subject:   Jails: pf blocks access to localhost of host system
Message-ID:  <8f6aa4f4-f361-e6eb-985b-291b7be631e0@kicp.uchicago.edu>

next in thread | raw e-mail | index | archive | help
Dear Experts in pf and jails.

I was recent refugee from to pf from ipfw which I was happily using for 
decade (why is different story). I seem to be able to configure all I 
need from pf, except one thing, which is jail access to localhost of 
host system.

I configure jails "by the book" (i.e FreeBSD handbook), I do not use any 
scripts facilitating simple enough for me process. My jail configuration 
is like the following:

# cat /etc/jail.conf

jailname {
     host.hostname = "hostname.domainname";
     ip4.addr = X.Y.Z.W; # address on public address space
     devfs_ruleset=7;  // integer number of devfsrules_jail_bpf ruleset
                       // in /etc/devfs.rules
     persist;        // Required because there are no processes
     exec.start = "/etc/rc.d/cron start; /etc/rc.d/syslogd start; 
/usr/local/etc/rc.d/apache24 start";
     exec.stop = "/usr/local/etc/rc.d/apache24 stop; /etc/rc.d/syslogd 
stop; /etc/rc.d/cron stop";
}

As you see, there is no lo0 configured in jail. (I do have lo0 
configured in jails on some machines, but I do not feel it necessary in 
this case). Now if script from apache in that jail connects port 25 on 
localhost to send email, the connection goes ho postfix I run on host 
system.

While I was using ipfw having the rule allowing all traffic on lo0 to 
pass (I figure) at the top of rules did the trick. I can not achieve the 
same with pf. Searching on we web didn't help either.

Here if my simplified to necessary minimum for debugging pf.conf:


# cat /etc/pf.conf
##################### BEGIN
# macro name(s) for external interface(s).
ext_if = "bce0"
int_if = "bce1"

services = "{ 80 443 3306 5432 9102 }"

icmp_types = "{ echoreq unreach }"

# set a default deny everything policy.
block all

# Allow all traffic on trusted interfaces
pass quick from { lo0 $int_if } to any keep state

# keep state on any outbound tcp, udp or icmp traffic.
# modulate the isn of
# outgoing packets. (initial sequence number) broken operating systems
# sometimes don’t randomize this number, making it guessable.
pass out on $ext_if proto { tcp, udp, icmp } from any to any \
     modulate state

# set a rule that allows inbound ssh traffic
pass in on $ext_if proto tcp to port { 22 } \
     keep state

# On workstation we will pass all outgoing traffic
pass out all keep state

#  We pass what comes to our services (but DHCP taken care os above)
pass in on $ext_if proto { tcp udp } to port $services

# and icmp types we want
pass inet proto icmp icmp-type $icmp_types

##################### END


If I am inside jail the command

telnet localhost 25

successfully connects to postfix run on host system. When I enable pf 
with rules as above, similar connection from inside jail just hangs.

I was assuming the rule:

pass quick from { lo0 $int_if } to any keep state

will do the trick, but no, the connection from inside jail to host 
system localhost port 25 is blocked by pf.


Can someone give me any pointers for this particular case?

Thanks a lot in advance for your pointers!

Valeri


PS I know, I can do the following and it will work: configure lo0 in 
jail (splitting part of 127.0.0.0/8 away from host to guest/jail) and 
run postfix is jail. But being able to tell pf what I want it to [not] 
do will be preferable.

-- 
++++++++++++++++++++++++++++++++++++++++
Valeri Galtsev
Sr System Administrator
Department of Astronomy and Astrophysics
Kavli Institute for Cosmological Physics
University of Chicago
Phone: 773-702-4247
++++++++++++++++++++++++++++++++++++++++



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?8f6aa4f4-f361-e6eb-985b-291b7be631e0>