為 FreeBSD 加入 ipfw 防火牆

出自啟示錄
於 2006年9月4日 (一) 05:31 由 JoeHorn留言 | 貢獻 所做的修訂
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
跳至導覽 跳至搜尋

作者:Joe Horn( joehorn AT leobbs DOT net )

授權:[CC授權:姓名標示-非商業性-相同方式分享 2.5]

附註:本文件適用於 FreeBSD 平台,其它 UNIX-Like OS 可能有所不同。


前言

有鑑於近年來網路安全漸漸被大家重視,Windows 系統上面的防火牆軟體越來越多,而 Linux 也幾乎都內建了防火牆功能,故撰此文件。

修改與編譯核心設定檔

修改您的 kernel 設定檔,在裡面加進以下這段:

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
options IPFIREWALL_DEFAULT_TO_ACCEPT
  • 另外要注意的是,如果您使用的是 2005 年 3 月 2 日以後的 FreeBSD ,而且有打算用 ipfw 來 forward 封包的話,必須再加進這行:
options IPFIREWALL_FORWARD_EXTENDED

如果有打算用 ipfw 來作頻寬控管的話,請再加入這行:

options DUMMYNET

其他的選項與各項說明可以參考 /sys/i386/conf/LINT(FreeBSD 5.0 以後之版本請參考 /sys/i386/conf/NOTES)。

重新 make kernel。

設定 ipfw

修改 /etc/rc.conf,在裡面加進以下這段內容:

firewall_enable="YES"
firewall_type="simple"
firewall_script="[用來決定 firewall rule 的 shell script 絕對位置]"
firewall_quiet="YES"
  • 其中用來決定 firewall rule 的 shell script 絕對位置請自行決定,我的習慣是使用 /etc/rc.firewall_[主機 hostname]。
例如:mail.aaa.com.tw 的 firewall rule 的 shell script 就是 /etc/rc.firewall_mail

編輯 firewall rule shell script,請在前面加上這幾行:

#!/bin/sh
# ================
# 清除所有防火牆過濾的規則(歸零)
/sbin/ipfw -f flush%%

然後底下請加上自己想要用的 firewall rule.

  • 注意:前面的規則會先被採用,就算後面有衝突也不會再理會。

規則範例與說明

我舉幾個例子:

  • 讓 111.222.333.444 無法與我的主機連線(任一 port),用這行:
/sbin/ipfw add deny all from 111.222.333.444 to any
  • 讓 555.666.777.888 無法連線到我的 HTTP port(port 80):
/sbin/ipfw add deny tcp from 555.666.777.888 to any 80
  • 讓 111.222.333.* 無法連線到我的 SMTP port(port 25):
/sbin/ipfw add deny tcp from 111.222.333.0/24 to any 25

其他相關設定方式請 man ipfw,或是以下這個網頁: [http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls.html]

重新開機並啟動 ipfw

重新開機,ipfw 在重新開機之後就會啟動。

其他指令

  • 將所有的 rule 列出來:
# /sbin/ipfw show
  • 洗掉所有規則:
# /sbin/ipfw flush

其他關於 ipfw 的參數請 man ipfw。

後記

值得注意的是,因為我們有在 kernel 中使用 IPFIREWALL_DEFAULT_TO_ACCEPT 這個 options,所以無論我們有沒有加規則,ipfw 都會跑這個 rule:

/sbin/ipfw add allow ip from any to any

而這個 rule 是優先順序最低的 rule,將會容許所有你沒設定擋掉的 IP/port 做連線。