iptables設置與使用

網絡安全有多重要呢?這個我就不做贅述了~這裏記下一些 Linux 防火牆的資源和實例,以供參考~


A> 在線 man:http://unixhelp.ed.ac.uk/CGI/man-cgi?iptables


B> 常用命令操作:
尾部插入:iptables [-t table] -[AD] chain rule-specification [options]
選擇插入:iptables [-t table] -I chain [rulenum] rule-specification [options]
修改規則:iptables [-t table] -R chain rulenum rule-specification [options]
刪除規則:iptables [-t table] -D chain rulenum [options]
修改目標:iptables [-t table] -P chain target [options]
規則列表:iptables [-t table] -L [chain] [options]
刪除全部:iptables [-t table] -F [chain] [options]


C> 關於記錄 Log:
1、修改 /etc/syslog.conf 在尾部加入:
...
# Iptable log
kern.warning                                            /var/log/iptables.log
2、重啓服務:
...
#/etc/init.d/iptables restart
#/etc/init.d/syslog restart
3、加入規則 LOG:
...
#iptables -A INPUT -s 192.168.1.1 -m limit --limit 5/s --limit-burst 7 -j LOG --log-prefix '** ATTACK ** ’ --log-level 4


D> iptables技巧實例:
作爲nat服務器,必須制定一些規則來控制客戶機上網的行爲,下面我介紹一些常用的實例。需注意的是,爲了能保證新加如的規則有效,而不受原有規則的影響,這裏都是使用-I命令在第1條規則前插入。切勿使用-A命令,否則會因iptable以編號靠前的規則爲準,而覆蓋了後加人的新規則。
一、禁止客戶機訪問不健康網站
爲了保證網絡的安全。需要禁止客戶機訪問某些不健康網站。iptables支持使用域名和ip地址兩種方法來指定禁止的網站。如果使用域名的方式指定站,iptable就會通過dns服務器查詢該域名對應的所有ip地址,並將它們加人到規則中,所以使用域名指定網站時,iptables的執行速度會慢。
[例1] 添加iptables規則禁止用戶訪問域名爲www.aaa.com的網站。然後查看filter表的FORWARD鏈規則列表。
iptables -I  FORWARD -d  www.aaa.com  -j DROP
iptables -t filter -L FORWARD
[例2] 添加iptables規則禁止用戶訪問ip地址爲10.10.10.10的網站。然後查看filter表的FORWARD鏈規則列表。
iptables -I  FORWARD -d  10.10.10.10 -j DROP
iptables -t filter -L FORWARD
二、禁止某些客戶機上網
在網絡管理中會因各種原因需要禁止部分客戶機上網,這時可以通過iptables來控制。
[例1] 添加iptables規則禁止ip地址爲10.10.10.10的客戶機上網。然後查看filter表的FORWARD鏈規則列表。
iptables -I  FORWARD -s 10.10.10.10  -j DROP
iptables -t filter -L FORWARD
[例1] 添加iptables規則禁止192.168.2.0子網裏的所有客戶機上網。然後查看filter表的FORWARD鏈規則列表。
iptables -I  FORWARD -s 192.168.2.0/24  -j DROP
iptables -t filter -L FORWARD
三、禁止客戶機訪問某些服務
端口是tcp/ip協議裏的一個重要的概念,因爲在網絡中許多應用程序可能會在同一時刻進行通信,當多個應用程序在同一臺計算機上進行網絡通信時,就要有一種方法來區分各個應用程序。tcp/ip協議使用“端口”來區分系統中不同的服務。如 web服務使用的是tcp協議80端口,ftp使用的是20和21號端口等。由於不同的服務使用的不同端口與外界進行通信,因此一臺計算機可以互不干擾地爲客戶機提供多種不同的服務。計算機中可以使用的端口號從0~65535,其中tcp和udp協議使用的端口號是彼此獨立的。
在網絡管理過程中。經常需要禁止客戶機訪問internet上的某些服務。要實現這個功能,只要將禁止服務使用的端口號封閉即可。
[例1] 禁止192.168.1.0子網裏所有的客戶機使用ftp協議下載(即封閉tcp協議的21號端口)。然後查看filter表的FORWARD聯規則列表。
iptables -I  FORWARD  -s 192.168.1.0/24 -p tcp --dport 21 -j DROP
iptables -t filter -L FORWARD
[例2] 禁止192.168.1.0子網裏所有的客戶機使用telnet協議鏈接遠程計算機(即封閉tcp協議的23號端口)。然後查看filter表的FORWARD聯規則列表。
iptables -I  FORWARD  -s 192.168.1.0/24 -p tcp --dport 23 -j DROP
iptables -t filter -L FORWARD
四、強制訪問指定站點
在某些特殊場合(如領導強制要求全體員工訪問某個站點),需要強制訪問指定站點,即無論用戶在瀏覽器中輸入任何網址,都會被自動重定向到某個網站。使用DNAT目標網路地址轉換功能可以很好的實現這個功能。
[例1] 強制所有的客戶機訪問210.21.118.68  這臺web服務器,然後查看PREROUTING鏈規則列表。
iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80  -j  DNAT --to 210.21.118.68:80
iptables -t nat -L PREROUTING
注意強制訪問指定的站點技術事項:
(1)只能使用網站的ip地址,不能使用網站的域名。
(2)不適用於使用虛擬主機技術的網站,應爲這種網站的ip地址是由多個網站共用的。
五、禁止客戶機使用QQ
封鎖QQ是許多網絡管理員最爲頭痛的問題,特別是新版的QQ比較難封鎖,其實只要知道QQ使用的服務器地址和端口號就可以封閉了。那如何得知QQ使用的服務器地址和端口號呢?其實很簡單,只要進入QQ安裝目錄,使用記事本或其他編輯器打開以QQ號碼命名的子目錄下的config.db文件,即可看到QQ使用的服務器的地址和端口號。
從該文件可以看到。首先要封鎖QQ使用的tcp或udp協議的8000端口,其次還要封鎖提供給新版的QQ 使用 tcp 的 80 端口服務器的 IP 地址,這些服務器對應的域名分別是 tcpconn.tencent.com tcpconn2.tencent.com tcpconn3.tencent.com 和 tcpconn4.tencent.com .最後要封鎖提供給vip會員使用的服務器 http.tencent.com 和 http2.tencent.com
iptable  -I FORWARD -p TCP --dport 8000 -j  DROP 
iptable  -I FORWARD -p UDP --dport 8000 -j  DROP 
iptable  -I FORWARD -d  tcpconn.tencent.com -j  DROP 
iptable  -I FORWARD -d  tcpconn2.tencent.com -j  DROP 
iptable  -I FORWARD -d  tcpconn3.tencent.com -j  DROP 
iptable  -I FORWARD -d  tcpconn4.tencent.com -j  DROP 
iptable  -I FORWARD -d  http.tencent.com -j  DROP 
iptable  -I FORWARD -d  http2.tencent.com -j  DROP
六、禁止使用icmp協議
雖然ICMP協議在TCP/IP網絡中可以提供測試網絡的聯通性和報告錯誤信息功能,但ICMP協議是一個無鏈接協議,也就是說只要發送端完成ICMP包文的封裝和發送,這個ICMP報文就能通過網絡傳遞給目標主機。這個特點使用的ICMP協議非常靈活快捷,但是同時也帶來了一個致命的缺陷——易僞裝。任何人都可以發送一個僞造源地址的ICMP報文。ICMP協議也經常被用於發動以下兩種拒絕服務DOS攻擊。
(1)耗盡服務器CPU資源。
(2) 耗盡服務器網絡帶寬。
爲了預防ICMP攻擊,通常都是禁止來自internet的攻擊,所以一般在PPP0接口上禁止ICMP協議。
[例1] 禁止INTERNET上計算機通過ICMP協議PING到NAT服務器的PPP0接口,但允許內網的客戶機通過ICMP協議PING的計算機,然後查看FILTER表的INPUT鏈規則列表。
iptables -I INPUT -i ppp0 -p icmp -j DROP
iptables -t filter -L INTUP
要實現上面的要求,可以通過在FILTER表的INPUT鏈中進行設置將ICMP包丟棄。如此設置後INTERNET上的計算機就不能PING到NAT服務器了。當然NAT服務器也PING不到INTERNET上的計算機,但是局域網中的計算機還是可以PING通INTERNET上的計算機的,因爲從局域網到INTERNET的數據包使用NAT方式傳輸,僅經過PREROUTING鏈——FORWARD鏈——POSTROUTING鏈——鏈這條通道,並沒有經過INPUT和OUPUT鏈。


