Freebsd

Freebsd:pf 防火牆在重新啟動時不起作用

  • July 13, 2016

我正在執行 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手冊頁非常詳盡。特別是,“參數”部分與此處相關。

引用自:https://unix.stackexchange.com/questions/295103