linux下iptables命令應用及配置規則


本文內容從兩個角度講解iptables命令的應用,

  • 先梳理概念,
  • 理解后,我們從iptables的命令出發,講解不同的應用,從而更好的理解iptables命令是什么有什么用怎么用

一.概念梳理

iptables是組成Linux平台下的包過濾防火牆,與大多數的Linux軟件一樣,這個包過濾防火牆是免費的,它可以代替昂貴的商業防火牆解決方案,完成封包過濾、封包重定向和網絡地址轉換(NAT)等功能。在日常Linux運維工作中,經常會設置iptables防火牆規則,用來加固服務安全。

以下對iptables的規則使用做了總結性梳理:

iptables首先需要了解的:

1)規則概念
規則(rules)其實就是網絡管理員預定義的條件,規則一般的定義為“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。規則存儲在內核空間的信息 包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。
當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept),拒絕(reject)和丟棄(drop)等。配置防火牆的主要工作是添加,修改和刪除等規則。
其中:
匹配(match):符合指定的條件,比如指定的 IP 地址和端口。
丟棄(drop):當一個包到達時,簡單地丟棄,不做其它任何處理。
接受(accept):和丟棄相反,接受這個包,讓這個包通過。
拒絕(reject):和丟棄相似,但它還會向發送這個包的源主機發送錯誤消息。這個錯誤消息可以指定,也可以自動產生。
目標(target):指定的動作,說明如何處理一個包,比如:丟棄,接受,或拒絕。
跳轉(jump):和目標類似,不過它指定的不是一個具體的動作,而是另一個鏈,表示要跳轉到那個鏈上。
規則(rule):一個或多個匹配及其對應的目標。

2)iptables和netfilter的關系:
Iptables和netfilter的關系是一個很容易讓人搞不清的問題。很多的知道iptables卻不知道 netfilter。其實iptables只是Linux防火牆的管理工具而已,位於/sbin/iptables。真正實現防火牆功能的是 netfilter,它是Linux內核中實現包過濾的內部結構。

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

“四表五鏈”其實是對用戶設置規則的管理,是看待用戶設置的規則的兩個維度。舉個例子,看圖中深藍色箭頭的數據流向,數據包要到達用戶層,需要經過PREROUTING鏈(路由前鏈),INPUT鏈(輸入鏈),在這個鏈路中存放着用戶設置的規則,這些規則根據功能不同又會被分組存放在RAW表、Mangle表和NAT表中。當數據包抵達PREROUTING鏈時,netfilter程序會依次從RAW表、Mangle表和NAT表中取出針對PREROUTING鏈的用戶規則並執行相應操作;同理,INPUT鏈上的規則也會被分組存放在Mangle表和Filter表中,netfilter程序會依次從這兩個表中取出針對INPUT鏈設置的用戶規則並執行相應操作。(特別強調,轉發的數據包不經過 OUTPUT 鏈)


其他鏈同理。

這里需要強調的一點是FORWARD鏈,它是轉發鏈,也就是說只有在網卡個數>=2的系統中才具有的功能:開啟系統轉發功能后,當網絡層發現數據包並非發給本機時會從另一網卡轉發出去。中間經過FORWARD鏈,FORWARD鏈上的規則由Filter表、Mangle表讀取操作。所以對於單網卡的系統中,上圖應更改為:

https://blog.csdn.net/qq_29344757/article/details/81128150

Iptables采用“表”和“鏈”的分層結構,在Linux中現在是四張表五個鏈。下面羅列一下這四張表和五個鏈(注意一定要明白這些表和鏈的關系及作用)。

規則表:
1)filter表——三個鏈:INPUT、FORWARD、OUTPUT
作用:過濾數據包 內核模塊:iptables_filter.
2)Nat表——三個鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用於網絡地址轉換(IP、端口) 內核模塊:iptable_nat
3)Mangle表——五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改數據包的服務類型、TTL、並且可以配置路由實現QOS內核模塊:iptable_mangle(別看這個表這么麻煩,咱們設置策略時幾乎都不會用到它)
4)Raw表——兩個鏈:OUTPUT、PREROUTING
作用:決定數據包是否被狀態跟蹤機制處理 內核模塊:iptable_raw

規則鏈:

