用Linux實現路由器和包過濾防火牆

來源:互聯網
上載者:User
用Linux實現路由器和包過濾防火牆

【路由器和防火牆】
路由器是一種廣泛運用在IP網段之間的裝置,市場上有許多現成的產品。在應用中,我們經常將路由器跨接在廣域網路和區域網路之間,大多數的路由器產品也就是基於這種需要來設計的。但是隨著使用者IP網路的擴充,我們需要一種能夠在多個乙太網路絡之間進行定址的路由器,傳統的路由器產品中偶爾有幾款雙乙太網路絡介面的,但是這樣的產品價格尤其昂貴,而且要是支援快速乙太網路絡應用的話價格將是天文數字;第三層交換器可以實現這樣的功能,但是第三層交換器也不是便宜的傢伙。
路由器工作的時候,根據它的某個連接埠收到的資料包的目的IP地址,查詢路由器自己的路由表,然後決定將資料包轉寄到相應的連接埠。路由器的路由表有幾種:一種是根據路由器自己的每個連接埠IP地址和子網路遮罩計算出來的路由,這種路由叫做“固定路由”;第二種是有系統管理員種設定的到某個子網需要通過某個下一級路由器的路由,這種叫“靜態路由”;還有就是在網路環境中讓每個路由器都把自己的路由資訊廣播出去,讓路由器之間進行互相學習,這樣學到的路由就叫做“動態路由”。路由器還會把目的地址不在自己路由表中的資料包固定轉寄給一個預先設定IP地址,這樣的路由設定又叫“預設路由”。在路由匹配的過程中,一般有這樣的優先順序:固定路由>靜態路由>動態路由>預設路由。
路由器只會查看IP資料包的目的地址,也就是說原則上它是“照單全收”,而且全部轉寄,除非真的發不出去了。如果讓路由器在轉寄資料包的時候,加一項檢查,檢查資料包的來源和資料包要求的應用程式層服務類型,根據預先設計的規則來判定這個資料包是應該轉寄還是作別的處理,這樣這個路由器就不再是一個單純意義上的路由器,而是一種類型的防火牆——包過濾防火牆。
包過濾防火牆可以檢查資料包的來源、源連接埠、目的地址、目的連接埠,使用的傳輸層協議類型等項目,根據檢查的項目的內容來匹配一個規則表,當符合規則表中的定義的時候,就執行規則表事先定義的*作。一般來說,規則表可以定義這樣的*作:ACCEPT(通過)、NAT(MASQ地址轉換)、DENY(丟棄)、REJECT(拒絕,同時回送‘不可用’訊息給源端)。
當然目前市場上也能買到支援包過濾防火牆的現成產品,但是價格問題還是我們不得不考慮的重要因素。尤其大多數產品都有許多許可證、效能等方面的限制。
Linux*作系統應運IP網路而生,除了Linux價格上的優勢之外,更迷人的是它內建的強大的網路功能,除了做各種Internet上的應用服務之外,Linux還提供了完整的路由器功能和防火牆功能。而它所帶來的系統造價和功能的比例是相當誘人的,為什麼不一試呢?
【Linux系統的準備】
相對於現成的路由器產品,我們把這樣的路由器稱為“軟路由器”,當然這樣做出來的路由器效能絕對不會比“硬體路由器”的效能差,我們只要明白比如很多“25××”系列的路由器才只是採用25M主頻的摩托羅拉68030CPU(效能相當於Intel 80386)我們就知道了。
用來做“軟體路由器”的Linux系統主機硬體設定要求並不是太高,用作三五個區域網路之間的路由選擇,數百台電腦的話,選用奔騰133以上的主機就足夠了,當然現在的市場上賽楊2或者奔騰4或者其他的CPU也不是很貴;配置64M記憶體,有條件的話可以配置到128M也無所謂;硬碟就不要太大了,否則也是浪費.
關鍵在於網路介面卡的配置,Linux系統支援大多數市場上能見到的乙太網路絡適配器,PCI卡的安裝比較簡單,只要核心支援,在開機的時候有多少卡都會被系統正確的識別出來。ISA卡的安裝也不複雜,詳細可以參考我以前的一篇文章
www.nyfzns.net www.520cat.com
下面是我在實際使用過的能夠正常工作的網卡:
★Intel EtherExpress Pro PCI100M
★RealTek 8029/8139 PCI 10M/100M
★D-link 系列 (使用Tulip 2114X驅動) PCI 10M
★ACCTON EN1207 (使用Tulip 2114X驅動) PCI 100M
★3COM全系列 (PCI/ISA 10M/100M)
★AMD PC-NET 32 PCI 10M
★大部分NE2000相容網卡,Topstar、Dlink、ACCTON、SN2000等等
★HardLink PCMCIA 筆記本專用網卡 10M
當然Linux能支援的網卡遠遠不止這些.
將網卡驅動加掛到Linux中有幾種方法,最常用的是用modprobe系統工具加掛一個核心模組,比如載入一個NE2000相容網卡的驅動可以這樣:
#modprobe ne io=0x300
其實大多數的PCI網卡並不需要指定IO位址範圍,就像載入一個ACCTON的EN1207c網卡可以這樣:
#modprobe tulip
將網卡驅動編譯到Linux核心中是一種最高效的做法,在編譯Linux核心的時候,使用
#make menuconfig
代替很多老資料上提到的“#make config”,這樣就會得到一個菜單,在菜單中“Network Device”選項下選定指定的網路介面卡的驅動程式,編譯完成以後就會得到一個完整的支援相應網卡的Linux核心。
對於很多系統只能識別一個的網卡,將第二個以後的網卡參數寫在/etc/lilo.conf中是最佳做法,這裡有一個系統中安裝呢4塊網卡,一個是PCI的RealTek 8139,另外3個是NE2000,這樣的話系統就識別8139網卡以後就不會自動識別後面的三個ISA卡,我們需要在/etc/lilo.conf中加上這樣一句:
append=-ether=3,0x240,eth1 ether=11,0x300,eth2 ether=4,0x260,eth3-
在編譯核心的過程中,我們可以在Network option中選擇“optimize as router not host”,這樣系統就會按照路由器而不是主機的方式進行最佳化,同時,還可以根據具體的需要選擇上“ Fast switching”和“ Forwarding between high speed interfaces”以及“ advanced router”。如果我們還計劃在這個機器上實現包過濾防火牆,那麼選擇上“ firewalling”和“ IP: masquerading”以及與“IP MASQ”相關的選擇項。
編譯核心的全部過程請參看“Linux Kernel Howto”。http://howto.fhlfox.dhs.org/online....鬧形木迪癜姹盡?/a>
注意查看開機的系統提示或者使用dmesg命令可以看到系統是不是正常識別並且啟動相應的網卡的驅動程式,在上面例子中提到的具有一個Realtek8139網卡,三個NE2000網卡的機器上我們能夠看到這樣的情況:
rtl8139.c:v1.07 5/6/99 Donald Becker http://cesdis.gsfc.nasa.gov/linux/drivers/r
tl8139.html
eth0: RealTek RTL8139 Fast Ethernet at 0x6000, IRQ 9, 00:e0:4c:dd:5f:85.
ne.c:v1.10 9/23/94 Donald Becker (becker@cesdis.gsfc.nasa.gov)
NE*000 ethercard probe at 0x240: 00 40 05 1f 60 9a
eth1: NE2000 found at 0x240, using IRQ 3.
NE*000 ethercard probe at 0x300: 00 40 05 22 08 65
eth2: NE2000 found at 0x300, using IRQ 11.
NE*000 ethercard probe at 0x260: 00 40 05 23 59 0f
eth3: NE2000 found at 0x260, using IRQ 4.
然後是配置每個網路連接埠的IP地址,當然我們可以使用*作系統的一些對話方塊來配置第一個網卡的參數,但是一個有經驗的網路系統管理員一般是不這樣做的,因為這樣不能配置其他的網卡,我們必須學會用這個命令來配置第一塊網卡:
#ifconfig eth0 10.3.3.3 netmask 255.255.255.0 broadcast 10.3.3.255
第二塊網卡的名字就是eth1,其他依次是eth2,eth3等等。
由於電腦體繫結構的限制,在一個普通PC主板上只有一個PCI控制器,而一個PCI控制器最多隻能同時支援4個PCI裝置,當然某些專用伺服器上可能有支援兩個以上的PCI控制器。ISA網卡的安裝受到系統中斷號的限制,單CPU的系統中只有16個可用的IRQ號,扣除硬碟、記憶體、鍵盤、顯示卡等硬體已經所剩無幾,所以一般也是安裝4個卡,當然,雙CPU的系統可以有256個中斷號可用,這樣就寬裕了許多。
另外,我們還需要開啟Linux系統的IP轉寄開關,這一點非常容易,執行這一條指令:
echo 1 > /proc/sys/net/ipv4/ip_forward
當然這些配置命令最好是放到/etc/rc.d/rc.local中,這樣就不用每次開機以後重新設定了。
【Linux實現路由器】
正確配置網卡和相應的IP地址等參數以後,系統就自動計算出了每個連接埠所接的子網的固定路由,在這樣的一個例子中我們可以看到:
我們可以用命令“route -n”或者“netstat -r -n”來查看系統目前的路由表,在右邊圖二所示的例子中,我們可以得到這樣的路由表:
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.3.2.4 0.0.0.0 255.255.255.252 U 0 0 0 eth0
10.3.2.128 0.0.0.0 255.255.255.128 U 0 0 0 eth3
10.3.253.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
其中Destination項表示目的網路,其大小可以通過子網路遮罩(Genmask)計算出來,Flags項表示這個網段是否直接連接的,“U”就是直接可用的意思,Metric是級跳,Ref是優先順序參考,Use Interface是串連的連接埠,Gateway欄目在需要其他路由器轉寄的時候指明下一級路由器的地址。
使用命令route同時還可以建立或者刪除一個靜態路由,使用這樣的格式:
#route add -net 目標子網地址 netmask 目標子網路遮罩 gw 下一級路由器的地址
同理,使用
#route del -net 目標子網地址 netmask 目標子網路遮罩 gw 下一級路由器的地址
可以設定靜態路由。
使用
#route add default gw 網關地址
或者
# route add -net 0.0.0.0 netmask 0.0.0.0 gw 網關地址
我們把路由設定命令加到/etc/rc.d/rc.local中,以便其能夠在下次啟動的時候自動的運行所有路由設定命令。
如下是上面例子中提到的4個網路出口的Linux路由器中的靜態路由設定命令,這就是在/etc/rc.d/rc.local檔案中的片斷:
route add -net 202.102.247.0 netmask 255.255.255.192 gw 172.16.80.82
route add -net 10.56.0.0 netmask 255.255.0.0 gw 172.16.80.10
route add -net 192.168.100.0 netmask 255.255.255.0 gw 172.16.80.86
route add -net 192.168.101.0 netmask 255.255.255.0 gw 172.16.80.88
route add -net 10.68.0.0 netmask 255.255.0.0 gw 10.3.2.129
route add -net 172.28.0.0 netmask 255.255.0.0 gw 172.16.80.82
route add default gw 10.3.2.5 (這一條加的是預設路由)
由這些命令建立的靜態路由加上原來由IP地址計算出來的固定路由以後,路由表就變成了這樣:
# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
10.3.2.4 0.0.0.0 255.255.255.252 U 0 0 0 eth0
202.102.247.0 172.16.80.82 255.255.255.192 UG 0 0 0 eth1
10.3.2.128 0.0.0.0 255.255.255.128 U 0 0 0 eth3
192.168.100.0 172.16.80.86 255.255.255.0 UG 0 0 0 eth1
192.168.101.0 172.16.80.88 255.255.255.0 UG 0 0 0 eth1
10.3.253.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
10.68.0.0 10.3.2.129 255.255.0.0 UG 0 0 0 eth3
172.28.0.0 172.16.80.82 255.255.0.0 UG 0 0 0 eth1
172.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
10.56.0.0 172.16.80.10 255.255.0.0 UG 0 0 0 eth1
0.0.0.0 10.3.2.5 0.0.0.0 UG 0 0 0 eth0
【做防火牆的系統準備】
包過濾防火牆比起路由器來說就是在轉寄資料包的時候多了一個規則表的檢測,按照規則表的定義決定資料包的命運。可以說,路由器其實就是一個允許所有資料包正常通過的“防火牆”。
防火牆還有一個很重要的功能就是保護一個內部的子網,以及將內部的私人地址轉換成外部的IP地址,這個功能不但可以對內部網路起到保護作用,還可以節省IP地址資源,或者用來使一個本來不能被某裝置識別的某網段IP能夠實現對它的訪問。這樣的技術叫做NAT(網路地址翻譯),實現的方式很多,直接在路由層次上實現是效率最高的。CISCO的PIX就是這樣技術的商用產品的代表。
Linux的IP-MASQ(IP偽裝)就是這樣技術在Linux上的一個實現.
當一個主機發起一個對其他主機的TCP/IP訪問, 它必須在資料包的前序中指明對方的IP地址,以及對方提供串連的TCP/UDP連接埠,同時它會開啟一個臨時的連接埠準備接受返回的資料,然後把它自己的IP地址以及這個臨時連接埠寫到IP資料報的前序中。當一個資料包被NAT處理的時候,它的源地址將被替換成防火牆的出連接埠上的IP(有些防火牆產品使用位址集區),同時NAT防火牆上也會在出連接埠上開放一個臨時連接埠,將這個連接埠號碼替換資料包中的源連接埠號碼。當回應資料到來的時候,由於外部的主機只能看到NAT防火牆的IP和連接埠號碼,它發出的資料的目的地址和連接埠將是防火牆上的,而資料回來到防火牆以後,防火牆就把原來的內部主機的地址和連接埠號碼替換回來,將資料包轉到內部網路上傳送。
而在NAT防火牆上,還需要建立一個此次地址轉換的對應關係表。以便知道隨後到來的源、回應資料包應該被怎樣的替換回來。
由於包過濾防火牆的所有*作都是根據規則表來的,所以規則表就顯得格外的重要。我們使用一個叫ipchains的工具來維護系統規則表,ipchains把規則表叫做防火鏈。當一個資料包進入Linux機器時,要通過進入鏈(input)的檢查,當一個Linux機器準備發送一個資料包時,這個包又要通過輸出鏈(output)的檢查,當作為路由器使用的時候,還要點所有中轉的資料包增加一道中轉鏈(forward)的檢查,每個鏈都可以配置自己的規則表。所以,其實一個通過Linux防火牆的資料包需要經過input、forward、output三個規則的檢查,當這個Linux作為普通路由器使用的時候,三個鏈的規則都是ACCEPT(允許通過)。
這是一個需要中轉的資料包通過ipchains的過程:
在規則表中,資料包總是先和第一條規則進行匹配,如果不匹配在比較下一條規則,一旦某條規則適應了,就不再比較,直接按此規則執行,所以排列在前面的規則總是優先與排列在後面的規則。
【用ipchains建立規則表】
使用命令
ipchains -P 鏈名 動作
可以改變一個鏈的預設規則,其中可以使用的鏈名有“input”、“forward”、和“output”。可以使用的動作有“ACCEPT”、“DENY”、“REJECT”。一般來說,預設規則是當一個資料包不能匹配所有的規則的時候的最後動作,當然這是優先順序最低的一條規則了。系統預設的三個鏈的規則都是允許。也就是“ACCEPT”。一般來說,我們做防火牆的話,主要是控制通過防火牆的資料包,所以我們一般在中轉鏈上設定規則,而把進入鏈和外出鏈設定為“ACCEPT”。通常我們需要把所有不匹配規則的資料包禁止,所以我們可以用這樣的命令把中轉鏈的預設規則改成“丟棄”:
#ipchains -P forward DENY
增加一條規則使用這樣的文法:
ipchains -A 鏈名 -s 源網路/掩碼 -d 目的網路/掩碼 -p 傳輸層協議 連接埠 -j 動作
源網路和目的網路地址用子網的網路地址來表示,掩碼可以使用點分十進位,也可以使用一個表示“1”的個數的數字來代替,比如說“255.255.255.0”可以表示為“24”,用“0.0.0.0/0”可以表示所有的地址,用“IP地址/32”表示一個主機。這個地方的動作可以是“ACCEPT”、“DENY”、“REJECT”,在中轉鏈中要是使用IP偽裝的話,動作可以寫成“MASQ”。如果不檢查傳輸層協議(tcp/udp/icmp)的話,就不能再檢查連接埠號碼,這時可以這樣寫:
ipchains -A 鏈名 -s 源網路/掩碼 -d 目的網路/掩碼 -j 動作
這樣的設定將對所有的符合源地址和目的地址的資料包生效。比如說我們現在要設定允許子網10.3.2.0/255.255.255.128和子網202.102.247.0/255.255.255.192的互相訪問,可以這樣設定:
#ipchains -A forward -s 10.3.2.0/25 -d 202.102.247.0/26 -j ACCEPT
但是在實際的使用中這樣設定並不會讓兩個子網通起來,因為網路傳輸是雙向的,只有一個方向通了還不能算是通,由於forward的預設規則已經是DENY,返回的資料包將會因為匹配不了規則而被丟棄,所以我們需要再設定一條反向的許可規則:
#ipchains -A forward -s 202.102.247.0/26 -d 10.3.2.0/25 -j ACCEPT
其實我們可以使用-b的選項來一次設定雙向的兩條規則:這樣的命令等價於剛才的兩條命令:
#ipchains -A forward -b -s 10.3.2.0/25 -d 202.102.247.0/26 -j ACCEPT
只有一種情況例外,由於IP偽裝回來的資料包不經過中轉鏈,所以不需要再中轉鏈中只需要為IP偽裝設定一個單向的規則,比如說把所有從10.3.2.0/25來訪問172.16.0.0/16的資料包都做一個偽裝,那麼就可以這樣設定:
#ipchains -A forward -s 10.3.2.0/25 -d 172.16.0.0/16 -j MASQ
而這樣的設定並不需要反向的規則。
這是一個禁止10.3.2.0/25的網路的電腦訪問202.102.247.50的telnet連接埠(TCP23)的設定:
#ipchains -A forward -s 10.3.2.0/25 -d 202.102.247.50/32 -p tcp 23 -j DENY
當然,在進入鏈或者在外出鏈上做的規則對於中轉資料一樣有效,這樣的設定可以禁止10.3.2.0/25網段上的IP地址訪問OICQ(UDP8000連接埠):
#ipchains -A input -s 10.3.2.0/25 -d 0.0.0.0/0 -p udp 8000 -j DENY
從前面的圖上可以看出,在進入鏈上的規則要優先於中轉鏈上的規則,而外出鏈上的規則優先順序是最低的。
刪除規則有兩種做法,一個是先數出改規則在表中的位置,然後用命令
#ipchains -D 鏈名 序號
來刪除它,比如說刪除中轉鏈的第5條規則可以這樣寫:
#ipchains -D forward 5
還有一種辦法就是把建立規則中的“-A”直接改成“-D”來刪除由這條“-A”的命令建立的規則。
#ipchains -D input -s 10.3.2.0/25 -d 0.0.0.0/0 -p udp 8000 -j DENY
這樣的話這個子網的電腦又可以訪問OICQ了。而用命令ipchains -F可以清除系統全部的規則表,但是不會改變鏈的預設規則。
用命令ipchains -L -n可以查看系統目前的規則表:這是前面所說的4個網卡的防火牆實際的規則表,當然,看起來它是比較複雜的:
d# ipchains -L -n
Chain input (policy ACCEPT):
target prot opt source destination ports
DENY all ------ 202.102.247.0/25 10.3.2.4 n/a
DENY all ------ 172.16.0.0/16 10.3.2.4 n/a
DENY all ------ 172.16.0.0/16 10.3.253.3 n/a
DENY all ------ 202.102.247.0/25 10.3.253.3 n/a
Chain forward (policy DENY):
target prot opt source destination ports
MASQ all ------ 202.102.247.0/25 10.3.253.1 n/a
ACCEPT all ------ 10.3.2.0/24 10.3.253.0/24 n/a
ACCEPT all ------ 10.3.253.0/24 10.3.2.0/24 n/a
ACCEPT all ------ 10.3.2.0/24 202.102.247.0/25 n/a
ACCEPT all ------ 202.102.247.0/25 10.3.2.0/24 n/a
ACCEPT all ------ 10.3.2.0/24 172.16.0.0/16 n/a
ACCEPT all ------ 172.16.0.0/16 10.3.2.0/24 n/a
ACCEPT all ------ 10.3.253.0/24 172.16.0.0/16 n/a
ACCEPT all ------ 172.16.0.0/16 10.3.253.0/24 n/a
ACCEPT all ------ 10.3.253.0/24 202.102.247.0/25 n/a
ACCEPT all ------ 202.102.247.0/25 10.3.253.0/24 n/a
ACCEPT all ------ 10.3.253.0/24 10.56.0.0/16 n/a
ACCEPT all ------ 10.56.0.0/16 10.3.253.0/24 n/a
ACCEPT all ------ 172.16.0.0/16 202.102.247.0/25 n/a
ACCEPT all ------ 202.102.247.0/25 172.16.0.0/16 n/a
ACCEPT all ------ 10.56.32.0/25 202.102.247.0/25 n/a
ACCEPT all ------ 202.102.247.0/25 10.56.32.0/25 n/a
ACCEPT all ------ 202.102.247.0/25 10.68.0.0/16 n/a
ACCEPT all ------ 10.68.0.0/16 202.102.247.0/25 n/a
ACCEPT all ------ 172.16.0.0/16 10.68.0.0/16 n/a
ACCEPT all ------ 10.68.0.0/16 172.16.0.0/16 n/a
ACCEPT all ------ 10.3.253.0/24 10.68.0.0/16 n/a
ACCEPT all ------ 10.68.0.0/16 10.3.253.0/24 n/a
MASQ all ------ 202.102.247.0/25 10.3.253.1 n/a
MASQ all ------ 172.16.0.0/16 10.3.253.1 n/a
MASQ all ------ 192.168.0.0/16 10.3.253.1 n/a
MASQ all ------ 10.56.32.0/24 10.3.253.1 n/a
MASQ all ------ 202.102.247.0/25 202.102.247.128/25 n/a
MASQ all ------ 172.16.0.0/16 202.102.247.128/25 n/a
MASQ all ------ 192.168.0.0/16 202.102.247.128/25 n/a
MASQ all ------ 10.56.32.0/24 202.102.247.128/25 n/a
MASQ all ------ 172.16.0.0/16 0.0.0.0/0 n/a
MASQ all ------ 10.56.32.0/25 0.0.0.0/0 n/a
MASQ all ------ 192.168.0.0/16 0.0.0.0/0 n/a
ACCEPT all ------ 10.3.253.0/24 0.0.0.0/0 n/a
ACCEPT all ------ 0.0.0.0/0 10.3.253.0/24 n/a
Chain output (policy ACCEPT):
其中,我把對於某些主機的訪問限制設定在了進入鏈中,這樣優先順序高一些。
同樣我們可以把建立規則的命令寫入/etc/rc.d/rc.local中,但是一旦我們把一個防火牆系統調試成功以後,我們還需要把已經建立的規則記下來,重新寫到rc.local中,這樣的*作是很容易出錯的。其實我們可以用命令ipchains-save 把規則表儲存到一個檔案,就像這樣:
#ipchains-save >/root/ipchains
把現在正在啟動並執行規則表儲存到了/root/ipchains檔案當中去了,然後把恢複規則表的命令:
/sbin/ipchains-restore < /root/ipchains
寫到/etc/rc.d/rc.local中。
用ipchains-save儲存的檔案有這樣的格式:
:input ACCEPT
:forward DENY
utput ACCEPT
-A forward -s 172.28.0.0/255.255.0.0 -d 202.102.247.0/255.255.255.128 -j ACCEPT
-A forward -s 172.28.0.0/255.255.0.0 -d 0.0.0.0/0.0.0.0 -j MASQ
要在規則表的中間插入一條規則的時候,我們可以很方便的編輯它,然後用“ipchains -F”清除運行中的規則表,再用“ipchains-restore < 檔案名稱”來恢複規則。
【設定防火牆中不應該被過濾的資訊】
我們設定防火牆的時候,總是要想辦法過濾我們所不能識別的東西,但有些資訊對於網路的運行來說是必須的,一般正常情況下不能被過濾,否則將影響網路的正常運行,而這一點又是初學的系統管理員經常忽略的內容。
ICMP,很多系統管理員過濾ping,主要使因為可以用ping把一些網路線路頻寬比較窄的地方堵塞,為了貪圖省事,就把整個ICMP過濾了。但是其實 ICMP 包還被用來為其它協議(TCP, UDP)指示錯誤。 如: “destination-unreachable” 等等。這些資訊被過濾的話意味這你將不會收到 “Host unreachable”或者“No route to host” 等報錯資訊, 所有的串連將等待一個永不會來的回複。將會使客戶機花費很長的一段時間等候TCP/IP協議的逾時。 這樣做雖然不好, 但還不致命。
一個更糟的問題是 ICMP 包在“MTU (傳輸單元最大值)測試”中擔任角色。 為良好的完成 TCP 串連,主機會使用“ MTU測試”去算出不被分解成片段就可以到達目的地的最大包。 “MTU測試”是這樣工作的: 發送帶有“Don‘t Fragment(不分解成片段)位”的包, 如果收到 “Fragmentation needed but DF set(包需要分解成片段)”包,那麼就發送較小的包;如果禁止了ICMP資訊,本地主機將不會減小 MTU, 測試就將永遠進行或沒有意義。如果網路上存在MTU不一致的網段,這樣將會極大的影響網路效能。
正確過濾ping的做法是過濾ICMP的0號和8號連接埠:
#ipchains -A input -s 0.0.0.0/0 -d 0.0.0.0/0 -p icmp 0 -j DENY
#ipchains -A input -s 0.0.0.0/0 -d 0.0.0.0/0 -p icmp 8 -j DENY
TCP的53連接埠,我們知道,一般來說DNS系統翻譯使用的UDP的53連接埠,但是DNS協議在UDP不能正常響應的時候會自動該用TCP協議來進行串連,如果在一個全部過濾TCP所有協議的網路上工作,會導致所有UDP協議也得不到正確的網域名稱解析。
有些時候,FTP協議會使用21之外其他的連接埠來傳送一些輔助的資訊,所以在處理FTP協議的時候,我們需要更多的瞭解FTP的實現機制。
【應用執行個體】
設定一個辦公子網能夠訪問資訊服務子網,但是訪問外部需要地址翻譯:
辦公子網:192.168.0.0-->192.168.0.255
資訊子網:202.102.247.0-->202.102.247.63
其中資訊子網和Internet互聯,出口網關地址是202.102.247.33
首先需要在防火牆上設定出口路由:
route add default gw 202.102.247.33
防火鏈的設定如下:
ipchains -P forwar DENY
ipchains -A forward -b -s 192.168.0.0/24 -d 202.102.247.0/26 -j ACCEPT
ipchains -A forward -s 192.168.0.0/24 -d 0.0.0.0/0 -j MASQ
在湖南省xxx高等專科學校的校園網路上,我們一共有9個子網,5個互聯出口,中間就使用了Linux+ipchians的防火牆來進行互聯和存取控制,使用了4台這樣的主機,有些機器上的路由表和規則表已經配置得比較複雜。但系統的投資很小,實際使用的效果也很好。

出處:諾亞方舟
作者:www0148_cn www0148_cn@21cn.com

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.