E>以下是一個轉載自 CU 的實例:
[實例] 首先讓我們看一下服務器/客戶機的交互原理。服務器提供某特定功能的服務總是由特定的後臺程序提供的。在TCP/IP網絡中,常常把這個特定的服務綁定到特定的TCP或UDP端口。之後,該後臺程序就不斷地監聽(listen)該端口,一旦接收到符合條件的客戶端請求,該服務進行TCP握手後就同客戶端建立一個連接,響應客戶請求。與此同時,再產生一個該綁定的拷貝,繼續監聽客戶端的請求。
舉一個具體的例子:假設網絡中有一臺服務器A(IP地址爲1.1.1.1)提供WWW服務,另有客戶機B(2.2.2.2)、 C(3.3.3.3)。首先,服務器A運行提供WWW服務的後臺程序(比如Apache)並且把該服務綁定到端口80,也就是說,在端口80進行監聽。當 B發起一個連接請求時,B將打開一個大於1024的連接端口(1024內爲已定義端口),假設爲1037。A在接收到請求後,用80端口與B建立連接以響應B的請求,同時產生一個80端口綁定的拷貝,繼續監聽客戶端的請求。假如A又接收到C的連接請求(設連接請求端口爲1071),則A在與C建立連接的同時又產生一個80端口綁定的拷貝繼續監聽客戶端的請求。如下所示,因爲系統是以源地址、源端口、目的地址、目的端口來標識一個連接的,所以在這裏每個連接都是唯一的。