1)INPUT——進來的數據包應用此規則鏈中的策略
2)OUTPUT——外出的數據包應用此規則鏈中的策略
3)FORWARD——轉發數據包時應用此規則鏈中的策略
4)PREROUTING——對數據包作路由選擇前應用此鏈中的規則
(記住!所有的數據包進來的時侯都先由這個鏈處理)
5)POSTROUTING——對數據包作路由選擇后應用此鏈中的規則
(所有的數據包出來的時侯都先由這個鏈處理)

**管理和設置iptables規則: **


4)iptables傳輸數據包的過程

1)當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需要轉送出去。
2)如果數據包就是進入本機的,它就會沿着圖向下移動,到達INPUT鏈。數據包到了INPUT鏈后,任何進程都會收到它。本機上運行的程序可以發送數據包,這些數據包會經過OUTPUT鏈,然后到達POSTROUTING鏈輸出。
3)如果數據包是要轉發出去的,且內核允許轉發,數據包就會如圖所示向右移動,經過FORWARD鏈,然后到達POSTROUTING鏈輸出。

整理自: http://www.weixuecn.cn/article/11315.html

二.iptables的增刪改查

iptables規則的修改可以類比於數據表的增刪改查,-I-insert-A-append-D-delete-R-update -L-list or read-F-flush

1.查看規則

1.1 iptables -t 表名 -L

查看對應表的所有規則,-t 指定操作的表, 可省略-t,默認操作filter-L表示列出規則

1.2 iptables -t 表名 -L 鏈名

查看指定表的指定鏈中的規則

1.3 iptables -t 表名 -v -L

查看指定表的所有規則,並且顯示更詳細的信息(更多字段),-v表示verbose,表示詳細的,冗長的,當使用-v選項時,會顯示出"計數器"的信息,由於上例中使用的選項都是短選項,所以一般簡寫為iptables -t 表名 -vL

1.4 iptables -t 表名 -n -L

表示查看表的所有規則,並且在顯示規則時,不對規則中的IP或者端口進行名稱反解,-n選項表示不解析IP地址

1.5 iptables --line-numbers -t 表名 -L

表示查看表的所有規則,並且顯示規則的序號,--line-numbers選項表示顯示規則的序號,注意,此選項為長選項,不能與其他短選項合並,不過此選項可以簡寫為--line,注意,簡寫后仍然是兩條橫杠,仍然是長選項

1.6 iptables -t 表名 -v -x -L

表示查看表中的所有規則,並且顯示更詳細的信息(-v選項),不過,計數器中的信息顯示為精確的計數值,而不是顯示為經過可讀優化的計數值,-x選項表示顯示計數器的精確值。

實際使用中,為了方便,往往會將短選項進行合並,所以,如果將上述選項都糅合在一起,可以寫成如下命令,此處以filter表為例。

iptables --line -t filter -nvxL

當然,也可以只查看某張表中的某條鏈,此處以filter表的INPUT鏈為例

iptables --line -t filter -nvxL INPUT

2.增加規則

2.1 iptables -t filter -I INPUT -s 192.168.1.146 -j DROP

命令解析:

  • -t filter 操作filter表,也可以不指定,默認filter
  • -I INPUT 將規則插入到INPUT鏈中,-I 表示insert rule
  • -s 192.168.1.146 匹配源ip 192.168.1.146,-s 表示source
  • -j DROP 規則動作對應為DROP,即丟棄報文,不響應信息,-j target

命令解讀:操作filter表向INPUT鏈中插入規則,具體source 為192.168.1.146,動作為DROP.

此時我們在自己的測試機限制了146主機的訪問,在146上ping測試機,ping不通。

接着我們看看通過append方式追加規則,是否生效。

執行命令:

#  iptables  -t  filter  -A  INPUT  -s  192.168.1.146  -j  ACCEPT

# -A 表示追加,append

可以在146的主機上對測試主機進行ping命令,發現ping不通,

原因分析:

1.進入 INPUT 鏈中的報文依次的規則處理中,由於剛開始我們用的 -I,即插入最前面的命令,而 -A 表示追加到后面,而匹配規則中,報文值匹配前面的規則,后面的就不再進行匹配,導致,追加 ACCEPT 並沒有生效。

此時,我們嘗試再次通過 -I命令添加規則,看看效果怎樣。

執行命令:

#  iptables  -t  filter  -I  INPUT  -s  192.168.1.146  -j  ACCEPT

再次通過ping命令,146 ping 測試機成功。

通過--line命令查看規則:

# iptables  --line -vnL

