iptables的啟動和關(guān)閉
iptables的啟動和關(guān)閉:
1.啟動和關(guān)閉iptables
下面將正式使用iptables來創(chuàng)建防火墻。啟動和關(guān)閉iptables的方法取決于所使用的Linux發(fā)行版,可以先查看所使用Linux版本的文檔。
一般情況下,iptables已經(jīng)包含在Linux發(fā)行版中,運行iptables --version來查看系統(tǒng)是否安裝了iptables。在Red Hat 9.0中,安裝的版本是iptables v1.2.7a。如果系統(tǒng)沒有安裝iptables,則可以從netfilter官網(wǎng)下載。
2.查看規(guī)則集
上面僅對iptables的用法做了一個簡單介紹,使用中可以運行man iptables來查看所有命令和選項的完整介紹,或者運行iptables -help來查看一個快速幫助。要查看系統(tǒng)中現(xiàn)有的iptables規(guī)劃集,可以運行以下命令:
- iptables --list
下面是沒有定義規(guī)劃時iptables的樣子:
- Chain INPUT (policy ACCEPT)
- target prot opt source destination
- Chain FORWARD (policy ACCEPT)
- target prot opt source destination
- Chain OUTPUT (policy ACCEPT)
- target prot opt source destination
如上例所示,每一個數(shù)據(jù)包都要通過三個內(nèi)建的鏈(INPUT、OUTPUT和FORWARD)中的一個。
filter是最常用的表,在filter表中最常用的三個目標是ACCEPT、DROP和REJECT。DROP會丟棄數(shù)據(jù)包,不再對其進行任何處理。REJECT會把出錯信息傳送至發(fā)送數(shù)據(jù)包的主機。
圖1 Red Hat 9.0中安全設置的GUI工具
在Red Hat 9.0中,提供一個GUI程序來讓用戶對系統(tǒng)的安裝級別進行簡單的配置。該工具的啟動方法是:主選單→系統(tǒng)設置→安全工具(如圖1所示)。在此將安全級別設為“高級”,并選擇使用默認的防火墻規(guī)則。點擊確定后,再用iptables -list顯示,發(fā)現(xiàn)iptables與沒有定義規(guī)則前已經(jīng)有很大不同,如下所示:
- [root@workstation root]# iptables --list
- Chain INPUT (policy ACCEPT)
- target prot opt source destination
- RH-Lokkit-0-50-INPUT all -- anywhere anywhere
- Chain FORWARD (policy ACCEPT)
- target prot opt source destination
- RH-Lokkit-0-50-INPUT all -- anywhere anywhere
- Chain OUTPUT (policy ACCEPT)
- target prot opt source destination
- ......
現(xiàn)實中一般不使用這個GUI工具,因為它的功能有限,也不夠透明。相比較而言,SuSE 9.0中相應的配置工具要好得多,它可以在GUI下對防火墻進行更加細化的配置(比如增加了IP轉(zhuǎn)發(fā)和偽裝等功能的配置)。盡管這樣,一般還是自己來增加和刪除規(guī)則。
圖2 SuSE 9.0中YaST配置工具中的防火墻設置
3.增加規(guī)則
本例中的規(guī)則將會阻止來自某一特定IP范圍內(nèi)的數(shù)據(jù)包,因為該IP地址范圍被管理員懷疑有大量惡意攻擊者在活動:
- # iptables -t filter -A INPUT -s 123.456.789.0/24 -j DROP
也可以很輕易地阻止所有流向攻擊者IP地址的數(shù)據(jù)包,該命令稍有不同:
- # iptables -t filter -A OUTPUT -d 123.456.789.0/24 -j DROP
注意這里的A選項,如前所述,使用它說明是給現(xiàn)有的鏈添加規(guī)則。
4.刪除規(guī)則
網(wǎng)絡上的惡意攻擊者總是在變化的,因此需要不斷改變IP。假設一個網(wǎng)上攻擊者轉(zhuǎn)移到新的IP地址,而其老的IP地址被分配給一些清白的用戶,那么這時這些用戶的數(shù)據(jù)包將無法通過你的網(wǎng)絡。這種情況下,可以使用帶-D選項的命令來刪除現(xiàn)有的規(guī)則:
- # iptables -t filter -D OUTPUT -d 123.456.789.0/24 -j DROP
5.缺省的策略
創(chuàng)建一個具有很好靈活性、可以抵御各種意外事件的規(guī)則需要大量的時間。對于那些沒有時間這樣做的人,最基本的原則是“先拒絕所有的數(shù)據(jù)包,然后再允許需要的”。下面來為每一個鏈設置缺省的規(guī)則:
- # iptables -P INPUT DROP
- # iptables -P FORWARD DROP
- # iptables -P OUTPUT ACCEPT
這里選項-P用于設置鏈的策略,只有三個內(nèi)建的鏈才有策略。這些策略可以讓信息毫無限制地流出,但不允許信息流入。很多時候需要接收外部信息,則可使用以下命令:
- # iptables -t filter -A INPUT -s 123.456.789.0/24 -j ACCEPT
6.SYN的使用
不能關(guān)閉所有端口,也不能只指定某些端口處于打開狀態(tài),那么怎樣才能設置一個有效的規(guī)則,既可以允許普通用戶正常通過,又可以阻止惡意攻擊者訪問網(wǎng)絡呢?
剛開始使用iptables的人可以充分利用syn標識來阻止那些未經(jīng)授權(quán)的訪問。iptables只檢測數(shù)據(jù)包的報頭,事實上,除iptables以外,很多其它有用的數(shù)據(jù)包分析都是基于報頭的。比如,在進行Web沖浪時,一個請求從你的PC發(fā)送至其它地方的Web服務器上,該服務器會響應請求并發(fā)回一個數(shù)據(jù)包,同時得到你系統(tǒng)上的一個臨時端口。與響應請求不同的是,服務器并不關(guān)心所傳送的內(nèi)容??梢岳眠@種特點來設置規(guī)則,讓它阻止所有沒有經(jīng)過你系統(tǒng)授權(quán)的TCP連接:
- # iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP
這里的-i指的是網(wǎng)卡,-p則是指協(xié)議,--syn則表示帶有syn標識設置的TCP數(shù)據(jù)包。SYN用于初始化一個TCP連接,如果自己機器上沒有運行任何服務器,別人也就不會向你發(fā)送SYN數(shù)據(jù)包。
7.有狀態(tài)的數(shù)據(jù)包的檢測
前邊的例子把每一個數(shù)據(jù)包看成是獨立的,而不是相互關(guān)聯(lián)的,依靠的是數(shù)據(jù)包的頭信息。iptables會檢查數(shù)據(jù)包的源和目的IP地址、源和目的端口、流入數(shù)據(jù)包的順序號、TCP先后順序的信息及頭標記(SYN、ACK、FIN、RST等)的狀態(tài),即它會跟蹤整個連接會話,從而使整個過濾過程是相互關(guān)聯(lián)的。
8.共享一個Internet連接
網(wǎng)絡地址翻譯和IP偽裝都可以實現(xiàn)多臺主機共享一個Internet連接,這個局域網(wǎng)可以是Linux和Windows系統(tǒng)組成的多系統(tǒng)局域網(wǎng)。假設現(xiàn)在有一臺機器,配有兩個網(wǎng)卡,其中eth0為“公共”網(wǎng)卡,eth1為“私有”網(wǎng)卡,即eth0被分配了一個靜態(tài)的、可路由的IP地址,而eth1被分配了一個私有的、不能路由的IP,該IP是屬于該局域網(wǎng)子網(wǎng)的。要實現(xiàn)上述功能,需要向nat和filter表中添加一些鏈:
- # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
- # iptables -t filter -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
- # iptables -t filter -A FORWARD -i eth1 -o eth0 -j ACCEPT
這顯示了有狀態(tài)的數(shù)據(jù)包檢測的價值。請注意,這里是如何實現(xiàn)流入數(shù)據(jù)包只有在屬于一個已經(jīng)存在的連接時才被允許,而所有來自局域網(wǎng)內(nèi)流向外的數(shù)據(jù)包則都允許通過。第一條規(guī)則讓所有流出的信息看起來都是來自防火墻機器的,而并不會顯示出防火墻后面還有一個局域網(wǎng)。
下面的命令為FORWARD和POSTROUTING鏈設置缺省的策略,在使用偽裝時,有一個缺省的POSTROUTING DROP策略非常重要,否則就可能有心懷惡意的用戶突破網(wǎng)關(guān)后偽裝自己的身份。
- # iptables -t filter -P FORWARD DROP
- # iptables -t nat -P POSTROUTING DROP
下面的命令為撥號連接設置,它可以動態(tài)地分配IP地址:
- # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
9.運行服務器時的情況
有時也會把服務器放置在防火墻后面,這時iptables就需要知道從哪兒通過數(shù)據(jù)包,設置如下所示:
- # iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 80 -j DNAT -to 192.168.0.10:80
- # iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 25 -j DNAT -to 192.168.0.11:25
10.規(guī)則的保存
到現(xiàn)在為止,所有的例子都是在命令行中進行的。在測試新的規(guī)則時,這是一種很好的方式,但一旦測試結(jié)果令人滿意,就可以將它們保存為腳本??梢允褂?iptables-save 命令來實現(xiàn):
- $ iptables-save > iptables-script
信息包過濾表中的所有規(guī)則都被保存在文件iptables-script中。無論何時再次引導系統(tǒng),都可以使用iptables-restore命令將規(guī)則集從該腳本文件恢復到信息包過濾表?;謴兔钊缦滤荆?/p>
- $ iptables-restore iptables-script
如果愿意在每次引導系統(tǒng)時自動恢復該規(guī)則集,則可以將上面指定的這條命令放到任何一個初始化Shell腳本中。
下面的例子并不是一個完整的腳本,它只是描述了如何使用變量及提供了一些附加的規(guī)則樣例。
- #!/bin/sh
#為變量賦值
IPTABLES=/sbin/iptables
LAN_NET="192.168.1.0/24"
IFACE= "eth0"
LO_IFACE="lo"
LO_IP="127.0.0.1"
#加載所需的內(nèi)核
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_nat
#缺省情況下,IP轉(zhuǎn)發(fā)都處于不可用狀態(tài),將其設置為可用狀態(tài):
echo "1" > /proc/sys/net/ipv4/ip_forward
#使IP的動態(tài)分配功能可用
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
#每次重啟這個腳本時,最好清除以前所設的規(guī)則
$IPTABLES -P INPUT DROP
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD DROP
$IPTABLES -F FORWARD
$IPTABLES -F -t nat
#只允許在LAN中使用SSH連接
$IPTABLES -A INPUT -s LAN_NET -p tcp --destination-port ssh -j ACCEPT
#允許loopback!
$IPTABLES -A INPUT -i lo -p all -j ACCEPT
$IPTABLES -A OUTPUT -o lo -p all -j ACCEPT
#丟棄那些流入的宣稱是來自本地機器的數(shù)據(jù)包
#丟棄那些流出的不是出自本地機的數(shù)據(jù)包
$IPTABLES -A INPUT -i $IFACE -s $LAN_NET -j DROP
$IPTABLES -A OUTPUT -o $IFACE -s ! $LAN_NET -j DROP
#限制一些流出的信息
iptables的啟動和關(guān)閉就講述到這里啦。
【編輯推薦】





















