1. 程式人生 > >iptables命令詳解之大戰iptables八百回合

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 的資料包進行地址偽裝