iptables詳解(3):iptables規則管理

我們也可以在添加規則時,指定新增規則的編號,這樣我們就能在任意位置插入規則了,我們只要把剛才的命令稍作修改即可,如下。

iptables詳解(3):iptables規則管理

仍然使用-I選項進行插入規則操作,-I INPUT 2表示在INPUT鏈中新增規則,新增的規則的編號為2。

規則的順序很重要。

如果報文已經被前面的規則匹配到,iptables則會對報文執行對應的動作,即使后面的規則也能匹配到當前報文,很有可能也沒有機會再對報文執行相應的動作了,就以上圖為例,報文先被第一條規則匹配到了,於是當前報文被"放行"了,因為報文已經被放行了,所以,即使上圖中的第二條規則即使能夠匹配到剛才"放行"的報文,也沒有機會再對剛才的報文進行丟棄操作了。這就是iptables的工作機制。

3.刪除規則

如果我們想要刪除filter表中INPUT中的一條規則,該怎么做呢?

有兩種辦法:

  • 方法一:根據規則的編號去刪除規則
  • 方法二:根據具體的匹配條件與動作刪除規則

3.1 通過序號刪除

先看看方法一,先查看一下filter表中INPUT鏈中的規則

iptables詳解(3):iptables規則管理

假如我們想要刪除上圖中的第3條規則,則可以使用如下命令。

iptables詳解(3):iptables規則管理

上例中,使用了-t選項指定了要操作的表(沒錯,省略-t默認表示操作filter表),使用-D選項表示刪除指定鏈中的某條規則,-D INPUT 3表示刪除INPUT鏈中的第3條規則。

3.2 通過具體規則刪除

我們也可以根據具體的匹配條件與動作去刪除規則,比如,刪除下圖中源地址為192.168.1.146,動作為ACCEPT的規則,於是,刪除規則的命令如下。

iptables詳解(3):iptables規則管理

上圖中,刪除對應規則時,仍然使用-D選項,-D INPUT表示刪除INPUT鏈中的規則,剩下的選項與我們添加規則時一毛一樣,-s表示以對應的源地址作為匹配條件,-j ACCEPT表示對應的動作為接受,所以,上述命令表示刪除INPUT鏈中源地址為192.168.1.146,動作為ACCEPT的規則。

提示

而刪除指定表中某條鏈中的所有規則的命令,我們在一開始就使用到了,就是"iptables -t 表名 -F 鏈名"

-F選項為flush之意,即沖刷指定的鏈,即刪除指定鏈中的所有規則,但是注意,此操作相當於刪除操作,在沒有保存iptables規則的情況下,請慎用。

其實,-F選項不僅僅能清空指定鏈上的規則,其實它還能清空整個表中所有鏈上的規則,不指定鏈名,只指定表名即可刪除表中的所有規則,命令如下

iptables -t 表名 -F

不過再次強調,在沒有保存iptables規則時,請勿隨便清空鏈或者表中的規則,除非你明白你在干什么。

4.更改規則

怎樣修改某條規則中的動作呢?比如,我想把如下規則中的動作從DROP改為REJECT,改怎么辦呢?

iptables詳解(3):iptables規則管理

我們可以使用-R選項修改指定的鏈中的規則,在修改規則時指定規則對應的編號即可(有坑,慎行),示例命令如下

iptables詳解(3):iptables規則管理

上例中,-R選項表示修改指定的鏈,使用-R INPUT 1表示修改INPUT鏈的第1條規則,使用-j REJECT表示將INPUT鏈中的第一條規則的動作修改為REJECT,注意:上例中, -s選項以及對應的源地址不可省略,即使我們已經指定了規則對應的編號,但是在使用-R選項修改某個規則時,必須指定規則對應的原本的匹配條件(如果有多個匹配條件,都需要指定)。

如果上例中的命令沒有使用-s指定對應規則中原本的源地址,那么在修改完成后,你修改的規則中的源地址會自動變為0.0.0.0/0(此IP表示匹配所有網段的IP地址),而此時,-j對應的動作又為REJECT,所以在執行上述命令時如果沒有指明規則原本的源地址,那么所有IP的請求都被拒絕了(因為沒有指定原本的源地址,當前規則的源地址自動變為0.0.0.0/0),如果你正在使用ssh遠程到服務器上進行iptables設置,那么你的ssh請求也將會被阻斷。

