Iptables采用了表和鏈的分層結構,每個規則表相當於內核空間的一個容器,根據規則集的不同用途划分為默認的四個表,raw表,mangle表,nat表,filter表,每個表容器內包括不同的規則鏈,根據處理數據包的不同時機划分為五種鏈,而決定是否過濾或處理數據包的各種規則,按先后順序存放在各規則鏈中。
1、防火牆:內核中具有包過濾體系
內核態:netfilter
用戶態:iptables 管理工具
工作在網絡層:可以對ip地址、端口、協議等信息進行處理
2、規則鏈:規則的集合
五種鏈:(必須大寫)
INPUT:入站
OUTPUT:出站
FORWARD:轉發
POSTROUTING:路由后轉換
PREROUTING:路由前轉換
1)INPUT鏈:當收到訪問防火牆本機地址的數據包(入站),應用此鏈中的規則。
2)OUTPUT鏈:當防火牆本機向外發送數據包(出站)時,應用此鏈中的規則。
3)FORWARD鏈:當收到需要通過防火牆中轉發送給其他地址的數據包(轉發)時,應用此鏈中的規則。
4)PREROUTING鏈:在對數據包做路由選擇之前,應用此鏈中的規則。
5)POSTROUTING鏈:在對數據包做路由選擇之后,應用此鏈中的規則。
3、規則表:規則鏈的集合
有4個表:
Raw:狀態跟蹤
Mangle:設置標記
Nat:地址轉換
Filter:包過濾
1)filter表:用來對數據包進行過濾,表內包含三個鏈,即:INPUT,FORWARD,OUTPUT
2)Nat表:nat表主要用來修改數據包的ip地址、端口號等信息。包含三個鏈,即PREROUTING,POSTROUTING,OUTPUT
3)Mangle表:用來修改數據包的TOS、TTL,或者為數據包設置MARL標記,實現流量整形,策略路由等高級應用,包含五個鏈,PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD
4)Raw表:用來決定是否對數據包進行狀態跟蹤,包含兩個鏈:即OUTPUT,PREROUTING
4、規則的匹配順序:
1)規則表的順序
當數據包抵達防火牆時,將依次應用raw表,mangle表,nat表和filter表中對應鏈內的規則,應用順序為raw-mangle-nat-filter
按順序依次檢查,匹配即停止(LOG策略除外),無匹配項,執行默認策略。
2)規則鏈之間的順序
入站數據流向:來自外界的數據包到達防火牆后,首先被PRETOUTING鏈處理,然后進行路由選擇,如果數據包的目標地址是防火牆本機,那么內核將其傳遞給INPUT鏈進行處理,通過以后再講給系統的上層應用程序進行響應。
轉發數據流向:來自外界的數據包到達防火牆后,首先被PREROUTING鏈處理,然后再進行路由選擇,如果數據包的目的地址是其他外部的地址,則內核將其傳遞給FORWARD鏈進行處理,最后交給POSTROUTING鏈進行處理。
出站數據流向:防火牆本機向外部地址發送的數據包,首先被OUTOUT處理,然后進行路由選擇,再交給POSTROUTING鏈進行處理。
3)規則鏈內部各條防火牆規則之間的順序
當數據包經過每條規則鏈時,依次按第一條規則,第二條規則......的順序進行匹配和處理,鏈內的過濾遵循“匹配即停止”的原則,一旦找到一條相匹配的規則,則不再檢查本鏈內后續的其它規則,如果比對完整個鏈,也找不到與數據包相匹配的規則,就按照規則鏈的默認策略進行處理。
5、iptables語法:
Iptables -t 表名 命令選項 鏈名 條件選項 -j 控制類型
1)不指定表名,為filter表
2)命令選項、鏈名、控制類型必須大寫,其他必須小寫
3)條件選項可以設置多項
6、控制類型:
1)ACCEPT:允許
2)REJECT:拒絕,返回信息
3)DROP:丟棄,無信息
4)LOG:記錄日志,傳給下一條規則
5)SNAT:源地址轉換
6)DNAT:目標地址轉換
7)MASQUERADE:ip偽裝,源地址轉換
8)REDIRECT:重定向
7、命令選項:
-A:追加到末尾
-I:插入(默認插入到第一條)
-L:查看
-D:刪除(必須加序號)
-F:清空,但默認策略不清空
-P:默認策略,只有ACCEPT或DROP兩種
-R:替換
-X:刪除自定義鏈
-N:新建自定義鏈
-n:以數字方式顯示
--line-number:添加序號
8、條件選項:
1)通用匹配:不依賴於任何條件可直接使用
-s:源地址 -d:目標地址
-p:協議 -i:入口
-o:出口 !:取反
2)隱含匹配:依賴指定的協議
--sport:源端口 --dport:目標端口
--tcp—flags:TCP標記
--icmp-type:icmp類型,有兩種:
Echo-request(可用8代替) 請求
Echo-reply(可用0代替) 回應
開啟轉發功能:
永久有效:vim /etc/sysctl.conf
Net.ipv4.ip_forward=1
生效:sysctl -p
臨時轉發,立即生效
Sysctl -w net.ipv4.ip_forward=1
Echo “1” > /proc/sys/net/ipv4/ip_forward
3)顯示配置:依賴於指定的功能模塊,必須明確指定模塊名稱才可以使用
多端口匹配:-m multiport --sports 源端口列表
-m multiport --dports 目的端口列表
IP范圍匹配:-m iprange --src-range ip范圍
MAC地址匹配:-m mac --mac-source MAC地址
狀態匹配:-m state --state 連接狀態
linux編寫iptables防火牆規則示例
iptables和asa防火牆類似,作用一樣,都是為了保證網絡安全,系統安全,服務器的安全,和asa一樣也需要建立策略。
下面通過一個案例先了解一下iptables防火牆規則的相關基礎操作。(關於防火牆的相關知識概念,請關注微信公眾號 L寶寶聊IT Linux防火牆基礎與編寫防火牆規則 文章)
實驗環境:
網站服務器ip地址是192.168.1.5,網關服務器的內網地址是eth0:192.168.1.254,外網地址是eth1:172.16.16.254,internter測試機是172.16.16.172。實現三台系統之間可以互相ping通。

