天天看點

iptables系列教程(二)| iptables文法規則

iptables 指令基本文法

iptables [-t table] command [鍊名] [條件比對] [-j 目标動作]

以下是對 iptables 指令的拆分講解:

-t table

用來指明使用的表,有三種選項:

filter

nat

mangle

。若未指定,則預設使用filter表。

command參數

指定iptables 對我們送出的規則要做什麼樣的操作,以下是command常用參數:

  • -A

Append,追加一條規則(放到最後)

舉例:           
iptables -A INPUT -j DROP #拒絕所有人通路伺服器(作為最後一條規則)
// 若未 -t 指定表,預設使用filter表           
  • -I

Insert,在指定的位置插入規則

舉例:
 
           
iptables -I INPUT 2 -s 10.10.10.1 -j ACCEPT #允許10.10.10.1主機通路本機
// 在 filter 表的 INPUT 鍊插入成第2條規則           
  • -L

List,檢視規則清單

具體參數:
           
n:隻顯示 IP 位址和端口号碼,不顯示域名和服務名稱
v:顯示詳細資訊,包括每條規則的比對包數量和比對位元組數
x:在 v 的基礎上,禁止自動機關換算(K、M)
--line-number:可以檢視到規則号           
舉例:
           
  • -D

Delete,從規則清單中删除規則

舉例:
           
iptables -D INPUT 2
// 删除 filter 表 INPUT 鍊中的第 2 條規則           
  • -P

Policy,設定某個鍊的預設規則

舉例:
           
iptables -P INPUT DROP
// 設定 filter 表 INPUT 鍊的預設規則是 DROP           
當資料包沒有被任何規則比對時,則按預設規則處理。
  • -F

Flush,清空規則

舉例:
           
iptables -F INPUT #清空filter 表中INPUT鍊上的規則
iptables -F #清空filter 表中所有鍊上的規則
iptables -t nat -F PREROUTING ##清空NAT表中PREROUTING鍊上的規則
iptables -t nat -F #清空NAT表中所有鍊上的規則
            
注意:-F 是清空鍊中規則,但并不影響 -P 設定的預設規則。 是以在生産環境中,若指定預設規則為DROP,一旦執行

iptables -F

,很容易導緻自己也無法連接配接伺服器(-F 會把配置的明細ACCEPT規則删除,隻留下預設規則拒接所有)。
  • -Z

zero,将指定鍊的所有計數器歸零。(如未指定,則認為是所有鍊)

舉例:           
iptables -Z INPUT 
//清除filter表INPUT鍊上的計數器           

條件比對參數

按網絡接口比對:

  • -i

比對資料進入的網絡接口,此參數主要應用nat表,例如目标位址轉換。

  • -o

比對資料流出的網絡接口

例如:           
-i eth0
// 比對從網絡接口eth0進來的資料包

-o eth1
// 比對從eth1流出的資料包           

按源及目的位址比對

  • -s

比對源位址,可以是IP、網段、域名,也可空(代表任何位址)

  • -d

比對目标位址

舉例:
           
-s 參數舉例:
iptables -A INPUT -s 10.10.10.10 -j DROP
// 拒絕10.10.10.10主機通路本機

-d 參數舉例:
iptables -A OUTPUT -d www.baidu.com -j DROP
// 禁止本機通路百度           

按協定類型比對

  • -p

比對協定類型,可以是TCP、UDP、ICMP等

舉例:
           
iptables -A INPUT -s 10.10.10.10 -p icmp -j DROP
// 禁止10.10.10.10主機ping通本機           

按源及目的端口比對

  • --sport

比對源端口;可以是單個端口,也可以是端口範圍

  • --dport

比對目的端口

例如:
           
-- sport 23 
//比對源端口是23的資料包

 -- sport 2000:3000 
//比對源端口是 2000-3000 的資料包

-- sport :2000
//比對2000以下的資料包(包含2000)