既然使用-R選項修改規則時,必須指明規則原本的匹配條件,那么我們則可以理解為,只能通過-R選項修改規則對應的動作了,所以我覺得,如果你想要修改某條規則,還不如先將這條規則刪除,然后在同樣位置再插入一條新規則,這樣更好,當然,如果你只是為了修改某條規則的動作,那么使用-R選項時,不要忘了指明規則原本對應的匹配條件。

DROP vs REJECT

好了,上例中,我們已經將規則中的動作從DROP改為了REJECT,那么DROP與REJECT有什么不同呢?從字面上理解,DROP表示丟棄,REJECT表示拒絕,REJECT表達的意思好像更堅決一點,我們再次從146主機上向156主機上發起ping請求,看看與之前動作為DROP時有什么不同。

iptables詳解(3):iptables規則管理

如上圖所示,當156主機中的iptables規則對應的動作為REJECT時,從146上進行ping操作時,直接就提示"目標不可達",並沒有像之前那樣卡在那里,看來,REJECT比DROP更加"干脆"。

修改指定鏈的默認策略

其實,我們還可以修改指定鏈的"默認策略",沒錯,就是下圖中標注的默認策略。

iptables詳解(3):iptables規則管理

每張表的每條鏈中,都有自己的默認策略,我們也可以理解為默認"動作"。

當報文沒有被鏈中的任何規則匹配到時,或者,當鏈中沒有任何規則時,防火牆會按照默認動作處理報文,我們可以修改指定鏈的默認策略,使用如下命令即可。

iptables詳解(3):iptables規則管理

使用-t指定要操作的表,使用-P選項指定要修改的鏈,上例中,-P FORWARD DROP表示將表中FORWRD鏈的默認策略改為DROP。

更多case詳點此鏈接

5.保存規則

用戶修改iptables規則后,下次重啟iptables或服務器,此次的修改並不會生效,所以想永久保存,得執行相關save持久化操作。

ubuntu | centos iptables操作

ubuntu

安裝iptables:

sudo apt-get install iptables 

首先,保存現有的規則:

iptables-save > /etc/iptables.rules

然后新建一個bash腳本,並保存到/etc/network/if-pre-up.d/目錄下:

#!/bin/bash
iptables-restore < /etc/iptables.rules

這樣,每次系統重啟后iptables規則都會被自動加載。
注意:不要嘗試在.bashrc或者.profile中執行以上命令,因為用戶通常不是root,而且這只能在登錄時加載iptables規則。

cent OS

我們對規則進行了修改以后,如果想要修改永久生效,必須使用service iptables save保存規則,當然,如果你誤操作了規則,但是並沒有保存,那么使用service iptables restart命令重啟iptables以后,規則會再次回到上次保存/etc/sysconfig/iptables文件時的模樣。

從現在開始,最好養成及時保存規則的好習慣。

centos7中,已經不再使用init風格的腳本啟動服務,而是使用unit文件,所以,在centos7中已經不能再使用類似service iptables start這樣的命令了,所以service iptables save也無法執行,同時,在centos7中,使用firewall替代了原來的iptables service,不過不用擔心,我們只要通過yum源安裝iptables與iptables-services即可(iptables一般會被默認安裝,但是iptables-services在centos7中一般不會被默認安裝),在centos7中安裝完iptables-services后,即可像centos6中一樣,通過service iptables save命令保存規則了,規則同樣保存在/etc/sysconfig/iptables文件中。

此處給出centos7中配置iptables-service的步驟

#配置好yum源以后安裝iptables-service
# yum install -y iptables-services
#停止firewalld
# systemctl stop firewalld
#禁止firewalld自動啟動
# systemctl disable firewalld
#啟動iptables
# systemctl start iptables
#將iptables設置為開機自動啟動,以后即可通過iptables-service控制iptables服務
# systemctl enable iptables

上述配置過程只需一次,以后即可在centos7中愉快的使用service iptables save命令保存iptables規則了。

其他通用方法

還可以使用另一種方法保存iptables規則,就是使用iptables-save命令

使用iptables-save並不能保存當前的iptables規則,但是可以將當前的iptables規則以"保存后的格式"輸出到屏幕上。

所以,我們可以使用iptables-save命令,再配合重定向,將規則重定向到/etc/sysconfig/iptables文件中即可。

iptables-save > /etc/sysconfig/iptables

