OpenBSD & PF
之基本防火牆設定
Description:
OpenBSD 之PF
基本防火牆啟動及 /etc/pf.conf 設定檔範例研究,我在想 OpenBSD 是不是天生開發出來,就是要擔任防火牆的角色,裝完
OpenBSD 後即可啟用 NAT 及 firewall 的能力,並不需要再去編譯 Kernel 即可使用。
Setp
1.
開機自
動啟動:
#vi
/etc/rc.conf
pf=YES
#vi
/etc/sysctl.conf
#net.inet.ip.forwarding=1
# 將最前面的 # 號拿掉
net.inet.ip.forwarding=1
手動立即啟動:
#pfctl -e
#sysctl
-w net.inet.ip.forwarding=1
開啟 ftp-proxy 讓內部可以對外使用 FTP 的服務:
#vi
/etc/inetd.conf
#127.0.0.1:8021 stream
tcp nowait
root /usr/libexec/ftp-proxy ftp-proxy # 將"# "號拿掉開通 127.0.0.1 的 ftp-proxy
127.0.0.1:8021 stream tcp
nowait root /usr/libexec/ftp-proxy ftp-proxy
#kill
-HUP `cat /var/run/inetd.pid`
Setp 2.
基本 PF 的 /etc/pf.conf 設定範例:
# macros
int_if = "de0" # 定義對內的網介面
ext_if = "fxp0" # 定義對外的網路介面
tcp_services = "{ 22, 113
}" # 定義
port 22, 113 服務
icmp_types =
"echoreq" #
定義 tcmp 回應狀態
priv_nets = "{ 127.0.0.0/8,
192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }"
# 定義符合 RFC 1918 私有IP 部份
comp3 =
"10.10.10.3" #
定義內部的一台電腦代號 comp3 對應 10.10.10.3 這個 IP
# options
set block-policy return
set loginterface $ext_if
# scrub
scrub in all # 修整進入 NAT 的封包
# nat/rdr
nat on $ext_if from
$int_if:network to any -> ($ext_if) # NAT 設定讓內部的 IP 可轉換出去
rdr on $int_if proto tcp from any
to any port 21 -> 127.0.0.1 port 8021 # 讓內部可使用 ftp client 軟體連出去
rdr on $ext_if proto tcp from any
to any port 80 -> $comp3 # 內部電腦 comp3 的 80 port 服務對應到外面
# filter rules
block all # 所有封包都擋掉
pass quick on lo0
all # 允許
localhost 封包通行
block drop in quick on
$ext_if from $priv_nets to any # 拒絕所有 priv_nets 定義的私有 IP 進入 ext_if
介面
block drop out quick on $ext_if
from any to $priv_nets #
拒絕所有 priv_nets 定義的私有 IP 出去 ext_if 介面
pass in on $ext_if inet proto tcp
from any to ($ext_if) port $tcp_services flags S/SA keep
state # 允許
tcp_services 定義之 port 進入 ext_if 介面
pass in on $ext_if proto tcp from
any to $comp3 port 80 flags S/SA synproxy state #
讓內部 comp3 的 80 port 服務由 ext_if 介面出去
pass in inet proto icmp all
icmp-type $icmp_types keep state # 允許 icmp 封包進入通行
pass in on $int_if from
$int_if:network to any keep state # 允許封包由 de0 進到 10.10.10.0/24
暢通
pass out on $int_if from any to
$int_if:network keep state # 允許封包由 de0 出去
10.10.10.0/24 暢通
pass out on $ext_if proto tcp all
modulate state flags S/SA # 允許 tcp 封包由 fxp0 出去
pass out on $ext_if proto { udp,
icmp } all keep state # 允許 udp , icmp 封包由 fxp0 出去
Setp 3.
pfctl
的控制指令:
#pfctl -f
/etc/pf.conf # 重新載入pf.conf 設定檔
#pfctl -nf
/etc/pf.conf # 確認語法有無符合,但不載入
#pfctl -Nf
/etc/pf.conf # 只載入 NAT 的設定檔
#pfctl -Rf
/etc/pf.conf # 只載入防火牆的過濾設定檔
#pfctl
-sn # 顯示現階段 NAT 的規則
#pfctl -sr
# 顯示現階段過濾的規則
#pfctl -ss
# 顯示現階段封包運作狀態
#pfctl -si
# 顯示現階段過濾封包的統計資料
#pfctl -sa
# 顯示現階段所有統計的資料