網管服務器需要開啟路由轉發功能
也可進入vim /etc/sysctl.conf 修改為 1 永久開啟路由轉發功能

最后測試可以互相ping通即可
下面介紹各種規則如何應用
一、編寫防火牆規則
1、例如:在網站服務器的filter表的INPUT鏈中插入一條規則,拒絕發送給本機使用的ICMP協議的數據包。
執行:Iptables -t filter -I INPUT -p icmp -j REJECT
查看規則:iptables -L INPUT --line-numbers

然后再次使用172.16.16.172ping192.168.1.5,出現目標端口不可到達,無法ping通
2、添加新的規則
例如:
1)在filter表INPUT鏈的末尾添加一條規則,接受tcp協議(實驗之前在網站服務器上搭建ftp服務,使用internet測試機可以訪問ftp服務器)

在internet測試機上訪問

默認網站服務器的防火牆開啟,所以不能訪問,然后執行:
iptables -t filter -A INPUT -p tcp -j ACCEPT
發現依然不能訪問,因為-A是在末尾添加一條新的規則

所以執行:Iptables -I INPUT -p tcp -j ACCEPT(-I默認是添加在第一條)

再次訪問ftp

在網站服務器上查看規則

例:2)添加規則允許udp數據包通過,默認位於filter的第一條
Iptables -I INPUT -p udp -j ACCEPT
例:3)指定順序號,添加規則允許icmp數據包通過,位於第2條
Iptables -I INPUT 2 -p icmp -j ACCEPT

查看規則列表:

