Iptables採用了表和鏈的分層結構,每個規則表相當於內核空間的一個容器,根據規則集的不同用途劃分為預設的四個表,raw表,mangle表,nat表,filter表,每個表容器內包括不同的規則鏈,根據處理數據包的不同時機劃分為五種鏈,而決定是否過濾或處理數據包的各種規則,按先後順序存放在各規則鏈中 ...
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