Freebsd
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 停止工作。
任何建議如何解決這個問題?
這裡的問題是
/etc/rc.d/pf
執行 before/usr/local/etc/rc.d/ezjail
,所以核心在嘗試載入防火牆規則時還沒有配置監獄網路。您可能很想將pf
腳本更改為在 之後啟動ezjail
,但這不是一個好主意 - 您希望防火牆在啟動過程的早期啟動,但監獄很晚才啟動。service -r
顯示你的 rc 腳本執行的順序。您沒有顯示任何
pf.conf
規則,但我猜他們使用靜態介面配置。通常,在載入規則時會執行主機名查找和介面名稱到地址的轉換。如果主機名或 IP 地址發生更改,則需要重新載入規則以更新核心。但是,您可以通過將介面名稱(和任何可選的修飾符)括在括號中來更改此行為,這將導致規則在介面地址更改時自動更新。作為一個簡單(而且不是很有用)的例子:ext_if="em0" pass in log on $ext_if to ($ext_if) keep state
pf.conf
手冊頁非常詳盡。特別是,“參數”部分與此處相關。