3、以數字形式顯示規則列表,加快執行速度
Iptables -n -L INPUT (-n -L 可簡寫為-nL)
4、刪除,清空規則
1)若要刪除filter表INPUT鏈中的第三條規則,執行:
Iptables -D INPUT 3
2)清空指定鏈或表中的所有防火牆規則,使用-F
Iptables -F INPUT
3)清空filter表,nat表,mangle表
Iptables -F
Iptables -t nat -F
Iptables -t mangle -F
5、設置默認策略:當找不到任何一條能夠匹配數據包規則時,則執行默認策略
例如1)將filter表中FORWARD鏈的默認策略設置為丟棄,OUTPUT鏈的默認策略設置為允許(默認策略不參與規則的順序編排,因此在前后並無區別。)

二、規則的匹配條件
對於同一條防火牆規則,可以指定多個匹配條件,這些條件必須都滿足規則才能生效。
1、通用匹配:分為三種類型,協議匹配,地址匹配,網絡接口匹配。
1)協議匹配
如果在網關服務器上開啟防火牆,那么internet測試機是不能訪問網站服務器的。
查看網關服務器的FORWARD鏈,發現只有一條拒絕all。
如果想允許路由轉發,執行下面的命令:
iptables -I FORWARD -j ACCEPT,然后在internet測試機上可以訪問網站服務器。

然后如果想丟棄通過icmp協議訪問防火牆本機的數據包,允許轉發經過防火牆的除icmp協議之外的數據包,可以執行:
Iptables -I INPUT -p icmp -j DROP
Iptables -A FORWARD ! -p icmp -j ACCEPT
執行之前先在internet測試機上ping網關服務器的172.16.16.254和192.168.1.5都是可以ping通的。執行完之后就不能ping通了,但是依然能夠訪問網站服務器的ftp。
先在internet測試機上ping,可以ping通

然后在網關服務器上執行以下命令

在internet測試機上ping192.168.1.5和172.16.16.254都不通了,但是ftp依然可以訪問。

2)地址匹配
例1)例如:拒絕轉發源地址為172.16.16.172的數據,允許轉發源地址192.168.1.0的數據包

因為172.16.16.172就是internet測試機,所以internet測試機無法ping通192.168.1.5,也不能訪問ftp
例2)如果檢測到來自某網段的頻繁掃描,登錄等不良的企圖,可以立即添加防火牆規則進行封鎖。
Iptables -I INPUT -s 10.20.30.0/24 -j DROP
Iptables -I FORWARD -s 10.20.30.0/24 -j DROP

3)網絡接口匹配
例如:若要丟棄從外網接口訪問防火牆本機且源地址為私有地址的數據包,執行以下操作:
首先:在172.16.16.172上ping172.16.16.254,使之可以ping通

然后執行以下命令:

再此在172.16.16.172上ping172.16.16.254,無法ping通,因為外網接口是eth1
2、隱含匹配:以指定的協議匹配作為前提條件,相當於子條件。
1)端口匹配
例如:允許網段192.168.1.0/24轉發dns查詢數據包。
首先在網站服務器上開啟dns服務
vim /var/named/chroot/var/named/google.com.zone

為了實驗效果,先在網關服務器上執行以下命令,阻止轉發
Iptables -I FORWARD -j REJECT
然后在internet測試機上執行nslookup,不能解析

接下來在網關服務器上執行隱含匹配,允許為172.16.16.0網段轉發dns查詢包

再次在internet測試機上測試解析

2)ICMP類型匹配
若要禁止從其他主機ping本機,但是允許本機ping其他主機,可以執行以下操作
首先為了實驗測試方便,在網關服務器上執行:(執行之前把其它的規則都刪掉,關閉防火牆即可編寫規則后會自動打開)
nternet測試機和網站服務器之間可以互相ping通,然后執行:

如果實驗不通,把上面的最后一條改為iptables -A INPUT -p icmp-j DROP
然后測試:


3、顯示匹配
必須調用相應的模塊,然后方可設置匹配條件
1)多端口匹配
例如:允許網站服務器本機開放25、80、110、143端口

2)ip范圍匹配
例如:禁止轉發源地址位於192.168.4.21與192.168.4.28之間的tcp數據包。

3)mac地址匹配
例如:禁止以下mac地址的主機訪問網站服務器的任何應用。

