我正在运行 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
页非常详尽。特别是,“参数”部分与此处相关。