BSD 超精簡版PF使用手冊

本文详细介绍PF防火墙的配置方法,包括巨集定义、表格使用、选项设置、序列分配及过濾规则设定等内容,帮助读者掌握PF防火墙的高级应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PF如果在/etc/rc.conf設定啟動的話,就會在開機時讀入/etc/pf.conf設定檔來設定規則
在pf.conf裡有幾個項目必須要照順序,不然它不會讓你載入的

.巨集
.表格
.選項
.修整
.序列
.nat和轉向
.過濾

在我前一篇已經說明如果用nat了,但是要做到控制流量和讓網路效能最佳化,或是要作防火牆的話,就須要其他的設定
在上面我們已經有用過修整和nat和轉向了,接下來要再介紹怎麼用

其實在上一篇就有用到巨集了,巨集就是我們定義的變數,可以以後方便維護用,也比較看得懂啦。
使用方法就直接給名子就好了,名字可以用字母,底線和數字,後面的值要加雙引號,就這樣子而已。
但是後面如果要用到巨集的話,就要在名字前面加$。
ex  ext_if="xl0"

如果我們要讓兩張對內的網卡都可以用nat的話就要寫兩個nat規則
nat on $ext_net from 192.168.0.0/24 to any -> ($ext_net)
nat on $ext_net from 192.168.1.0/24 to any -> ($ext_net)

因為以上兩行只有一個地方不一樣而已,我們可以用列表來簡化規則,看起來更乾淨。
只要在大括號內放入項目就可以了,項目間要空格,有逗號和沒逗號都沒關係。
ex  nat on $ext_net from {192.168.0.0/24 192.168.1.0/24} to any -> ($ext_net)
這樣當載入規則時,會自動展開成兩行,就和上面一樣。
當然如果再用巨集的話,會更加清楚
int_net1="192.168.0.1/24"
int_net2="192.168.1.1/24"
nat on $ext_net from {$int_net1 $int_net2} to any -> ($ext_net)

有很多項目可以放到列表裡,像是介面、ip位址、port位、protocol ...等

表格和列表一樣,只不過它裡面只能放ip位址,但是當它在管大量ip時的效能會遠比列表好很多,
而且可以動態的在任何時刻加入或刪掉表格裡的ip,有很好的使用彈性。
使用方法是 table <name> {ip1, !ip2, ....}
項目裡的ip可以在前面加 ! 來指定說這個ip不適用於這個表格。

選項,一些最佳化的選項,在此不講。嘿嘿 ^^

修整,可以把一些怪怪的封包的整掉,變成完整的封包,可以讓pf更專心過濾規則,不用去管怪怪的封包。
最常用的就是scrub in all 所有進入的封包都要修整,就這樣。

序列,這個小複雜,這裡先講限頻寬的好了。
講到這個就要講到cbq,這是一種階級序列的演算法使用層級的方法定義頻寬。
如我們想要在512/64的adsl每人限定上傳和下載的頻寬為64/16可像下面這樣定義
altq on $ext_if cbq bandwidth 64Kb queue {std_out}
  queue std_out bandwidth 16Kb cbq (default)
altq on $int_if cbq bandwidth 512Kb queue {std_in}
  queue std_in bandwidth 64Kb cbq (default borrow)

altq可以指定一個父序列,在父序列下可以有子序列,在子序列下又可以有子序列 (=_=)。
在每個介面上,一次只能有一個父序列而已,通常我們會在對外的介面限上傳頻寬,在對內介面限下載頻寬(理由哦~~以後再說)。注意子序列一定要有一個default。
子序列可以跟父序列借頻寬哦,如果都沒人用網路還限流的話是不是很給他浪費錢勒,所以只要加個borrow就可以借用囉。
序列要怎麼用呢,如果只有序列當然不能用啦,要把過濾規則指派給序列才能限流啊,等等到過濾再說囉。

nat和轉向,語法蠻簡單的,就
nat on 對外介面 from ip to ip -> 真實ip
真實ip的話我們只要直接指定介面就可以了,如果在前後加括號的話如 (tun0) 這是指當ip變動時,nat規則也跟者變動,免得無法上網。
rdr on 介面 from ip1 to ip2 -> ip3
這個就更簡單啦,在某個介面上,把從ip1到ip2的封包轉到ip3

過濾,重點所在,可以用來作防火牆和限流的功能,還有負載平衡哦(就是合併頻寬啦),這裡只說明如果限流,其他的日後有機會再說囉

語法
pass in/out on 介面 from ip1 to ip2 keep state (queue name)
block in/out on 介面 from ip1 to ip2 keep state (queue name)
因為我們丟一個封包出去,就會回來一個封包,所以正常來說在一個連線上我們要寫兩個規則,但這樣子很煩。
如果有加keep state的話,pf會記錄出去的連線,然後封包回來時就不會被擋到啦,這樣子我們只要寫出去的過濾規則就好了。
每條規則都可以指派給序列,就是限流啦,看看下面的例子。
注意這裡的介面如果是adsl撥接的話,不能用我們之前用的tun0,要用xl0,不然不會通。

#先擋掉所以的封包
block on {xl0, rl0} all
#開放所有的封包進入對外介面
pass in on xl0 from any to $ext_net keep state
#限制上載的頻寬
pass out on xl0 from $int_net to any keep state queue std_out
#開放所有對內介面流出的封包
pass out on rl0 from any to any
#限制下載的頻寬
pass in on rl0 from $int_net to any queue std_in

ok,把pf.conf載入就好啦。手有點累~~休息一下。
有錯敬請指正,謝謝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值