Freebsd:pf 防火墙在重新启动时不起作用

Freebsd:pf 防火墙在重新启动时不起作用

我正在运行 FreeBSD 10.3 p4 并观察到一些奇怪的行为

重新启动机器时 pf 由于/etc/rc.conf输入而启动

# JAILS
cloned_interfaces="${cloned_interfaces} lo1"
gateway_enable="YES"
ipv6_gateway_enable="YES"

# OPENVPN -> jails
cloned_interfaces="${cloned_interfaces} tun0"

# FIREWALL
pf_enable="YES"
pf_rules="/etc/pf.conf"
fail2ban_enable="YES"

# ... other services ...

# load ezjail
ezjail_enable="YES"

但无视所有有关监狱的规则。所以我必须手动重新加载规则才能开始

sudo pfctl -f /etc/pf.conf

我的 pf.conf 内容如下:

#external interface
ext_if = "bge0"
myserver_v4 = "xxx.xxx.xxx.xxx"

# internal interfaces
set skip on lo0
set skip on lo1

# nat all jails
jails_net = "127.0.1.1/24"
nat on $ext_if inet from $jails_net to any -> $ext_if

# nat and redirect openvpn
vpn_if = "tun0"
vpn_jail = "127.0.1.2"
vpn_ports = "{8080}"
vpn_proto = "{tcp}"
vpn_network = "10.8.0.0/24"
vpn_network_v6 = "fe80:dead:beef::1/64"
nat on $ext_if inet from $vpn_network to any -> $ext_if
rdr pass on $ext_if proto $vpn_proto from any to $myserver_v4 port $vpn_ports -> $vpn_jail

# nsupdate jail
nsupdate_jail="127.0.1.3"
nsupdate_ports="{http, https}"
rdr pass on $ext_if proto {tcp} from any to $myserver_v4 port $nsupdate_ports -> $nsupdate_jail

# ... other yails ...

# block all incoming traffic
#block in

# pass out 
pass out

# block fail2ban
table <fail2ban> persist
block quick proto tcp from <fail2ban> to any port ssh

# ssh
pass in on $ext_if proto tcp from any to any port ssh keep state

我不得不禁用阻止所有传入流量的功能,因为通过 ipv6 的 ssh 停止工作。

有什么建议如何解决这个问题吗?

答案1

这里的问题是在/etc/rc.d/pf之前运行/usr/local/etc/rc.d/ezjail,因此内核在尝试加载防火墙规则时尚未配置被监禁的网络。您可能会想将pf脚本更改为 after 启动ezjail,但这不是一个好主意 - 您希望防火墙在启动过程中尽早启动,但监狱启动得很晚。service -r显示 rc 脚本的运行顺序。

您没有显示任何规则pf.conf,但我猜测它们使用静态接口配置。通常,主机名查找和接口名称到地址转换是在加载规则时执行的。如果主机名或IP地址发生变化,则需要重新加载规则以更新内核。但是,您可以通过将接口名称(以及任何可选修饰符)括在括号中来更改此行为,这将导致规则在接口地址更改时自动更新。作为一个简单(但不是很有用)的例子:

ext_if="em0"
pass in log on $ext_if to ($ext_if) keep state

手册pf.conf页非常详尽。特别是,“参数”部分与此处相关。

相关内容