服務器 客戶端
連接1:a.b.c.1:80 <=> a.b.c.4:1037
連接2:a.b.c.1:80 <=> a.b.c.7:1071

每一種特定的服務都有自己特定的端口,一般說來小於1024的端口多爲保留端口,或者說是已定義端口,低端口分配給衆所周知的服務(如WWW、 FTP等等),從512到1024的端口通常保留給特殊的UNIX TCP/IP應用程序,具體情況請參考/etc/services文件或 RFC1700。

假設網絡環境如下:某一單位,租用DDN專線上網,網絡拓撲如下:

+--------------+
| 內部網段 | eth1+--------+eth0 DDN
| +---------------|firewall|<===============>Internet
| 198.168.80.0-254 |
+--------------+
eth0: 198.199.37.254
eth1: 198.168.80.254

以上的IP地址都是Internet上真實的IP,故沒有用到IP欺騙。並且,我們假設在內部網中存在以下服務器:
www服務器:www.yourdomain.com 198.168.80.11
ftp服務器:ftp.yourdomain.com 198.168.80.12
email服務器:mail.yourdomain.com 198.168.80.13

下面我們將用iptables一步一步地來建立我們的包過濾防火牆,需要說明的是,在這個例子中,我們主要是對內部的各種服務器提供保護。

1. 在/etc/rc.d/目錄下用touch命令建立firewall文件,執行chmod u+x firewll以更改文件屬性 ,編輯 /etc/rc.d/rc.local文件,在末尾加上 /etc/rc.d/firewall 以確保開機時能自動執行該腳本。

2. 刷新所有的鏈的規則
#!/bin/sh
echo "Starting iptables rules..."
#Refresh all chains
/sbin/iptables -F

3. 我們將首先禁止轉發任何包,然後再一步步設置允許通過的包。
所以首先設置防火牆FORWARD鏈的策略爲DROP:
/sbin/iptables -P FORWARD DROP

