web-dev-qa-db-ja.com

Freebsd:pfファイアウォールは再起動時に機能しません

FreeBSD 10.3 p4を実行していて、奇妙な動作を観察しました

マシンを再起動すると、/etc/rc.confエントリが原因でpfが起動します

# 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が機能しなくなったため、すべての着信トラフィックのブロックを無効にする必要がありました。

問題を解決する方法の提案はありますか?

3
Hensing

ここでの問題は、/etc/rc.d/pf/usr/local/etc/rc.d/ezjailの前に実行されるため、カーネルがファイアウォールルールを読み込もうとするまでにjailされたネットワークを構成していないことです。 pfスクリプトをezjailの後に開始するように変更したくなるかもしれませんが、それは良い考えではありません。ファイアウォールを起動プロセスの早い段階で開始したいのですが、jailはかなり遅く開始されます。 。 service -rは、rcスクリプトが実行される順序を示します。

pf.confルールは表示されませんが、静的インターフェイス構成を使用していると思います。通常、ホスト名のルックアップとインターフェイス名からアドレスへの変換は、ルールがロードされるときに実行されます。ホスト名またはIPアドレスが変更された場合、カーネルを更新するためにルールを再ロードする必要があります。ただし、かっこで囲んだインターフェイス名(およびオプションの修飾子)を使用してこの動作を変更できます。これにより、インターフェイスのアドレスが変更された場合にルールが自動的に更新されます。単純な(そしてあまり役に立たない)例として:

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

pf.confのマンページは非常に徹底しています。特に、「PARAMETERS」セクションはここに関連しています。

5
D_Bye