Freebsd: 재부팅 시 pf 방화벽이 작동하지 않습니다.

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가 작동을 멈췄기 때문에 들어오는 모든 트래픽 차단을 비활성화해야 했습니다.

이 문제를 해결하는 방법에 대한 제안이 있으십니까?

답변1

여기서 문제는 /etc/rc.d/pf이전에 실행 중이 어서 /usr/local/etc/rc.d/ezjail방화벽 규칙을 로드하려고 할 때 커널이 아직 감옥에 갇힌 네트워크를 구성하지 않았다는 것입니다. pf스크립트를 after boot 로 변경하고 싶을 수도 있지만 ezjail이는 좋은 생각이 아닙니다. 방화벽은 부팅 프로세스 초기에 시작하고 감옥은 늦게 시작하기를 원합니다. service -rrc 스크립트의 실행 순서를 표시합니다.

어떤 규칙도 표시하지 않지만 pf.conf정적 인터페이스 구성을 사용하는 것 같습니다. 일반적으로 호스트 이름 조회 및 인터페이스 이름-주소 변환은 규칙이 로드될 때 수행됩니다. 호스트 이름이나 IP 주소가 변경되면 규칙을 다시 로드하여 커널을 업데이트해야 합니다. 그러나 인터페이스 이름(및 선택적 수정자)을 괄호로 묶어 이 동작을 변경할 수 있습니다. 이렇게 하면 인터페이스 주소가 변경될 때 규칙이 자동으로 업데이트됩니다. 간단하지만 별로 유용하지는 않은 예를 들면 다음과 같습니다.

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

매뉴얼 pf.conf페이지는 매우 철저합니다. 특히 "매개변수" 섹션이 여기에 관련됩니다.

관련 정보