iptables官方手冊整理
目錄:
1. 簡介
2. 首先,什麼是包過濾?
3. 快速入門指南
4. 資料包過濾流程
5. 具體如何使用Iptables命令實現過濾功能
6. 地址轉換(NAT)
7. 排除建議
1. 簡介
————————————————————————————————————————————————
讀者們,大家好:
在這裡我們假設你已經有一定的IP地址、網路地址、子網掩碼、路由、DNS基礎知識。如果沒有建議你先閱讀一下官網的networking-concepts-HOWTO文件。官網地址為:www.netfilter.org
當前我們的網路是不安全的。但問題是我們做網路限制,同時還需要提供快速、便利的網路通訊環境,而不是處於邪惡的目的。網路限制是一把雙刃刀,但本文章並非解決這個問題。
所以刀在手如何使用完全取決於你。我相信你會把這些工具用到合理的地方,並能很好地使用這些工具。而不是用於其他目的。
————————————————————————————————
2. 首先,什麼是包過濾?
包過濾是當一個資料包通過時,使用軟體去檢視包頭資訊並決定對該包的處理方式。你可以丟棄該資料包、接受該資料包亦或是其他更復雜的處理方式。
在Linux中包過濾已經整合到核心中了,甚至還可以做一些資料包欺騙,但基本原則還是檢視資料包頭並決定處理方式。
————————————————————————————————
2.1 為什麼我們需要包過濾?
可控性、安全性、可監控性
可控性:當你在區域網中使用Linux連線另一個網路時(如:網際網路),你可以允許或拒絕特定型別的資料。例如:資料包都會包含目標地址,這樣你就可以防止資料包進入某個特定的網路。再舉個例子,我使用瀏覽器訪問某個網站,在該網站上全是廣告,此時瀏覽器會浪費我的時間去下載這些廣告資訊。這時我可以告知包過濾工具不允許該網站的資料包通過以解決這個問題。
安全性:當你的Linux主機是複雜的網際網路與有序的區域網之間的唯一主機時,你可以通過資料包限制讓該Linux主機成為區域網與網際網路之間的安全大門!比如:你可以會想允許所有的資料包進入網際網路,但你會對從外網進來的死亡之ping感到憂慮。再如,你可能不希望有人可以telnet連線你的Linux主機,即使對方有密碼也不可以。簡單而言就是通過包過濾工具拒絕外網部分資料包進入本地。
可監控性:當有些不正常的資料流量出現時,包過濾工具可以及時通知你是非常不錯的注意!
————————————————————————————————
2.2 Linux系統如何過濾資料包
Linux核心從1.1開始就已經有包過濾功能。第一代產品是1994年誕生於BSD系統的ipfw。Linux2.0增強了該功能;使用者可以使用ipfwadm控制核心過濾規則。Linux2.2是使用者工具變更為ipchains。最後在Linux2.4中使用者工具被重寫,新的工具為iptables。
你需要一個支援netfilter架構的Linux核心:netfilter是在核心中的過濾架構,而且該架構可以使用外掛動態載入。
Linux防火牆主要包括兩個部分:一部分為netfilter是核心過濾的基礎架構,一部分為iptables是使用者工具,用來編輯具體的過濾規則提供給核心netfilter。
IPTABLES:該工具可以新增刪除具體的過濾規則至核心包過濾表。這也意味著無論你如何設定防火牆規則,一旦機器重啟所有的規則將丟失。
永久儲存規則:你設定的防火牆規則被儲存在核心中,但重啟會丟失。你可以使用iptables-save和iptables-restore指令碼實現永久儲存與恢復。
備註:Linux防火牆所有的規則被儲存在表中,預設Iptables防火牆有4個表:filter表(實現過濾功能),nat表(實現地址轉換功能), mangle表(修改資料包的TOS、TTL等資訊),raw表(實現資料包跟蹤功能)
每個表中有多個資料鏈,而我們的具體規則被分門別類的鏈中。以下是每個表中的預設鏈:
filter表:INPUT鏈(入站資料過濾),FORWARD鏈(轉發資料過濾),OUTPUT鏈(出站資料過濾)
nat表:PREROUTING鏈,POSTROUTING鏈,OUTPUT鏈
mangle表:PREROUTING鏈,POSTROUTING鏈,INPUT鏈,OUTPUT鏈,FORWARD鏈
raw表:OUTPUT鏈,PREROUTING鏈
————————————————————————————————
3. 快速入門指南
很多朋友使用單線PPP(撥號)連線網際網路,並且不希望任何人訪問你的網路,防火牆可以做如下設定。
首先載入過濾功能的模組:
#insmod ip_conntrack
#insmod ip_conntrack_ftp
以上兩天命令也可以使用下面兩天命令替換
#modprobe ip_conntrack
#modprobe ip_conntrack_ftp
其次新增具體規則:
# iptables -N block 新建規則鏈
# iptables -A block -m state –state ESTABLISHED,RELATED -j ACCEPT 允許出站資料包的回應資訊
# iptables -A block -m state –state NEW -i ! ppp0 -j ACCEPT 允許出站資料(自己可以訪問外網)
# iptables -A block -j DROP 其餘資料包全部丟棄
# iptables -A INPUT -j block 入站資料時讀取block鏈中的過濾規則
# iptables -A FORWARD -j block 轉發資料時讀取block鏈中的過濾規則
————————————————————————————————
4. 資料包過濾流程
核心的過濾表預設有三個鏈(鏈中具體存放過濾規則):INPUT,OUTPUT,FORWARD。
_____
Incoming / Outgoing
–>[Routing ]—>|FORWARD|——->
[Decision] \_____/ ^
| |
v ____
___ /
/ |OUTPUT|
|INPUT| \____/
\___/ ^
| |
—-> Local Process —-
三個圈中表示上面的三個鏈,當資料包到達上圖中的某個圈中時,鏈即刻根據規則判斷資料包的處理方式,如果鏈中的某個規則說丟棄該包,該資料包將立即被丟棄;如果鏈中規則說接受,則資料包繼續向後傳輸。
每個鏈中包含有具體的規則,每個規則具體明確說明:什麼資料包頭資訊做怎樣的處理,如果你的資料包沒有匹配第一個規則,則繼續對比下一條規則。最後如果沒有規則與你的資料包匹配,核心將讀取鏈的預設規則。出於安全的考慮,預設規則一般會被設定為丟棄(DROP)。
1.資料包過來時核心先檢視目標地址:這一步被稱為路由。
2.如果該資料是發往本地的,則繼續向下傳遞至INPUT鏈,當INPUT鏈允許該資料包,資料包進入本機等待程式接受資料。
3.否則,如果核心未開啟資料轉發功能,被轉發的資料包將被直接丟棄,如果核心開啟了資料轉發功能,該資料包將傳遞給FORWARD鏈以轉發資料,資料進入目標網路介面(網路卡介面);此時如果 FORWARD鏈允許資料包通過,該資料包繼續向後傳遞。
4.最後在本機的一個程式傳送網路資料包時,資料包會立刻進入OUPUT鏈,根據具體規則決定允許或拒絕傳送出去。
————————————————————————————————
5. 具體如何使用Iptables命令實現過濾功能
iptables有非常詳盡的手冊文件(man iptalbes),以下是iptables可以實現的幾種不同的操作,我們從filter過濾表開始。
1. 建立新的自定義鏈 -N
2. 刪除自定義鏈 -X
3. 改變預設策略 -P
4. 顯示鏈規則 -L
5. 清空鏈中的規則 -F
6. 將包過濾統計資訊清零 -Z
如果在鏈中維護具體規則:
1. 追加新的規則 -A
2. 插入新的規則 -I
3. 替換舊的規則 -R
4. 刪除舊的規則 -D
————————————————————————————————
5.1 操作單條規則
這是最基本的包過濾操作。通常你需要使用-A或-D命令選項,有時你還會使用到-I與-R命令選項。
每條規則需要指定匹配條件以及匹配後的處理方式(ACCEPT允許,DROP丟棄,REJECT拒絕,LOG日誌等),如:你可能希望丟棄素有本地迴環(127.0.0.1)的ICMP資料包,這樣我們的匹配條件是:ICMP協議並且源地址是127.0.0.1 匹配後做DROP處理。
127.0.0.1是本地迴環介面,即使你沒有物理網路卡,該介面一樣存在。你可以使用ping命令產生這類資料包。
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=21.9 ms
— 127.0.0.1 ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 21.966/21.966/21.966/0.000 ms
# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP 新增一條規則
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
— 127.0.0.1 ping statistics —
1 packets transmitted, 0 packets received, 100% packet loss
你可以看到第一次ping是成功的(-c 1 說明僅ping一次),然後我們追加了一條規則到INPUT鏈,該規則指定從127.0.0.1傳送的ICMP協議的資料包將被丟棄。第二次再執行ping命令所有的資料100%丟失。
我們有兩種方式可以刪除規則,首先我們知道INPUT鏈中只有一條規則,我們可以使用編號刪除:
#iptables -D INPUT 1 刪除INPUT鏈中的第一條規則
第二種方法類似與-A選項,使用-D替換-A。當你的規則比較複雜並搞不清編號時可以使用這種方式:
#iptables -D INPUT -s 127.0.0.1 -p icmp -j DROP
————————————————————————————————
5.2 特定過濾規則
上面我們已經看到可以使用-p指定協議,-s指定源地址,但還有很多可以用來過濾的條件匹配符。下面我們分別介紹:
源地址與目標地址
源地址(-s,–source或–src),目標地址(-d,–destination或–dst)有四種使用方式:最常用的是使用名稱,比如”localhost”或者”http://www.kernel.org”。第二種方法是使用IP地址如”127.0.0.1″。第三四種方法可以匹配IP地址區域,如”199.95.207.0/24″或”199.95.207.0/255.255.255.0″。它們都可以匹配199.95.207.0到199.95.207地址可以使用0/0匹配所有地址。
# iptables -A INPUT -s 0/0 -j DROP 拒絕所有源地址訪問本機
取反匹配
很多標籤”-s”,”-d”等都可以在後面新增”!”以表示否定匹配,如”-s ! localhost”將匹配所有非本地源地址。
協議匹配
匹配協議可以使用-p標籤,協議的指定可以使用數字編號(如果你知道協議的編號)或使用名稱(如”TCP”,”UDP”,”ICMP”等)。協議名稱前可以新增”!”如”-p ! TCP”匹配所有非TCP協議資料包。
介面匹配
“-i(–in-interface)”和”-o(–out-interface)”匹配指定的介面。介面是真實的物理網路卡介面,-i(資料包從哪個網路卡進來的),-o(資料從哪個網路卡出去的)。你可以使用ifconfig命令檢視哪些介面是開啟的。
注意:在INPUT鏈不可以使用-o選項,因為入站的資料不走出站介面。所以在INPUT鏈中的-o規則將無法匹配任何資料。
同理,在OUTPUT鏈中不可以使用-i選項。
資料段匹配
很多資料包因為太大無法一次完成資料的傳輸。此時資料包將被分割為資料片段再傳送出去。接收端接受完資料後將把這些資料片段重新組合成完整的資料包。
但問題在於當資料被分割後,只有前面的初始資料片段包含全部的資料頭部資訊(IP,TCP,UDP,ICMP等),後續的資料片段僅包含資料包頭部資訊的一部分資訊。這時去再檢查後續資料片段的頭部資訊是不可能的。
當然,如果你想匹配第二個及後面被分片的資料,可以使用”-f”選項。
# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP 丟棄傳送至192.168.1.1的所有資料以及分片資料
擴充套件iptables規則
iptables有很好的可擴充套件性,也就是說核心架構與iptables工具都可以新增擴充套件功能。
核心功能擴充套件一般放在核心模組子目錄中:/lib/modules/2.6.32-220.el6.i686/kernel/net/netfilter(這裡以CentOS6.2為例)。這些模組在你使用iptables時會自動載入。
mac
該模組需要使用”-m mac”選項啟用,這對應過濾進站資料包的源MAC地址很用幫助。
#iptables -I INPUT -m mac –mac-source 00:60:08:91:CC:B7 -j REJECT 拒絕MAC地址為00:60:08:91:CC:B7的資料包進入
limit
該模組需要使用”-m limit”選項啟用,該功能對限制網速很有效。
#iptables -A OUTPUT -p tcp -m limit –limit 100/s -j ACCEPT 每秒包個數100以內將允許傳送
#iptables -P OUTPUT REJECT 預設拒絕所有
說明:以上兩天可以實現,當每秒包個數大於100時,拒絕所有連線。
應用例項
Syn-flood protection:
# iptables -A FORWARD -p tcp –syn -m limit –limit 1/s -j ACCEPT
Furtive port scanner:
# iptables -A FORWARD -p tcp –tcp-flags SYN,ACK,FIN,RST RST -m limit –limit 1/s -j ACCEPT
Ping of death:
# iptables -A FORWARD -p icmp –icmp-type echo-request -m limit –limit 1/s -j ACCEPT
狀態匹配
該模組需要使用”-m state”選項啟用,資料包的狀態包括:NEW,ESTABLISHED,RELATED,INVALID
NEW:建立連線的資料包
ESTABLISHED:通過已經建立的連線通道傳輸的資料包
RELATED:與已經建立的連線相關的資料包,如ICMP錯誤資料包
INVALID:無法識別的資料包
#iptables -A INPUT -m state –state NEW -j DROP 拒絕進站的連線請求(外網無法訪問本機)
#iptables -A INPUT -m state –state RESTABLISHED,RELATED -j ACCEPT 允許外網資料對本機的回應資訊
#iptables -P OUTPUT ACCEPT 允許訪問外網
————————————————————————————————
6. 地址轉換(NAT)
[ ]
|>>> [Internet] >>>> (www.google.com)
| [ ]
v
v
_______________________
[ eth0:202.106.22.31 ]
[ 閘道器 ]
[____eth1:192.168.1.1___]
|
|
v
v
[ ] >>> (PC:192.168.1.200)
[ 交換機 ] >>> (PC:192.168.1.201)
[ ] >>> (PC:192.168.1.202)
上圖中區域網(192.168.1.0/24)通過交換機與公司閘道器連通在一起,閘道器與網際網路可以實現通訊。現在我們使用iptables的SNAT功能實現內網所有主機上網。
實現步驟:
1. 開啟閘道器路由功能(路由器就有該功能,如果是Linux軟路由可以使用:#echo “1” > /proc/sys/net/ipv4/ip_forward命令開啟)
2. 設定iptables的SNAT功能:
#iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT –to-source 202.106.22.31
上圖中如果需要實現通過在外網任意主機通過訪問公司閘道器IP地址:202.106.22.31,即可訪問位於公司內部192.168.1.200上的Web伺服器,我們可以使用iptables的DNAT功能實現。
實現步驟:
1. 開啟閘道器路由功能
2. 設定iptables的DNAT功能:
#iptables -t nat -A PREROUTING -i eth0 -d 202.106.22.31 –dport 80 -j DNAT –to-destination 192.168.1.200
7. 排除建議
1.注意過濾規則的順序,如果規則的第一條拒絕所有tcp連線,第二條允許192.168.1.1訪問本機的tcp連線,則第二條將無效。
#iptables -A INPUT -p tcp -j DROP
#iptables -A INPUT -p tcp -s 192.168.1.1 -j ACCEPT
以上兩條規則由於第一條規則已經丟棄所有的tcp資料包,所以不會再匹配第二條規則。
2.設定完規則後未儲存,導致重啟後所有規則丟失。解決方法:可以使用iptables-save,或service iptables save實現永久儲存
#iptables-save > /etc/sysconfig/iptables
#service iptables save
以上以CentOS為例,兩天命令任選其一即可永久儲存。
3.無效的規則及時刪除,否則影響效率。
4.匹配埠號時必須指定協議,否則會報錯。
5.公司有FTP伺服器時,提前載入ftp模組:#modprobe ip_nat_ftp