我們也可以將/etc/sysconfig/iptables中的規則重新載入為當前的iptables規則,但是注意,未保存入/etc/sysconfig/iptables文件中的修改將會丟失或者被覆蓋。

使用iptables-restore命令可以從指定文件中重載規則,示例如下

iptables-restore < /etc/sysconfig/iptables

再次提醒:重載規則時,現有規則將會被覆蓋。

整理自:朱雙印博客,www.zsythink.net

三.幫助文檔

iptables v1.6.1

Usage: iptables -[ACD] chain rule-specification [options]
       iptables -I chain [rulenum] rule-specification [options]
       iptables -R chain rulenum rule-specification [options]
       iptables -D chain rulenum [options]
       iptables -[LS] [chain [rulenum]] [options]
       iptables -[FZ] [chain] [options]
       iptables -[NX] chain
       iptables -E old-chain-name new-chain-name
       iptables -P chain target [options]
       iptables -h (print this help information)

Commands:
Either long or short options are allowed.
  --append  -A chain		Append to chain
  					# 追加規則
  
  --check   -C chain		Check for the existence of a rule
  --delete  -D chain		Delete matching rule from chain
  --delete  -D chain rulenum
				Delete rule rulenum (1 = first) from chain
				# 刪除鏈中規則,通過序號刪除
				
  --insert  -I chain [rulenum]
				Insert in chain as rulenum (default 1=first)
				# insert new rule into specific chain
				
  --replace -R chain rulenum
				Replace rule rulenum (1 = first) in chain
				# 更改規則,update rule
				
  --list    -L [chain [rulenum]]
				List the rules in a chain or all chains
				# 列出規則 規則=匹配+動作
				
  --list-rules -S [chain [rulenum]]
				Print the rules in a chain or all chains
  --flush   -F [chain]		Delete all rules in  chain or all chains
  				# 刪除規則
  				
  --zero    -Z [chain [rulenum]]
				Zero counters in chain or all chains
  --new     -N chain		Create a new user-defined chain
  --delete-chain
            -X [chain]		Delete a user-defined chain
  --policy  -P chain target
				Change policy on chain to target
				# 指定鏈上規則,更改
				
  --rename-chain
            -E old-chain new-chain
				Change chain name, (moving any references)
Options:
    --ipv4	-4		Nothing (line is ignored by ip6tables-restore)
    --ipv6	-6		Error (line is ignored by iptables-restore)
[!] --protocol	-p proto	protocol: by number or name, eg. `tcp'
				# 指定匹配協議
[!] --source	-s address[/mask][...]
				source specification
				# 指定 source ip      如果有感嘆號,表示除某IP之外的
				
[!] --destination -d address[/mask][...]
				destination specification
				# 指定 destination ip
				
	--sport		# 指定源端口
    
    --dport		# 指定目標端口
				
[!] --in-interface -i input name[+]
				network interface name ([+] for wildcard)
 --jump	-j target
				target for rule (may load target extension)
				# 指定相應動作,ACCEPT DROP RETURN, ETC
				
  --goto      -g chain
                              jump to chain with no return
  --match	-m match
				extended match (may load extension)
  --numeric	-n		numeric output of addresses and ports
  # source/dest 不解析成如anywhere,而是 ip/port, 或者網段
  
[!] --out-interface -o output name[+]
				network interface name ([+] for wildcard)
  --table	-t table	table to manipulate (default: `filter')
  # 指定操作的表,filter | nat | mangle | raw 
  
  --verbose	-v		verbose mode
  # 顯示更多信息,如pkts,bytes,source,destination,etc
  
  --wait	-w [seconds]	maximum wait to acquire xtables lock before give up
  --wait-interval -W [usecs]	wait time to try to acquire xtables lock
				default is 1 second
  --line-numbers		print line numbers when listing
  # 顯示規則編號 1,2,3,4,直接--line ubuntu也可以識別
  
  --exact	-x		expand numbers (display exact values)
  # 顯示為具體的bytes大小,擴展
  
[!] --fragment	-f		match second or further fragments only
  --modprobe=<command>		try to insert modules using this command
  --set-counters PKTS BYTES	set the counter during insert/append

   -i 網卡名稱     匹配從這塊網卡流入的數據

   -o 網卡名稱     匹配從這塊網卡流出的數據

[!] --version	-V		print package version.

iptables詳解:https://blog.csdn.net/u011537073/article/details/82685586


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM