iptables命令詳解之大戰iptables八百回合

簡介

netfilter/iptables(簡稱爲iptables)組成Linux平臺下的包過濾防火牆,與大多數的Linux軟件一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網絡地址轉換(NAT)等功能。

總則

iptables [-t 要操作的表] <操作命令> [要操作的鏈] [規則號碼] [匹配條件] [-j 匹配到以後的動作]
在這裏插入圖片描述

表和鏈

表(tables)提供特定的功能,iptables內置了4個表,即filter表、nat表、mangle表和raw表,分別用於實現包過濾,網絡地址轉換、包重構(修改)和數據跟蹤處理。
鏈(chains)是數據包傳播的路徑,每一條鏈其實就是衆多規則中的一個檢查清單,每一條鏈中可以有一 條或數條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據 該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定 義的默認策略來處理數據包。
在這裏插入圖片描述

規則表

  1. filter表

三個鏈:INPUT、FORWARD、OUTPUT三個鏈:INPUT、FORWARD、OUTPUT
作用:過濾數據包 內核模塊:iptables_filter.

  1. Nat表

三個鏈:PREROUTING、POSTROUTING、OUTPUT——三個鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用於網絡地址轉換(IP、端口) 內核模塊:iptable_nat

  1. Mangle表

五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改數據包的服務類型、TTL、並且可以配置路由實現QOS內核模塊:iptable_mangle(別看這個表這麼麻煩,咱們設置策略時幾乎都不會用到它),使用tc配合iptables對上行流量和下行流量限速就要用到這個表了

  1. Raw表

兩個鏈:OUTPUT、PREROUTING
作用:決定數據包是否被狀態跟蹤機制處理 內核模塊:iptable_raw

規則鏈

在這裏插入圖片描述

  1. PREROUTING:數據包進入路由表之前
  2. INPUT:通過路由表後目的地爲本機
  3. FORWARDING:通過路由表後,目的地不爲本機
  4. OUTPUT:由本機產生,向外轉發
  5. POSTROUTIONG:發送到網卡接口之前

操作命令

  • -A 在指定鏈的末尾添加(append)一條新的規則

-A <鏈名>
iptables -t filter -A INPUT -j DROP
在 filter 表的 INPUT 鏈裏追加一條規則(作爲最後一條規則)
匹配所有訪問本機 IP 的數據包,匹配到的丟棄

  • -D 刪除(delete)指定鏈中的某一條規則,可以按規則序號和內容刪除

-D <鏈名> <規則號碼 | 具體規則內容>
iptables -D INPUT 3(按號碼匹配)
刪除 filter 表 INPUT 鏈中的第三條規則(不管它的內容是什麼)

iptables -D INPUT -s 192.168.0.1 -j DROP(按內容匹配)
刪除 filter 表 INPUT 鏈中內容爲“-s 192.168.0.1 -j DROP”的規則
(不管其位置在哪裏)

  • -I 在指定鏈中插入(insert)一條新的規則,默認在第一行添加

-I <鏈名> [規則號碼]
iptables -I INPUT -j DROP
在 filter 表的 INPUT 鏈裏插入一條規則(插入成第 1 條)

iptables -I INPUT 3 -j DROP
在 filter 表的 INPUT 鏈裏插入一條規則(插入成第 3 條)

  • -R 修改、替換(replace)指定鏈中的某一條規則,可以按規則序號和內容替換

-R <鏈名> <規則號碼> <具體規則內容>
iptables -R INPUT 3 -j ACCEPT
將原來編號爲 3 的規則內容替換爲“-j ACCEPT”

  • -L 列出(list)指定鏈中所有的規則進行查看

-L [鏈名]
iptables -nvL --line-number查看所有iptables的規則並且顯示序列號

iptables -L
粗略列出 filter 表所有鏈及所有規則

iptables -t nat -vnL
用詳細方式列出 nat 表所有鏈的所有規則,只顯示 IP 地址和端口號

  • -E 重命名用戶定義的鏈,不改變鏈本身

iptables -E old-chain new-chain

  • -F 清空(flush)

-F [鏈名]
iptables -F INPUT
清空 filter 表 INPUT 鏈中的所有規則

iptables -t nat -F PREROUTING
清空 nat 表 PREROUTING 鏈中的所有規則
注意:
1、-F 僅僅是清空鏈中規則,並不影響 -P 設置的默認規則
2、-P 設置了 DROP 後,使用 -F 一定要小心!!!
3、如果不寫鏈名,默認清空某表裏所有鏈裏的所有規則

  • -n 使用數字形式(numeric)顯示輸出結果
  • -v 查看規則表詳細信息(verbose)的信息
  • -V 查看版本(version)
  • -h 獲取幫助(help)

匹配條件

  • 流入、流出接口(-i、-o)

-i <匹配數據進入的網絡接口>
-i eth0
匹配是否從網絡接口 eth0 進來

-o 匹配數據流出的網絡接口
-o eth0

  • 來源、目的地址(-s、-d)

-s <匹配來源地址>
可以是 IP、NET、DOMAIN,也可空(任何地址)
-s 192.168.0.1 匹配來自 192.168.0.1 的數據包
-s 192.168.1.0/24 匹配來自 192.168.1.0/24 網絡的數據包

-d <匹配目的地址>
可以是 IP、NET、DOMAIN,也可以空
-d 202.106.0.20 匹配去往 202.106.0.20 的數據包
-d 202.106.0.0/16 匹配去往 202.106.0.0/16 網絡的數據包
-d www.abc.com 匹配去往域名 www.abc.com 的數據包

  • 協議類型 (-p)

-p <匹配協議類型>
可以是 TCP、UDP、ICMP 等,也可以直接填寫協議對應的編號,還可以是空
-p tcp
-p udp

  • 來源、目的端口(–sport、–dport)

–sport <匹配源端口>
可以是個別端口,可以是端口範圍
–sport 1000 匹配源端口是 1000 的數據包
–sport 1000:3000 匹配源端口是 1000-3000 的數據包(含1000、3000)
–sport :3000 匹配源端口是 3000 以下的數據包(含 3000)
–sport 1000: 匹配源端口是 1000 以上的數據包(含 1000)

–dport <匹配目的端口>
匹配規則同–sport
注意:–sport 和 --dport 必須配合 -p 參數使用

  • 匹配規則具體舉例

1、端口匹配
-p udp --dport 53
匹配網絡中目的地址是 53 的 UDP 協議數據包

2、地址匹配
-s 10.1.0.0/24 -d 172.17.0.0/16
匹配來自 10.1.0.0/24 去往 172.17.0.0/16 的所有數據包

3、端口和地址聯合匹配
-s 192.168.0.1 -d www.abc.com -p tcp --dport 80
匹配來自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 協議數據包

動作

  • ACCEPT

-j ACCEPT
通過,允許數據包通過本鏈而不攔截它
iptables -A INPUT -j ACCEPT
允許所有訪問本機 IP 的數據包通過

  • DROP

-j DROP
丟棄,阻止數據包通過本鏈而丟棄它
iptables -A FORWARD -s 192.168.80.39 -j DROP
阻止來源地址爲 192.168.80.39 的數據包通過本機

  • SNAT

SNAT是source networkaddress translation的縮寫,即源地址目標轉換。比如,多個PC機使用ADSL路由器共享上網,每個PC機都配置了內網IP,PC機訪問外部網絡的時候,路由器將數據包的報頭中的源地址替換成路由器的ip,當外部網絡的服務器比如網站web服務器接到訪問請求的時候,他的日誌記錄下來的是路由器的ip地址,而不是pc機的內網ip,這是因爲,這個服務器收到的數據包的報頭裏邊的“源地址”,已經被替換了,所以叫做SNAT,基於源地址的地址轉換。

-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING 鏈)
源地址轉換,SNAT 支持轉換爲單 IP,也支持轉換到 IP 地址池
(一組連續的 IP 地址)

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
將內網 192.168.0.0/24 的原地址修改爲 1.1.1.1,用於 NAT

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
同上,只不過修改成一個地址池裏的 IP

  • DNAT

DNAT是destination networkaddress translation的縮寫,即目標網絡地址轉換,典型的應用是,有個web服務器放在內網配置內網ip,前端有個防火牆配置公網ip,互聯網上的訪問者使用公網ip來訪問這個網站,當訪問的時候,客戶端發出一個數據包,這個數據包的報頭裏邊,目標地址寫的是防火牆的公網ip,防火牆會把這個數據包的報頭改寫一次,將目標地址改寫成web服務器的內網ip,然後再把這個數據包發送到內網的web服務器上,這樣,數據包就穿透了防火牆,並從公網ip變成了一個對內網地址的訪問了,即DNAT,基於目標的網絡地址轉換。

-j DNAT --to IP[-IP][:端口-端口](nat 表的 PREROUTING 鏈)
目的地址轉換,DNAT 支持轉換爲單 IP,也支持轉換到 IP 地址池
(一組連續的 IP 地址)

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1
把從 ppp0 進來的要訪問 TCP/80 的數據包目的地址改爲 192.168.0.1

  • MASQUERADE

-j MASQUERADE
動態源地址轉換(動態 IP 的情況下使用)

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
將源地址是 192.168.0.0/24 的數據包進行地址僞裝

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