以下介紹為引用 [FreeBSD 使用手冊 第26章 防火牆 26.4 OpenBSD Packet Filter (PF) 和 ALTQ]
2003 年 7 月, OpenBSD 的防火牆, 也就是常說的 PF 被成功地移植到了 FreeBSD 上, 並可以通過 FreeBSD Ports Collection 來安裝了; 第一個將 PF 集成到基本系統中的版本是 2004 年 11 月發行的 FreeBSD 5.3。 PF 是一個完整的提供了大量功能的防火牆軟件, 並提供了可選的 ALTQ (交錯隊列, Alternate Queuing) 功能。 ALTQ 提供了服務品質 (QoS) 帶寬整形功能, 這個功能能夠以基於過濾規則的方式來保障不同服務的帶寬。 OpenBSD Project 在維護 PF 用戶指南方面已經做了非常卓越的工作,因此我們不打算在這本使用手冊中進行更進一步的闡述, 以避免不必要的重複勞動。
警告: 在瀏覽 pf 用戶手冊時,請時刻注意,在 FreeBSD 中所包含的 pf 的版本和 OpenBSD 中是不一樣的。 在 FreeBSD 5.X 中 pf 相當於 OpenBSD 3.5 中的版本, 而 FreeBSD 6.X 中則相當於 OpenBSD 3.7。
更多的詳細信息, 可以在[FreeBSD 版本的 PF 網站]上找到
【作業環境】
FreeBSD 6.1、6.2-RELEASE
【安裝及設定】
若您不需要 PF ALTQ 功能則可不用透過修改核心來支援 PF,請直接在 /etc/rc.conf 內加入 pf_enable="YES" 即可,並跳到 Step3 繼續,不過前提是您必須要確定你的核心檔內下列三個選項沒有被 mark 掉
options INET
options INET6
device bpf
Step1.修改核心來開啟支援 PF
device pf //啟動 Packet Filter 防火牆
device pflog //啟動 pflog0 網卡並以 bpf 格式來記錄網路流量
device pfsync //啟動 pfsync0 網卡用來監控「狀態的改變」
options ALTQ //啟動 ALTQ 功能 (注意不是所有網卡皆支援 ALTQ 功能)
options ALTQ_CBQ //啟動 Class Bases Queuing (CBQ) 功能
Step2.修改/etc/rc.conf
修改 /etc/rc.conf 中加入下列的設定,以便在系統啟動時啟用 PF
pf_enable="YES" # 啟用 PF (如果需要的話載入模組)
pflog_enable="YES" # 啟用 pflogd(8)
gateway_enable="YES" # 啟用 LAN Gateway (若要做 NAT 的話)
Step3.修改 pf.conf
Packet Filter {PF}防火牆特性為 Default Pass ALL、Last Match Rules 當撰寫適合自已的 pf.conf 時記得 pf.conf 語法順序如下
巨集 Macro:包含 IP 位址、介面名稱等自定變數
表格 Tables:包含 IP 位址列表的表格
選項 Options:各種控制 PF 運作的選項
清理 Traffic Normalization:正規化與重組分段封包等再處理
佇列 Queueing:提供頻寬控制與封包優先順序
轉譯 Translation:控制網路位址轉譯與封包轉向
過濾規則 Packet Filtering:當封包通過任何網路介面時,允許選擇性的過濾或阻擋封包
PF 設定範例(/etc/pf.conf)請自行視個人需求修改,以下僅列出[阻擋惡意 Try SSH/FTP IP]內容
#special rule for ssh/ftp
pass in on $ext_if proto tcp from any to ($ext_if) port { ftp ssh } flags S/SA keep state (max-src-conn-rate 3/30,
overload
#block the ssh bruteforce bastards
block drop in quick on $ext_if from
上面二條 Rules 運作流程大概是這樣
首先 pass 對外進來的流量
記錄連結 port {ftp ssh} 30秒內3次 (max-src-conn-rate 指定時間內允許連結次數)
若有符合這樣條件的 IP 就將該 IP 加入 Table
block 該 Table
#pfctl -t ssh-bruteforce -Tshow //可看到惡意 ip 已加入table內
61.95.172.140
61.177.147.97
62.29.248.240
203.129.254.212
210.192.98.99
222.122.60.205
當然你也可以手動把惡意 IP 加入 Table ssh-bruteforce 內
#pfctl -t ssh-bruteforce -T add 218.70.0.0/16
若想清除 Table
一、定期清除 Table 內 IP 列表
/usr/ports/security/expiretable //安裝 expiretable
*/5 * * * * /usr/local/sbin/expiretable -t 3600 ssh-bruteforce //定期清除 Table
二、手動清除 Table 內 IP 列表
#pfctl -t ssh-bruteforce -T delete 218.70.0.0/16
Step4.pf常用指令
修改完 PF 設定檔(pf.conf)後,常使用以下指令來控制 PF 更詳細的用法請參考[Man Page pf.conf]
#pfctl -f /etc/pf.conf //重新載入 pf.conf 設定檔
#pfctl -nf /etc/pf.conf //檢查 PF 語法是否正確 (未載入)
#pfctl -Nf /etc/pf.conf //僅載入 NAT 的設定檔
#pfctl -Rf /etc/pf.conf //僅載入防火牆的過濾設定檔
#pfctl -sn //顯示現階段 NAT 的規則
#pfctl -sr //顯示現階段過濾的規則
#pfctl -ss //顯示現階段封包運作狀態
#pfctl -si //顯示現階段過濾封包的統計資料
#pfctl -sa //顯示現階段所有統計的資料
#pfctl -vsr //顯示現階段過濾封包的統計資料
#pfctl -t ssh-bruteforce -Tshow //顯示 table 內資料
補充: PF 觀念導正
由於剛使用 PF 前 Firewall 是使用 IPF 於是以為只要將 ipf rule 貼到 pf.conf 內就可以了,但卻有些 rule不生效,經過 llwang 指導後就開通了 lol 以下為擷錄在 #bsdchat 內的談話
16:19 <@weithenn_> llwang:block out quick on $lan_if from 192.168.1.231/32 to any 下這樣1.231還是可以出去
16:19 <@weithenn_> llwang:block quick on $lan_if from 192.168.1.231/32 to any 下這樣1.231就出不去了
16:30 <@llwang> 192.168.1.231 在哪一個 interface 上?
16:30 <@weithenn_> llwang:$lan_if
16:31 <@llwang> 你要擋的是不讓它連到哪裡?
16:31 <@weithenn_> llwang:不讓它去任何地方
16:31 <@llwang> 那你應該用 block in 而不是 block out
16:32 <@llwang> 對 $lan_if 來說 192.168.1.231 是從這邊 進來 的
16:33 <@weithenn_> llwang:但不是應該是 $lan_if 不讓來源1.231 出去 ?
16:33 <@llwang> 因為你前面有 nat rule,進來的連線會 implicitly keep state
16:33 <@llwang> weithenn_: 不是
16:33 <@llwang> weithenn_: 你要從你這一台來看
16:34 <@weithenn_> llwang:從pf.conf這台角度來看是嗎?
16:34 <@llwang> weithenn_: 對你這一台來說,192.168.1.231 是從 $lan_if 進來,從 $ext_if1 或 $dmz_if 出去的
16:34 <@llwang> weithenn_: 對,pf 這台
16:34 <@llwang> weithenn_: 所以應該要用 block in
16:35 <@weithenn_> llwang:so~~一句話點醒我夢中人........
16:35 <@llwang> weithenn_: 用 block out 的話因為前面的 nat 會 keep state,所以 block out 會沒用
16:37 <@weithenn_> llwang:感謝指教
範例:Web Server
一個 Web Server 的基本 PF 設定內容如下(Service FTP、SSH、DNS、HTTP)
# Macros: define common values, so they can be referenced and changed easily.
ext_if="em0"
private_addr="{192.168.0.0/16, 192.168.0.0/16, 10.0.0.0/8, 127.0.0.0/8, 0.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24,
204.152.64.0/23, 224.0.0.0/3}"
pass_in_service="{53 80}"
# Normalization: reassemble fragments and resolve or reduce traffic ambiguities.
scrub in all
# Filtering: the implicit first two rules are
#Pass Loopback
pass in quick on lo0 all
pass out quick on lo0 all
#Block the ftp ssh bruteforce bastards
block drop in quick on $ext_if from
#Pass Ping
pass in quick on $ext_if proto icmp all
#Special rule for FTP/SSH
pass in quick on $ext_if proto tcp from any to ($ext_if) port { ftp ssh } flags S/SA keep state (max-src-conn-rate 3/90,
overload
#Pass FTP
pass in quick on $ext_if proto tcp from any to $ext_if port > 49151 keep state
#Pass IN Service DNS HTTP
pass in quick on $ext_if proto { tcp, udp } from any to $ext_if port $pass_in_service keep state
#Pass Localhost to Any
#pass out quick on $ext_if all keep state
#Block Internet Private Address to Me
block in quick on $ext_if from $private_addr to any
#Block Another all
block return-rst in quick on $ext_if proto tcp all
block return-icmp(net-unr) in quick on $ext_if proto udp all
block in quick on $ext_if all
補充:遠端操作 PF 注意事項
當你在遠端操作 PF 若是沒有十足的把握最好不要亂動,因為可能動一動之後把自已擋掉了(我也有過慘痛的經驗~~ Orz)今天在 #bsdchat 上看到順便就記下來吧。
16:01 <@f0rth> pf -f 的時候不忘加上 ;sleep 10; pf -d
16:02 <@priv> f0rth: "pf設定已經變更,請問是否確認,二十秒鐘後恢復原設定值(Y/N)"
16:03 <@priv> 要這樣?
【參考】
[PF: The OpenBSD Packet Filter]
[PF: OpenBSD 封包過濾器]
[pf中文手冊(for openbsd,但同樣適用FREEBSD)]
[FreeBSD 使用手冊 第26章 防火牆 26.4 OpenBSD Packet Filter (PF) 和 ALTQ]
[Man Page pf.conf]
[Man Page altq(4)]
[FreeBSD packet filter Mail List]
[PF: The OpenBSD Packet Filter]
[PF: OpenBSD 封包過濾器]
[FreeBSD 5.3 Release PF 初體驗]
[FreeBSD + PF + Shell Scritp + Load Sharing + Redundant ]
[FreeBSD NAT 上接兩條 ADSL 若斷線時自動偵測切換路由]
[PF 防火牆及 NAT 初次架設]
[jail-pf memo]
[FreeBSD筆記:pf log]
[游志峰的網路架設筆記 pf 的紀錄檔]
[游志峰的網路架設筆記 pf設定]
[游志峰的網路架設筆記 pf 原廠範例]
[OpenBSD Taiwan openbsd & pf 的邂逅]
[Hi! I’m clsung » Blog Archive » pf 擋 ssh 惡意連線]
[Block ssh bruteforce attempts]
[FreeBSD PF 防火牆及 NAT 初次架設 < 月夜火]
[OpenBSD 超精簡版PF使用手冊]
[OpenBSD firewall using pf]
[openbsd+adsl+pf+qdns 配置过程 - fanqiang.com]
[OpenBSD下面自动block密码测试不法分子]
[FreeBSD with Packet Filter(PF) Firewall - (1) ]
[FreeBSD with Packet Filter(PF) Firewall - (2) ]
[FreeBSD with Packet Filter(PF) Firewall - (3) ]
[FreeBSD with Packet Filter(PF) Firewall - (4) ]
[FreeBSD with Packet Filter(PF) Firewall - (5) ]
[FreeBSD with Packet Filter(PF) Firewall - (6) ]
[Man Page expiretable -- removes PF table entries based on age]
【Log】