4)狀態匹配
例如:禁止轉發與正常tcp連接無關的非syn請求數據包(如偽造的網絡攻擊數據包)。

再例如:開放本機的web服務80端口,但對發給本機的tcp應答數據包予以放行,其他入站數據包均丟棄,對應的入站規則如下:

以上就時iptables防火牆規則的基本應用,下面時上機實驗部分:
三、上機實驗
1、實驗環境和上面的一樣
網站服務器ip地址是192.168.1.5,網關服務器的內網地址是eth0:192.168.1.254,外網地址是eth1:172.16.16.254,internter測試機是172.16.16.172。實現三台系統之間可以互相ping通。
2、為網站服務器編寫入站規則
(1)本例中所有規則均在filter表的INPUT鏈內添加,默認策略設置為DROP。
(2)使用“-p icmp ! --icmp-type 8 ”的條件匹配非ICMP請求的數據包。
(3)使用“-p tcp --dport 80”的條件匹配對TCP 80端口的訪問。
(4)使用“-p tcp -m state --stateESTABLISHED,RELATED”匹配TCP響應數據包。
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -A INPUT -p icmp !--icmp-type 8 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp--dport 80 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp -mstate --state ESTABLISHED,RELATED -j ACCEPT
(5)測試入站控制效果:從其他主機可以訪問本機中的Web服務,但不能訪問其他任何服務(如FTP、DNS);從本機可以ping通其他主機,但其他主機無法ping通本機。
[root@localhost ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp !type 8
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
…… //其他測試過程略
3、為網關服務器編寫轉發規則
(1)本例中所有規則均在filter表的FORWARD鏈內添加,默認策略設置為DROP。
(2)針對TCP協議的80、20、21、25、110、143端口,以及UDP協議的53端口,分別為從局域網訪問Internet、從Internet響應局域網請求的過程編寫轉發規則。
[root@localhost ~]# iptables -P FORWARD DROP
[root@localhost ~]# iptables -A FORWARD -s192.168.1.0/24 -p tcp -m multiport --dport 20,21,
80,25,110,143 -o eth1 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -i eth1-m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -s192.168.1.0/24 -p udp --dport 53 -oeth1 -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -p udp--sport 53 -i eth1-j ACCEPT
(3)執行DNS查詢,獲知站點web.qq.com、w.qq.com、im.qq.com當前所用的IP地址包括:112.90.141.88、112.90.141.163、112.90.141.164、58.251.149.159、58.251.60.202、123.138.238.100、123.138.238.101。然后依次針對這些IP地址編寫轉發規則,禁止到TCP協議的80、443端口的訪問。
[root@localhost ~]# vi /opt/black_ip.txt //編寫封禁地址列表
112.90.141.88
112.90.141.163
112.90.141.164
58.251.149.159
58.251.60.202
123.138.238.100
123.138.238.101
[root@localhost ~]# for i in `cat/opt/black_ip.txt`; do iptables -I FORWARD -d$i -p tcp -m multiport --dport 80,443 -j DROP ; done //讀取IP地址以插入規則
(4)測試轉發控制效果:從局域網中的主機無法訪問Internet中的web.qq.com等被封站點,但能夠訪問其他Web站點,也能夠訪問DNS、FTP等網絡服務。
[root@localhost ~]# iptables -nL FORWARD
Chain FORWARD (policy DROP)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 123.138.238.101 multiportdports 80,443
DROP tcp -- 0.0.0.0/0 123.138.238.100 multiport dports80,443
DROP tcp -- 0.0.0.0/0 58.251.60.202 multiport dports80,443
DROP tcp -- 0.0.0.0/0 58.251.149.159 multiport dports80,443
DROP tcp -- 0.0.0.0/0 112.90.141.164 multiport dports80,443
DROP tcp -- 0.0.0.0/0 112.90.141.163 multiport dports80,443
DROP tcp -- 0.0.0.0/0 112.90.141.88 multiport dports
文章參考微信公眾號:L寶寶聊IT