4.設置關於服務器的包過慮規則:
在這裏需要注意的是,服務器/客戶機交互是有來有往的,也就是說是雙向的,所以我們不僅僅要設置數據包出去的規則,還要設置數據包返回的規則,我們先建立針對來自Internet數據包的過慮規則。
WWW服務:服務端口爲80,採用tcp或udp協議。規則爲:eth0=>;允許目的爲內部網WWW服務器的包。
###########################Define HTTP packets####################################
#Allow www request packets from Internet clients to www servers
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT
FTP服務:FTP服務有點特別,因爲需要兩個端口,因爲FTP有命令通道和數據通道。其中命令端口爲21,數據端口爲20,並且有主動和消極兩種服務模式,其消極模式連接過程爲:FTP客戶端首先向FTP服務器發起連接請求,三步握手後建立命令通道,然後由FTP服務器請求建立數據通道,成功後開始傳輸數據,現在大多數FTP客戶端均支持消極模式,因爲這種模式可以提高安全性。FTP服務採用tcp協議。規則爲:eth0=>;僅允許目的爲內部網ftp服務器的包。
############################Define FTP packets#####################################
#Allow ftp request packets from Internet clients to Intranet ftp server
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT
EMAIL服務:包含兩個協議,一是smtp,一是pop3。出於安全性考慮,通常只提供對內的pop3服務,所以在這裏我們只考慮針對smtp的安全性問題。smtp端口爲21,採用tcp協議。eth0=>;僅允許目的爲email服務器的smtp請求。
###########################Define smtp packets####################################
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT

5. 設置針對Intranet客戶的過慮規則:
在本例中我們的防火牆位於網關的位置,所以我們主要是防止來自Internet的攻擊,不能防止來自Intranet的攻擊。假如我們的服務器都是基於linux的,也可以在每一部服務器上設置相關的過慮規則來防止來自Intranet的攻擊。對於Internet對Intranet客戶的返回包,我們定義如下規則。
#############Define packets from Internet server to Intranet#######################
/sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
說明:第一條允許Intranet客戶採用消極模式訪問Internet的FTP服務器;第二條接收來自Internet的非連接請求tcp包;最後一條接收所有udp包,主要是針對oicq等使用udp的服務。

6. 接受來自整個Intranet的數據包過慮,我們定義如下規則:
#############Define packets from Internet server to Intranet server###############
/sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT

7. 處理ip碎片
我們接受所有的ip碎片,但採用limit匹配擴展對其單位時間可以通過的ip碎片數量進行限制,以防止ip碎片攻擊。
#################################Define fregment rule##################################
/sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
說明:對不管來自哪裏的ip碎片都進行限制,允許每秒通過100個ip碎片,該限制觸發的條件是100個ip碎片。

8. 設置icmp包過濾
icmp包通常用於網絡測試等,故允許所有的icmp包通過。但是黑客常常採用icmp進行攻擊,如ping of death等,所以我們採用limit匹配擴展加以限制:
#################################Define icmp rule##################################
/sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
說明:對不管來自哪裏的icmp包都進行限制,允許每秒通過一個包,該限制觸發的條件是10個包。

通過以上個步驟,我們建立了一個相對完整的防火牆。只對外開放了有限的幾個端口,同時提供了客戶對Internet的無縫訪問,並且對ip碎片攻擊和icmp的ping of death提供了有效的防護手段。以下是完整的腳本文件內容,希望通過這個實例能是對iptables的用法有所瞭解:
#!/bin/sh
echo "Starting iptables rules..."
#Refresh all chains
/sbin/iptables -F
###########################Define HTTP packets####################################
#Allow www request packets from Internet clients to www servers
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT
############################Define FTP packets#####################################
#Allow ftp request packets from Internet clients to Intranet ftp server
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT
###########################Define smtp packets####################################
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT
#############Define packets from Internet server to Intranet#######################
/sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
#############Define packets from Intranet to Internet###############
/sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT
#################################Define fregment rule##################################
/sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
#################################Define icmp rule##################################
/sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章