第十二章NAT 及防火牆 - twbsd.org
文章推薦指數: 80 %
Port Forwarding 的功能是將外部連線轉向到內部的電腦。
所以,如果您從內部電腦連到NAT 伺服器時,並不會被轉向到內部IP 喔。
12.3 防火牆.
第十二章NAT及防火牆
如果您家中有多台電腦需要同時上網,但卻只有一個IP可以使用,這時NAT就派上用場了。
NAT可以讓很多電腦經由一台FreeBSD
伺服器上網,而且還可以讓FreeBSD的防火牆功能保護內部網路的電腦。
本章將介紹以FreeBSD架設NAT伺服器及使用FreeBSD
防火牆功能。
讀完本章後,您將了解下列主題:
如何使用FreeBSD架設NAT伺服器。
如何限制每一台電腦的最大上下傳頻寬。
如何架設防火牆。
如何架設具封包過濾功能的橋接器。
12.1概論
這個部份我們將說明如何以FreeBSD做為防火牆,介紹FreeBSD
內建的封包過濾功能。
欲建立一台防火牆,就是要將一台機器放在二個網域的中間,並經由它來做封包過濾的工作。
因此我們必須先確定網路封包能通過這台防火牆,再來設定要阻檔的規則。
以FreeBSD作為二個網域中間的連接器,可以用路由器
(router)、閘道、或是橋接器的方式來實作,再在該機器上設定防火牆的規則。
當然,我們也可以只在一台單機上設定防火牆規則,以取代原本只能監控inetd
服務的TCPWrapper。
我們舉二種最常被應用結合防火牆設定來保護整個網路的方法,一個是NAT,另一個是具封包過濾的橋接器。
12.1.1NAT
所謂的NAT就是(NetworkAddressTranslation),它可以讓你在只有一個IP
的情形下讓多台電腦一起連上網路。
舉個實例而言,一個公司有三十台電腦,而ISP所提供的ADSL卻只有八個實體IP,這種情況下,我們可以將每台電腦的IP
設定為privateIP,再讓它們經由一台有實體IP的NAT伺服器連上網路即可。
PrivateIP是RFC所定義的私人IP,這些IP不能夠直接在網際網路中出現,所以必需經由NAT的轉換,將它們偽裝成是由NAT
伺服器連向外部網路。
這些可以用的私人IP如下:
Class
範圍
子網路遮罩
ClassA
10.0.0.0~10.255.255.255
255.0.0.0
ClassB
172.16.0.0~172.31.255.255
255.255.0.0
ClassC
192.168.0.0~192.168.255.255
255.255.255.0
我們只需在NAT伺服器中做好設定,再將其他使用privateIP的電腦設定gateway為該伺服器的IP
即可。
另外,我們也可以在伺服器中設定一些防火牆的規則,來保全內部網路。
12.1.2具封包過濾的橋接器
如果我們的網路中有多台不同網域的電腦,這些電腦都有它們的IP及網路設定,我們可以將FreeBSD設定成為橋接器
(bridge),讓這台橋接器作封包過濾的工作。
這種做法對於網域內其他電腦原本的網路設定不會有影響,如果沒有設定任何防火牆規則,對它們而言幾乎不會發現橋接器的存在。
我們可以使用橋接器來過濾同一個網域內的網路交通,如果您有一個很大的網域,想要降低同一網域內彼此網路封包的交互影響,卻又不想將這個大網域分割成數個小網域,您可以使用具封包過濾功能的橋接器來達成網路封包分割的功能。
我們也可以使用路由器來取代橋接器,但是路由器只能遶送二個不同網域,而且設定比較複雜,因此,我會使用橋接器來做為防火牆。
FreeBSD內建有ipfw這個程式可以讓我們輕易的設定一個簡單的防火牆,我們只要在kernel
中加上一些設定就可以打開它。
在這裡我們也將簡單的介紹一些防火牆的語法,讓我們可以保護我們不想、不需要被外界使用的網路服務。
在設定防火牆之前,有個觀念必須先釐清。
防火牆並不能夠完全保護我們的網路安全,防火牆只是限制我們不想公開的服務、限制已知的
IP。
就算架了防火牆,沒有適當的管理也是枉然。
12.2NAT
這裡我們假設使用二張網路卡,一張是對外的網卡,代號是fxp0;另一張是對內的網卡,代號
fxp1。
以下的設定中請依您的網卡代號來加以修改。
當然,你也可以只使用一張網路卡,將所有的電腦及對外網路都接在一台HUB上,再利用alias
的功能將一張網卡設定二個IP。
在開始前,請先參考「網路設定」一章中的說明設定好第一張對外的網路卡喔。
在開始設定之前,請先檢查一下內部網路的配置是否正確。
我們內部網路的線路應該如圖12-1所示。
圖12-1
上圖中,內部網路的電腦全部都接到同一個HUB中,而FreeBSD有二個網路卡,對內的網路卡fxp1接在內部的HUB
上,而對外的網路卡直接接在ADSLModem或是對外的HUB上。
上圖的網路配置只是一個建議,您也可以將fxp0、fxp1、及ADSLModem
全部接在內部的HUB上,只是這樣FreeBSD就沒有真正的隔離內外部網路了。
12.2.1設定kernel
首先,我們必須先確定核心有支援NAT及防火牆功能。
FreeBSD預設的GENERIC核心並未加入此功能,因此,請先編輯您的核心設定檔,加入下列
設定,並重新編譯核心。
如果您不知道如何修改核心設定,請參考「編譯核心」一章的說明。
假設我們要修改的核心設定檔為/usr/src/sys/i386/conf/GENERIC,先cd/usr/src/sys/i386/conf/,再eeGENERIC
加入下列幾行:
#防火牆
optionsIPFIREWALL
#支援NAT
optionsIPDIVERT
#下面這一行是預設允許所有封包通過,如果沒有這一行,
#就必須在/etc/rc.firewall中設定封包的規則。
#這條規則內定編號是65535,也就是所有規則的最後一條
#如果沒有加這一條規則,內定就是拒絕所有封包,
#只允許規則中允許的封包通過。
optionsIPFIREWALL_DEFAULT_TO_ACCEPT
#這一行是讓你可以在ipfw中設定要記錄哪些封包,
#如果沒有這一行,就算設定了要留下記錄也不會有作用。
optionsIPFIREWALL_VERBOSE
#這一行是限制每一條規則所要記錄的封包數量,
#因為同樣的規則可能有許多記錄,加上這一條可以使
#同樣的記錄重覆數減少,以避免記錄檔爆增。
optionsIPFIREWALL_VERBOSE_LIMIT=10
#下面這一行是用來支援封包轉向,
#當你要使用fwd動作時必須要有這一項設定。
optionsIPFIREWALL_FORWARD
#如果要使用pipe來限制頻寬,必須加入下列選項以支援dummynet。
optionsDUMMYNET
我們在上述設定中加入了許多項目,基本上,一定要有的項目為IPFIREWALL及IPDIVERT,其它項目是為了支援限制頻寬或記錄資訊使用。
編輯完核心設定後,請重新編譯並安裝新的
核心,重開機之後核心就己經支援防火牆及NAT了。
12.2.2設定rc.conf
請先參考「網路設定」一章,設定好您的第一張網路卡,並確定可以上網後,才開始下列設定。
我們要修改/etc/rc.conf以啟動NAT功能。
我們假設網路卡代號是fxp0及fxp1,請自行變更成您的網路卡代號:
#設定第二張網路卡的IP。
ifconfig_fxp1="inet192.168.0.1netmask255.255.255.0"
#設定啟用gateway的功能。
gateway_enable="YES"
#設定啟用防火牆功能,並設定防火牆類型為OPEN。
#FreeBSD的防火牆設定檔會自動為NAT加入相關的設定。
firewall_enable="YES"
firewall_type="OPEN"
#設定NAT所使用的對外網路卡
natd_interface="fxp0"
natd_enable="YES"
設定結束之後,重開機應該就可以設定其他電腦使用這台NAT伺服器來連上網路了。
12.2.3設定rc.firewall
我們在/etc/rc.conf中設定firewall_type="OPEN",如果是使用原本
/etc/rc.firewall的話,這樣就已經就已經驅動了NAT的功能。
如果您想要加上更多的防火牆規則,可以編輯/etc/rc.firewall,
並在檔案最後加上您的設定。
例如,我們要設定每一個內部電腦(192.168.0.0/16)最多只能使用的上傳頻寬為64Kb/s,下傳頻寬為256Kb/s,則可以在rc.firewall
中加入下列設定:
#限制頻寬
/sbin/ipfwpipe20configbw64Kbits/s
/sbin/ipfwpipe21configbw256Kbits/s
/sbin/ipfwaddpipe20ipfrom192.168.0.0/16toany
/sbin/ipfwaddpipe21ipfromanyto192.168.0.0/16
修改完後,執行sh/etc/rc.firewall就可以更新防火牆的設定了。
其他關於防火牆規則的詳細說明,請manipfw或參考下一節的說明。
12.2.4client端的設定
在內部其它電腦方面,我們必須要再做一些設定才能讓它們經由FreeBSD上網。
首先,你的網路架構應該如圖12-1所示。
而內部的其他的電腦設定方面,我們必須將其他電腦的IP設定為和FreeBSD伺服器同一個子網路。
以上列設定為例,您必須將其它電腦的IP設為192.168.0.X
(除了192.168.0.1以外的其它IP)、子網路遮罩是255.255.255.0,gateway設定為
FreeBSD連到區域網路的網路卡IP,在此範例中是192.168.0.1。
然後再設定你的DNS為你ISP的DNS即可。
完成上述的設定後,我們就能享受以FreeBSD為NAT上網了。
如果您的其它電腦還是無法上網,您可以依下列步驟除錯:
從FreeBSDping網際網路上的IP,看看FreeBSD連到網際網路是否正常。
如果ping不到,表示FreeBSD
對外網路設定有誤。
從內部其它電腦pingFreeBSD對內的IP。
如果ping不到,請檢查二方的IP及子網路設定是否正確,或是防火牆是否設定無誤。
從內部電腦ping網際網路上的IP,如果ping不到,可能是NAT的設定有誤。
12.2.5NATPortForwarding
NAT還有一個功能叫作PortForwarding,它的用途在於從連到本機的封包導向到別的電腦或本機其他連接埠。
例如,我們對外有一台防火牆,在
DNS設定方面,我們設定了ftp.mydomain.com及www.mydomain.com都指向這台防火牆。
但我們希望所有HTTP
連線都重新導向到內部的192.168.0.2這台機器上,而所有FTP連線都交由192.168.0.3來處理。
這時候我們就可以使用port
forwarding的方式來達成。
首先,我們知道HTTP使用TCP協定port80,而FTP使用了TCP協定port20及port21,接著我們就可以在
/etc目錄下新增一個NAT的設定檔,名為natd.conf,並編輯內容如下:
redirect_porttcp192.168.0.2:8080
redirect_porttcp192.168.0.3:2020
redirect_porttcp192.168.0.3:2121
第一行的目的就是將port80的tcp連線重新導向到192.168.0.2的port80,而二、三行是將port20及port
21的連線交由192.168.0.3來處理。
在192.168.0.2及192.168.0.3這二台機器上,我們只要設定它們的gateway
為防火牆的IP,例如192.168.0.1即可。
接下來我們必須在/etc/rc.conf中加入下列這一行,讓natd在啟動時能讀取/etc/natd.conf的設定:
natd_flags="-f/etc/natd.conf"
重新啟動後,您就可以進行測試了。
假設防火牆的對外IP是11.22.33.44,當我們從外部網路使用HTTP連線到該IP
時,雖然該伺服器並未架設HTTPserver,但你卻可以看到網頁,表示網路封包有被重導至內部的另一台伺服器。
小提示
PortForwarding的功能是將外部連線轉向到內部的電腦。
所以,如果您從內部電腦連到NAT伺服器時,並不會被轉向到內部IP喔。
12.3防火牆
ipfw是FreeBSD內建的防火牆指令,我們可以用它來管理進出的網路交通。
如果防火牆伺服器是扮演著路由器(gateway例如上一篇中的NAT
伺服器)的角色,則進出的封包會被ipfw處理二次,而如果防火牆扮演的是橋接器(bridge)
的角色,則封包只會被處理一次。
這個觀念關係著我們以下所要介紹的語法,有的語法並不適用於橋接器。
另外,我們在設定防火牆時有二種模式,
一種模式是預設拒絕所有連線,再一條一條加入允許的連線;另一種是預設接受所有連線,加入幾條拒絕的規則。
如果是非常強調安全性,應該是使用預設拒絕所有連線,再一條一條加入我們允許的規則。
我們會將firewall的設定寫在/etc/rc.firewall中,每一條設定都是以先入為主(firstmatchwins)
的方式來呈現,也就是先符合的規則(rules)為優先。
所有進出的封包都會被這些規則過濾,因此我們會盡量減少規則的數量,以加速處理的速度。
在kernel中,關於防火牆的設定有下列幾條:
#防火牆
optionsIPFIREWALL
#支援NAT
optionsIPDIVERT
#下面這一行是預設允許所有封包通過,如果沒有這一行,
#就必須在/etc/rc.firewall中設定封包的規則。
#這條規則內定編號是65535,也就是所有規則的最後一條
#如果沒有加這一條規則,內定就是拒絕所有封包,
#只允許規則中允許的封包通過。
optionsIPFIREWALL_DEFAULT_TO_ACCEPT
#這一行是讓你可以在ipfw中設定要記錄哪些封包,
#如果沒有這一行,就算設定了要留下記錄也不會有作用。
optionsIPFIREWALL_VERBOSE
#這一行是限制每一條規則所要記錄的封包數量,
#因為同樣的規則可能有許多記錄,加上這一條可以使
#同樣的記錄重覆數減少,以避免記錄檔爆增。
optionsIPFIREWALL_VERBOSE_LIMIT=10
#下面這一行是用來支援封包轉向,
#當你要使用fwd動作時必須要有這一項設定。
optionsIPFIREWALL_FORWARD
#如果要使用pipe來限制頻寬,必須加入下列選項以支援dummynet。
optionsDUMMYNET
ipfw也支援狀態維持(keep-state)的功能,就是可以讓符合設定的規則以動態的方式來分配增加規則(位址或連接埠)
來讓封包通過。
也就是說防火牆可以記住一個外流的封包所使用的位址及連接埠,並在接下來的幾分鐘內允許外界回應。
這種動態分配的規則有時間的限制,一段時間內會檢查連線狀態,並清除記錄。
所有的規則都有計數器記錄封包的數量、位元數、記錄的數量及時間等。
而這些記錄可以用ipfw指令來顯示或清除。
在說明ipfw規則的語法之前,我們先來看這個指令的用法。
ipfw可以使用參數:
指令
說明
ipfwadd[rule]
新增一條規則。
規則(rule)的語法請參考下一節的說明。
ipfwdelete[number]
刪除一條編號為number的規則。
ipfw-fflush
清除所有的規則。
ipfwzero
將計數統計歸零。
ipfwlist
列出現在所有規則,可以配合下列參數使用。
-a
使用list時,可以列出封包統計的數目。
-f
不要提出確認的詢問。
-q
當新增(add)、歸零(zero)、或清除(flush)時,不要列出任何回應。
當使用遠端登入,以script
(如sh/etc/rc.firewall)來修改防火牆規則時,內定會列出你修改的規則。
但是當下了flush
之後,會立即關掉所有連線,這時候回應的訊息無法傳達終端機,而規則也將不被繼續執行。
此時唯一的方法就是回到該電腦前重新執行了。
在修改防火牆規則時,最好在電腦前修改,以免因為一個小錯誤而使網路連線中斷。
-t
當使用list時,列出最後一個符合的時間。
-N
在輸出時嘗試解析IP位址及服務的名稱。
-s[field]
當列出規則時,依哪一個計數器(封包的數量、位元數、記錄的數量及時間)來排序。
12.3.1ipfw規則
我們在過濾封包時,可以依據下列的幾個封包所包含的資訊來處理該封包:
接收或傳送的介面,可以使用介面名稱或位址。
方向,流入或流出。
來源或目的地的IP位址,也可以加上子網路遮罩。
通訊協定,TCP,UDP,ICMP等。
TCPflags。
IPfragmentflag。
IPoptions。
ICMP的類型。
和封包相關的socketUser/groupID。
使用IP位址或TCP/UDP的埠號來做為規則可能蠻危險的,因為這二種都有可能被以假的資訊所蒙騙(spoof)。
但是這二種卻也是最常被使用的方法。
下列為ipfwrules的語法:
[number]action[log]protofromsrctodist[interface_spec][option]
使用[]包起來的表示可有可無,我們一一為大家說明它們的意義:
number:
number是一個數字,用來定義規則的順序,因為規則是以先入為主的方式處理,如果你將規則設定放在一個檔案中(如/etc/rc.firewall
),規則會依每一行排列的順序自動分配編號。
你也可以在規則中加上編號,這樣就不需要按順序排列了。
如果是在命令列中下ipfw
指令來新增規則的話,也要指定編號,這樣才能讓規則依我們的喜好排列,否則就會以指令的先後順序來排。
這個編號不要重覆,否則結果可能不是你想要的樣子。
action:
action表示我們這條規則所要做的事,可以用的action有下列幾個:
命令
意義
allow
允許的規則,符合則通過。
也可以使用pass,permit,accept等別名。
deny
拒絕通過的規則。
reject
拒絕通過的規則,符合規則的封包將被丟棄並傳回一個hostunreachable的ICMP。
count
更新所有符合規則的計數器。
check-state
檢查封包是否符合動態規則,如果符合則停止比對。
若沒有check-state這條規則,動態規則將被第一個
keep-state的規則所檢查。
divertport
將符合divertsock的封包轉向到指定的port。
fwdipaddr[,port]
將符合規則封包的去向轉向到ipaddr,ipaddr可以是IP位址或是hostname。
如果設定的
ipaddr不是直接可以到達的位址,則會依本機即有的routingtable來將封包送出。
如果該位址是本地位址(local
address),則保留本地位址並將封包送原本指定的IP位址。
這項設定通常用來和transparentproxy搭配使用。
例如:
#ipfwadd50000fwd127.0.0.1,3128tcpfrom\
192.168.1.0/24toany80
如果沒有設定port,則會依來源封包的port將封包送到指定的IP。
使用這項規則時,必須在kernel中設定選項IPFIREWALL_FORWARD。
pipepipe_nr
傳遞封包給dummynet(4)"pipe",用以限制頻寬。
使用本語法必須先在核心中加入option
DUMMYNET。
請manipfw及mandummynet。
基本語法是先將要設定頻寬的規則加入:
ipfwaddpipepipe_nr....
再設定該規則的頻寬:
ipfwpipepipe_nrconfigbwBdelayDqueueQplrP
這裡的pipe_nr指的是pipe規則編號,從1~65535;B是指頻寬,可以表示為bit/s、Kbit/s、Mbit/s、Bytes/s、KBytes/s、或
MBytes/s。
D是延遲多少milliseconds(1/1000)。
Q是queuesize的大小(單位為packages或
Bytes)。
P是要隨機丟棄的封包數量。
例如我們要限制內部網域的電腦對外上傳的最大頻寬是20KBytes:
ipfwaddpipe1ipfrom192.168.0.1/24toanyin
ipfwpipe1configbw20KBytes/s
log:
如果該規則有加上log這個關鍵字,則會將符合規則的封包記錄在/var/log/security中。
前提是在核心中有設定
IPFIREWALL_VERBOSE的選項。
有時因為同樣的封包太多,會使記錄檔保有大量相同的記錄,因此我們會在核心中再設定
IPFIREWALL_VERBOSE_LIMIT這個選項,來限制要記錄多少相同的封包。
proto:
proto表示protocol,即網路協定的名稱,如果使用ip或all表示所有協定。
可以使用的選項有ip,all,tcp,udp,icmp等。
src及dist:
src是封包來源;dist是封包目的地。
在這二個項目可以用的關鍵字有any,me,或是以
若使用關鍵字any表示使這條規則符合所有ip位址。
若使用關鍵字me則代表所有在本系統介面的IP位址。
而使用明確指定位址的方式有下列三種: IP位址,指定一個IP,如168.20.33.45。
IP/bits,如1.2.3.4/24,表示所有從1.2.3.0到1.2.3.255的IP都符合規則。
IP:mask,由IP加上子網路遮罩,如1.2.3.4:255.255.240.0表示從1.2.0.0到1.2.15.255都符合。
而在me,any及指定的ip之後還可以再加上連接埠編號(ports),指定port的方法可以是直接寫出port,如 23;或給定一個範圍,如23-80;或是指定數個ports,如23,21,80以逗點隔開。
或者是寫出在/etc/services中所定義的名稱,如 ftp,在services中定義是21,因此寫ftp則代表port21。
interface-spec: interface-spec表示我們所要指定的網路介面及流入或流出的網路封包。
我們可以使用下列幾個關鍵字的結合: 關鍵字 意義 in 只符合流入的封包。
out 只符合流出的封包。
viaifX 封包一定要經過介面ifX,if為介面的代號,X為編號,如vr0。
viaif* 表示封包一定要經過介面ifX,if為介面的代號,而*則是任何編號,如vr*代表vr0,vr1,...。
viaany 表示經過任何介面的封包。
viaipno 表示經過IP為ipno介面的封包。
via會使介面永遠都會被檢查,如果用另一個關鍵字recv,則表示只檢查接收的封包,而xmit 則是送出的封包。
這二個選項有時也很有用,例如要限制進出的介面不同時: ipfwadd100denyipfromanytoanyoutrecvvr0xmited1 recv介面可以檢查流入或流出的封包,而xmit介面只能檢查流出的封包。
所以在上面這裡一定要用out而不能用in,只要有使用xmit 就一定要使用out。
另外,如果via和recv或xmit一起使用是沒有效的。
有的封包可能沒有接收或傳送的介面:例如原本就由本機所送出的封包沒有接收介面,而目的是本機的封包也沒有傳送介面。
options: 我們再列出一些常用的option選項,更多選項請manipfw: 選項名稱 意義 keep-state 當符合規則時,ipfw 會建立一個動態規則,內定是讓符合規則的來源及目的地使用相同的協定時就讓封包通過。
這個規則有一定的生存期限(lifttime,由sysctl 中的變數所控制),每當有新的封包符合規則時,便用重設生存期限。
bridged 只符合bridged的封包。
established 只適用於TCP封包,當封包中有RST或ACKbits時就符合。
uidxxx 當使用者uid為xxx則符合該規則。
例如,我們如果要限制AnonymousFTP的下載速度最大為 64KB/s,則可以使用: ipfwpipe1configbw512Kbit/s ipfwaddpipe1tcpfrommetoanyuid21 上列規則第一行是先建一個編號為1的pipe,限制頻寬為512Kbit/s(也就是64KByte/s),接著第二條是當使用者uid為 21時,從本機(me)下載的tcp封包都使用編號1的pipe。
因為AnonymousFTP的使用者是ftp,它的預設uid為 21,所以這條規則會被套用在AnonymousFTPuser上。
setup 只適用於TCP封包,當封包中有SYNbits時就符合。
以上的說明只是manipfw中的一小部份。
如果你想要對ipfw更了解,例如如何使用ipfw來限制頻寬等,建議你manipfw。
不知道您看了這麼多的規則是否覺得眼花撩亂,如果不了解TCP/IP的原理,徹底了解ipfw 的設定還真不容易。
沒關係,我們下面將舉幾個簡單、常用的設定,這些範例應該夠平常使用了。
12.3.2範例 我將原本的/etc/rc.firewall備份成rc.firewal.old,並將它改成下列內容,請注意,這裡只是範例,只供參考: #設定我的IP myip="1.2.3.4" #設定對外的網路卡代號 outif="vr0" #設定對內的網路上代號 inif="vr1" #清除所有的規則 /sbin/ipfw-fflush #ThrowawayRFC1918networks ${ipfw}adddenyipfrom10.0.0.0/8toanyinvia${oif} ${ipfw}adddenyipfrom172.16.0.0/12toanyinvia${oif} ${ipfw}adddenyipfrom192.168.0.0/16toanyinvia${oif} #只允許內部網路對192.168.0.1使用telnet服務 /sbin/ipfwadd200allowtcpfrom192.168.0.1/24to192.168.0.1telnet #拒絕其他人連到port23,並記錄嘗試連線的機器 /sbin/ipfwadd300denylogtcpfromanytome23 #拒絕任何ICMP封包 /sbin/ipfwadd400denyicmpfromanytoany #下面這台機器是壞人,不讓它進來,並記錄下來 /sbin/ipfwadd1100denylogallfrom211.21.104.102toany #NAT的設定 /sbin/ipfwadddivertnatdallfromanytoanyviavr0 #限制內部網域對外下載最大頻寬為20KBytes/s,上傳最大頻寬為5KBytes/s ipfwpipe20configbw20KBytes/s ipfwaddpipe20ipfromanyto192.168.0.1/24out ipfwpipe30configbw5KBytes/s ipfwaddpipe30ipfrom192.168.0.1/24toanyin #允許本機對任何地方連線 /sbin/ipfwaddcheck-state /sbin/ipfwadd2000allowudpfrom${myip}toanykeep-state /sbin/ipfwadd2100passipfrom${myip}toany #允許外界使用郵件服務 /sbin/ipfwadd3000passtcpfromanyto${myip}25invia${outif} #不允許內部的IP從外部連進來 /sbin/ipfwadd1200adddenyipfrom${myip}/24toanyinvia${oif} #其他都拒絕,如果沒有在kernel中設定 #IPFIREWALL_DEFAULT_TO_ACCEPT則內定就有下列這一條 /sbin/ipfw65535adddenyallfromanytoany 存檔後就可以使用shrc.firewall來執行新的規則了。
如果您將規則放在/etc/rc.firewall中,則開機時會自動執行。
12.3.3一些小建議 在建立一個封包過濾的防火牆時,應該盡可能阻擋一些不必要的服務。
避免開放port1024以下的TCP服務,例如只通過SMTP封包(port 25)給郵件伺服器;拒絕所有UDP連線(只有少部份服務如NFS會用到);一些只有內部才會使用的服務,如資料庫等也不必對外開放。
另外,同樣的防火牆限制可以使用不同的語法來展現,應該要試著讓規則數量越少越好,以加快處理速度。
在更新firewall規則時,如果規則沒有寫好,而你又是以遠端登入的方式修改規則,很可能會因此無法繼續登入。
因此建議更新規則時最好在console 前執行,若迫不得已一定要使用遠端登入,建議您執行/usr/share/examples/ipfw/change_rules.sh這支程式來編輯規則: #cd/usr/share/examples/ipfw #shchange_rules.sh 接著會出現文書編輯軟體並最動載入/etc/rc.firewall 讓你編輯,結束離開後,會詢問是否要執行更新。
如果執行新的規則後造成斷線,它會自動載入舊的規則,讓我們可以再次連線。
12.4封包過濾橋接器 如果您有三台機器全部都有public IP,而您想使用其中一台做為防火牆,在不改變另外二台機器的設定下,我們可以使具封包過濾的橋接器來架設防火牆。
只要將這台橋接器放在另外二台和對外網路之間即可。
另外,當我們的內部網路有不同class的主機時,例如內部有140.115.2.3及140.115.5.6 這二台電腦時,就無法使用傳統的防火牆。
如果要在這二台機器連到網際網路中途中使用防火牆,我們必須使用新的方式,也可以使用這裡介紹的橋接器。
我們可以使用FreeBSD為橋接器,利用它來做封包過濾的動作,而絲毫不影響內部的主機原本的設定。
為了達到這個功能,我們必需要有二張支援 promiscuousmode的網路卡,現在的網路卡大部份都有支援。
二張網路卡當中,一張需要設定IP,另一張不需要。
至於您要將IP 設定在哪一張卡都可以,建議是設在對外的網路卡上。
首先,我們必須在核心中加入關於橋接器的設定: #支援橋接器 optionsBRIDGE #防火牆設定 optionsIPFIREWALL optionsIPFIREWALL_VERBOSE #我們這裡不將防火牆預設為接收所有封包 #optionsIPFIREWALL_DEFAULT_TO_ACCEPT 如果您要讓橋接器具有流量控制的功能,則可以加上之前提到的選項「optionsDUMMYNET」。
重新編譯核心後,在重開機前,我們先設定一下/etc/rc.conf: firewall_enable="YES" firewall_type="open" 還有一件事要做,當在乙太網路上跑IP協定時,事實上使用二種乙太網路協定,一個是IP,另一個是ARP。
ARP協定是當機器要找出給定IP 位址所對應的乙太網路位址時使用的。
ARP並不是IP層的一部份,只是給IP應用在乙太網路上運作。
標準的防火牆規則中並未加入對於ARP 的支援,幸運的是,高手們的在ipfirewall程式碼中加入了對封包過濾橋接器的支援。
如果我們在IP位址0.0.0.0上建立一個特別的UDP 規則,UDP埠的號碼將被使用來搭配被橋接封包的乙太網路協定號碼,如此一來,我們的橋接器就可以被設定成傳遞或拒絕非IP的協定。
請在/etc/rc.firewall 中接近文件頂端處理lo0的那三行之下(就是有寫Onlyinrarecasesdoyouwanttochangetheserules 的地方)加入下面一行: ${fwcmd}addallowudpfrom0.0.0.02054to0.0.0.0 現在我們就可以重新開機了。
重開機之後,先執行下列指令來啟動橋接器: 如果您使用的是FreeBSD4.x: #sysctl-wnet.link.ether.bridge_ipfw=1 #sysctl-wnet.link.ether.bridge=1 如果您使用的是FreeBSD5.x: #sysctl-wnet.link.ether.bridge.ipfw=1 #sysctl-wnet.link.ether.bridge.enable=1 現在我們可以將機器放在內外二個網域之間了。
因為我們之前在/etc/rc.conf 中,設定防火牆完全打開,不阻擋任何封包,所以放在二個網域之間時,運作應該沒有問題。
我們之前只設了一張網路上的 IP,而在執行了上述的指令之後,第二張網路卡便開始運作。
下一步就是將我們啟動橋接器的指令放在/etc/rc.local中,讓系統在開機時自動執行。
或者,我們可以在/etc/sysctl.conf 中加入下面二行: #如果您使用的是FreeBSD4.x net.link.ether.bridge_ipfw=1 net.link.ether.bridge=1 #如果您使用的是FreeBSD5.2以後的版本 net.link.ether.bridge.enable=1 net.link.ether.bridge.ipfw=1 接下來我們就可以依自己的需求在/etc/rc.firewall文件的最後面加上我們自己想要的防火牆規則了。
以下是一個簡單的設定規則,假設橋接器的IP 是140.115.75.137,內部有二台主機,一台提供網頁服務,一台是BBS: us_ip=140.115.75.137 basrv_ip=140.115.3.4 bbs_ip=140.115.5.6 oif=fxp0 iif=fxp1 ipfw="/sbin/ipfw" #Thingsthatwe'vekeptstateonbeforegettogothroughinahurry. ${ipfw}1000addcheck-state #ThrowawayRFC1918networks ${ipfw}1100adddenyipfrom10.0.0.0/8toanyinvia${oif} ${ipfw}1200adddenylogipfrom172.16.0.0/12toanyinvia${oif} ${ipfw}1300adddenylogipfrom192.68.0.0/16toanyinvia${oif} #允許橋接器本身所有想做的連線(keepstateifUDP) ${ipfw}1400addpassudpfrom${us_ip}toanykeep-state ${ipfw}1500addpassipfrom${us_ip}toany #允許內部網路任何想做的連線(keepstateifUDP) ${ipfw}1600addpassudpfromanytoanyinvia${iif}keep-state ${ipfw}1700addpassipfromanytoanyinvia${iif} #允許任何的ICMP連線 ${ipfw}1800addpassicmpfromanytoany #不允許使用port888連線 ${ipfw}2000adddenylogtcpfromanyto${bbs_ip}888 #TCPsection #任何地方都可以建立TCP連線 ${ipfw}3000addpasstcpfromanytoanyvia${oif} #Passthe"quarantine"range. ${ipfw}3100addpasstcpfromanytoany49152-65535invia${oif} #Passidentprobes.It'sbetterthanwaitingforthemtotimeout ${ipfw}3200addpasstcpfromanytoany113invia${oif} #PassSSH. ${ipfw}3300addpasstcpfromanytoany22invia${oif} #PassDNS.當內部網路有名稱伺服器時才需要 #${ipfw}addpasstcpfromanytoany53invia${oif} #只傳遞SMTP給郵件伺服器 ${ipfw}3400addpasstcpfromanyto${bbs_ip}25invia${oif} ${ipfw}3500addpasstcpfromanyto${basrv_ip}25invia${oif} #UDPsection #Passthe"quarantine"range. ${ipfw}4000addpassudpfromanytoany49152-65535invia${oif} #PassDNS.當內部網路有名稱伺服器時才需要 #${ipfw}4100addpassudpfromanytoany53invia${oif} #其他的都拒絕 ${ipfw}60000adddenyipfromanytoany
延伸文章資訊
- 1通訊埠轉發Port Forwarding 設定教學:如何從外面連回家中 ...
通訊埠轉發Port Forwarding 設定教學:如何從外面連回家中NAS? · 1 通訊埠轉發(Port Forwarding)的用途 · 2 如何設定通訊埠轉發 · 3 家裡有兩台NAS ...
- 2[WAN]如何使用ASUSWRT 設定port forwarding? | 官方支援
- 3第十二章NAT 及防火牆 - twbsd.org
Port Forwarding 的功能是將外部連線轉向到內部的電腦。所以,如果您從內部電腦連到NAT 伺服器時,並不會被轉向到內部IP 喔。 12.3 防火牆.
- 4[教學]如何設定路由器的通訊埠轉發(Port Forwarding)?
開port教學,大家都在找解答。 本篇文章將會介紹路由器的通訊埠轉發(Port Forwarding)的詳細步驟,這些步驟... 查看路由器的IP Address,按照下圖在網絡和共用中心中 ...
- 5[教學]如何設定路由器的通訊埠轉發(Port Forwarding)?
[教學] 如何設定路由器的通訊埠轉發(Port Forwarding)? · 詳細步驟(以Windows 8.1 及小米路由器mini 作範例) · 總結 · 相關文章.