- --sport 1000:
//比對1000以上的資料包(包含1000)           
注意:--sport 和 --dport 必須配合 -p 參數使用,例如:
iptables -A INPUT -p tcp –dport 80 -j ACCEPT 
//允許外部資料通路我的本地伺服器80端口

詳細解釋:
1、這是一條從外部進入内部本地伺服器的資料
2、資料包的目的(dport)位址是22,就是要通路我本地的22端口
3、允許以上的資料行為通過           

目的動作

  • -j ACCEPT

允許資料包通過本鍊而不攔截它

例如:
           
iptables -A INPUT -j ACCEPT
// 允許所有通路本機的資料包通過           
  • -j DROP

丢棄資料包;阻止資料包通過本鍊

例如:
           
iptables -A FORWARD -s 10.10.10.10 -j DROP
// 阻止來自10.10.10.10 的資料包通過本機           
  • -j SNAT

源位址轉換,支援轉換為單IP,也支援轉換到IP位址池

例如:    
           
轉換到單IP舉例:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 18.18.18.18
// 将内網 192.168.1.0/24 轉換為公網18.18.18.18位址;SNAT,用于通路網際網路

轉換到一組位址池:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 18.18.18.18-18.18.18.28
//同上,隻不過是轉換到一組IP位址池           
  • -j DNAT

目的位址轉換,支援轉換為單IP,也支援轉換到IP位址池

例如:
           
轉換到單IP舉例:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.1
//把從eth0口進來通路TCP/80端口的資料包目的位址改成192.168.1.1

轉換到一組位址池:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.1-192.168.1.10           
  • -j MASQUERADE

動态SNAT轉換(适用于動态 IP 場景 )

例如:
           
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE 
// 将源位址是 192.168.1.0/24 的資料包進行位址僞裝,轉換成 eth0 上的 IP 位址           

iptables 常用附加子產品:

 按包狀态比對 (state)

-m state --state 狀态

舉例:
           
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
// 将目前已運作的服務端口全部放行!無風險,良心推薦使用           

 按來源 MAC 比對(mac)

-m mac --mac-source MAC

舉例:
           
iptables -A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
// 拒絕來自某 MAC 位址的資料包進入本機           

 按包速率比對 (limit)

-m limit --limit 比對速率

舉例:
             
iptables -A FORWARD -d 192.168.1.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.1.1 -j DROP           
limit 英語上看是限制的意思,但實際上隻是按一定速率去比對而已,50/s 表示 1 秒中轉發 50 個資料包,要想限制的話後面要再跟一條DROP規則

 多端口比對 (multiport)

-m multiport <--sports|--dports|--ports> 端口 1[,端口 2,..,端口 n]

舉例:
           
iptables -A INPUT -p tcp -m multiport --dports 22,53,80,443 -j ACCEPT
// 允許通路本機TCP/22,53,80,443端口           
注意:該參數必須與 -p 參數一起使用

iptables 規則備份和恢複

我們執行 iptables 指令時,規則隻是儲存在記憶體中,并沒有儲存到某一個檔案中。是以系統重新開機之後,之前設定的規則就沒有了,是以規則設定完畢,檢查無誤後要及時儲存規則,使用指令:
[root@LB-01 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]           

會看到提示,防火牆規則儲存在

/etc/sysconfig/iptables

檔案内,這個檔案就是iptables的配置檔案。是以如果要備份防火牆規則,複制該配置檔案即可。例如:

cp /etc/sysconfig/iptables /opt/myipt.rule           

如果需要恢複這些規則,使用以下指令:

iptables-restore < /opt/myipt.rule
service iptables save           

結語

公衆号『

開源Linux

』,專注分享Linux/Unix相關内容,包括Linux運維、Linux系統開發、網絡程式設計、以及虛拟化和雲計算等技術幹貨。背景回複『

學習

』,送你一套學習Linux的系列書籍,期待與你相遇。