關于iptables
Linux的防火牆體系主要工作在網絡層,針對TCP/IP資料包實施過濾和限制,屬于典型的包過濾防火牆(或稱網絡層防火牆)。iptables是一個指令行防火牆實用程式,它使用政策鍊來允許或阻止通信。當連接配接試圖在你的系統上建立自己時,iptables在它的清單中尋找一條規則來比對它。如果找不到,則采取預設操作。
netfilter/iptables過濾防火牆系統是一種功能強大的工具,可用于添加、編輯和除去規則,這些規則是在做資訊包過濾決定時,防火牆所遵循群組成的規則。這些規則存儲在專用的資訊包過濾表中,而這些表內建在Linux核心中。在資訊包過濾表中,規則被分組放在我們所謂的鍊(chain)中。
雖然netfilter/iptables包過濾系統被稱為單個實體,但它實際上由兩個元件netfilter 和 iptables 組成。
netfilter 元件也稱為核心空間(kernelspace),是核心的一部分,由一些資訊包過濾表組成,這些表包含核心用來控制資訊包過濾處理的規則集。
iptables 元件是一種工具,也稱為使用者空間(userspace),它使插入、修改和除去資訊包過濾表中的規則變得容易。
iptables工作原理
iptables的原理就是通過iptables中的規則對資料包進行控制,iptables中定義了5條鍊,每條鍊中可以定義多條規則,每當資料包到達一個鍊,iptables就會從鍊中第一條規則開始檢查,看該資料包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該資料包;否則iptables将繼續檢查下一條規則,如果該資料包不符合鍊中任一條規則,iptables就會根據該鍊預先定義的預設政策來處理資料包
1.一個資料包進入網卡時,它首先進入PREROUTING鍊,核心根據資料包目的IP判斷是否需要轉發出去。
2.如果資料包就是進入本機的,它就會沿着圖向上移動,到達INPUT鍊。資料包到了INPUT鍊後,任何程序都會收到它。本機上運作的程式可以發送資料包,這些資料包會經過OUTPUT鍊,然後到達POSTROUTING鍊輸出。
3.如果資料包是要轉發出去的,且核心允許轉發,資料包就會如圖所示向右移動,經過 FORWARD鍊,然後到達POSTROUTING鍊輸出。
iptables過濾流程
防火牆是一層層過濾的。實際是按照配置規則的順序從上到下,從前到後進行過濾的。
如果比對上規則,即明确表是阻止還是通過,此時資料包就不在向下比對新規則了。
如果所有規則中沒有明确是阻止還是通過這個資料包,也就是沒有比對上新規則,向下進行比對,直到比對預設規則得到明确的組織還是通過
防火牆的預設規則是對應鍊的所有規則執行完才會執行的。
iptables表、鍊、規則
iptables規則
規則就是網絡管理者在iptables上預定義的條件,規則一般定義為“如果資料標頭符合這樣的條件,就處理這個資料包”,規則存儲在核心空間的資訊包過濾表中,這些規則分别指定了源位址、目的位址、傳輸協定(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當資料包與規則比對時,iptables就根據規則所定義的方法來處理這些資料包,如放行(accept)、拒絕(reject)和丢棄(drop)等。配置防火牆的主要工作就是添加、修改和删除這些規則。
iptables鍊
上述規則一般都是有很多條, 将很多條規則串起來, 即形成了(規則)鍊. 核心檢查的時候, 按照鍊中的順序, 一條條的進行檢查,可以将鍊比做成一個檢查站,每個要經過檢查站的資料包,都會對其進行檢查,檢視資料包是否符合檢查站上的規則,如果有符合條件的規則,則執行規則相應的動作。Iptables上定義了五條預設的規則鍊,分别為INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。其應用時間點分别對應如下:
INPUT鍊:通過路由表後目的地為本機,應用此鍊中的規則。
OUTPUT鍊:由本機産生, 向外轉發時,應用此鍊中的規則。
FORWARD鍊:通過路由表後,當接收到需要通過防火牆發送給其他位址的資料包(轉發)時,應用此鍊中的規則。
PREROUTING鍊:在對資料包作路由選擇之前,應用此鍊中的規則。
POSTROUTING鍊:在對資料包作路由選擇之後,應用此鍊中的規則。
iptables表
我們把具有相同功能的規則的集合叫做表,是以說,不同功能的規則,我們可以放置在不同功能的表中進行管理,iptables中定義了四張表,每張表對應了不同的功能,每張表的功能如下:
Filter:一般的資料包過濾,Filter表是預設的表,如果沒有指定哪個表,iptables 就預設使用filter表來執行所有指令
Nat:網絡位址轉換(端口映射,位址映射等,可以使用nat表進行區域網路共享上網)
Managle:用于對特定資料包的修改(修改資料包的服務類型、TTL、并且可以配置路由實作QOS)
Raw:決定資料包是否被狀态跟蹤機制處理,raw表優先級最高
表的處理優先級: raw> mangle > nat > filter
表鍊關系
上面說了,表是具有相同功能的規則的集合,而鍊是有多條規則串起來的,那麼可以想一下,有些鍊是沒有具備某種功能的規則的,也就是說,有些鍊上的規則隻存在于某些表中,比如,postrouting鍊的規則隻存在于managle表和nat表,下圖是iptables表與鍊的對應關系圖:

iptables指令操作
iptables指令格式
Iptables[-t 表] [-指令參數 鍊] [-比對條件 {擴充比對}] [-j 動作]
iptables指令參數
-P —policy <鍊名> 設定指定鍊的預設政策
-L —list <鍊名> 列出所選鍊中的所有規則。 如果未選擇鍊, 則列出所有鍊。
-A —append <鍊名> 将一個或多個規則追加到標明鍊的末尾。
-I —insert <鍊名> 在指定的位置插入1條規則,如果沒有指定規則号,則預設插傳入連結的頂部
-D —delete <鍊名> 從標明的鍊中删除一個或多個規則。
-R —replace <鍊名> 替換標明鍊中的規則。
-F —flush <鍊名> 删除表中所有規則
-Z —zero <鍊名> 将所有鍊中的資料包和位元組計數器,或者隻給定的鍊,或者隻有鍊中給定的規則歸零。
-X —delete-chain <鍊名> 删除使用者自定義的鍊,如果沒有給出參數,删除所有非内建鍊
-v —verbose <鍊名> 與-L他指令一起使用顯示更多更詳細的資訊
-C —check <鍊名> 檢查鍊規則-規範檢查所選鍊中是否存在與規範比對的規則。此指令使用與-D相同的邏輯來查找比對項, 但不會更改現有的 iptables 配置, 并使用其退出代碼訓示成功或失敗。
-N —new-chain <鍊名> 建立一條使用者自定義的規則鍊
-E –-rename-chain <舊鍊名> <新鍊名> 将使用者指定的鍊重命名
—line-numbers : 顯示規則的行号
-n 以數字的方式顯示位址或端口資訊
iptables比對規則
! 在比對規則前面加上!表示取反
-p #指定協定類型,類型可以是tcp,udp,udplite,icmp,icmpv6,esp,sctp或者特殊關鍵字‘all’
—sport #指定源端口或者端口範圍
—dport #指定目标端口或者端口範圍
-s —src #指定資料包的源位址或源網段
-d —dst #指定資料包的目标位址或目标網段
-i #資料包進入的網卡
-o #資料包出去的網卡
-m —match #指定資料包規則所使用的子產品
iptables擴充子產品
-m state —state #比對狀态(狀态包括NEW,ESTABLISHED,RELATED,INVALID)
-m multiport —dports|—sports #表示比對多個不連續的端口,使用dports指定目标端口号,sports指定源端口号
-m iprange —src-range 192.168.0.2-192.168.0.20#指定一段連續的IP位址段
-m limit —limit 3/minute #指定時間内的請求速率
-m limit —limit-burst 3 #在同一時間内允許通過的請求數量
-m string —algo bm|kmp —string“xxxx” #使用string比對字元串,algo表示設定字元比對的查詢算法,一般預設使用bm算法
-m time —timestart 8:00 —timestop12:00 #表示某個時間段
-m time —datestart 2018-5-28T8:00 —datestop2018-5-29T8:00 #定義一個絕對的時間範圍
-m time —weekdays|monthdays6,7|20,21 #指定每周的周幾或者每月的幾号
-m icmp —icmp-type type[/code] #比對icmp協定的不同類型,可以使用iptables -m icmp -h 檢視icmp協定所有的類型
可以使用‘iptables -m 擴充子產品-h’檢視子產品的使用幫助
iptables動作
ACCEPT #允許資料包通過
DROP #丢棄資料包
REJECT #攔阻該資料包,并傳回資料包通知對方,可以使用—reject-with選項設定提示資訊,可以設定的提示資訊有icmp-net-unreachable、icmp-host-unreachable、icmp-proto-unreachable、icmp-port-unreachable、icmp-net-prohibited、icmp-host-prohibited、icmp-admin-prohibited、tcp-reset
LOG #對符合條件的封包的相關資訊記錄在日志中
SNAT #源位址轉換,用于區域網路共享上網,隐藏内網IP
DNAT #目的位址轉換,可配置外網通路内網服務
MASQUERADE #位址僞裝,與SNAT不同的是,他不需要指定映射的IP,它會自動将源IP映射給外網網卡上可用的IP位址
REDIRECT #端口重定向,可以将本機的端口映射到另一個端口上
MARK #給資料包打上标記,可為後續過濾的條件判斷依據
iptables執行個體
檢視iptables詳細規則
iptables -nvL
禁止所有人通路22端口
iptables -A INPUT -p tcp —dport22 -j DROP
隻允許173.168.16.0網段通路22端口
iptables -I INPUT -s173.168.16.0/24 -p tcp —dport 22 -j ACCEPT
允許關聯的狀态包通過
iptables -A INPUT -m state —stateESTABLISHED,RELATED -j ACCEPT
允許通路Samba服務的137與138這兩個udp端口
iptables -A INPUT -p udp —dport 137 -j ACCEPT
iptables -A INPUT -p udp —dport138 -j ACCEPT
禁止别人ping通自己主機
iptables -A INPUT -p icmp -micmp —icmp-type 8 -j REJECT
iptables -A OUTPUT -p icmp -micmp —icmp-type 0 -j REJECT
數字8代表的是icmp封包的類型為8,也就是‘echo-request’,表示回應要求,
而數字0代表icmp封包的類型為0,也就是‘echo-reply’,表示回應答覆,更多icmp封包的類型和編可以使用‘iptables -m icmp -h’檢視,如果為了省事可以直接使用iptables-I INPUT -p icmp -j REJECT,不過這樣就把所有的icmp包給拒絕了,我們也就無法ping通别人了
将INPUT鍊上的預設政策設定為拒絕
iptables -P INPUT DROP
将本機的220端口轉發到22端口
iptables -t nat -APREROUTING -p tcp —dport 220 -j REDIRECT —to-ports 22
将INPUT鍊裡規則序号為2的規則删除
iptables -D INPUT 2
接受源位址為173.168.16.0/24網段的IP通路22和80端口
iptables -A INPUT -s173.168.16.0/24 -p tcp -m multiport —dports 22,80 -j ACCEPT
對源IP為173.168.16.8的包超過10個時,限制速率為每五秒鐘比對一個資料包,并對其他未放行的資料包進行丢棄
iptables -A INPUT -s173.168.16.8 -p tcp -m limit —limit 12/minute —limit-burst 10 -j ACCEPT
iptables -A INPUT -s173.168.16.8 -p tcp -j DROP
這裡因為我的INPUT鍊預設規則是ACCEPT,第一條規則是每五秒鐘比對一次資料包,那麼第五秒鐘之前沒有比對到的資料包如果沒有對應的規則比對,那麼隻能比對INPUT鍊的預設規則ACCEPT,那這樣限速是完全沒用的,于是我們需要添加一條規則來将那些沒有比對到的資料包進行丢棄
iptables使用nat表做區域網路共享上網執行個體
在一個區域網路裡隻有一台電腦能上外網,其他的都不能,現在需要使用iptables的nat表來将區域網路裡的ip映射到能上外網的電腦上
環境
主機A 外網ip:60.205.177.173
内網ip:173.168.16.1
主機B 内網ip:173.168.16.2 網關:173.168.16.1
将主機B的網關修改成能上外網的主機A的ip
開啟主機A的核心轉發功能
臨時開啟
echo 1 >/proc/sys/net/ipv4/ip_forward
永久開啟
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sysctl-p #重新加載核心參數
在主機A添加規則如下
iptables-t nat -A POSTROUTING -o eth0 -s 173.168.16.0/24 -jSNAT —to-source 60.205.177.173
如果外網ip是動态的,可以使用MASQUERADE動作,他跟SNAT動作相似,隻不過他會自動映射一個可用的外網ip,規則如下:
iptables-t nat -A POSTROUTING -o eth0 -s 173.168.16.0/24 -j MASQUERADE
iptables使用nat表配置外網通路内網服務執行個體
内網中有一台web伺服器,但是外網不能直接通路到内網,需要進行ip映射到内網才可以進行通路
環境配置不變,添加規則如下:
iptables -t nat -A PREROUTING -d60.205.177.173 -p tcp -i eth0 —dport 800 -j DNAT —to-destination173.168.16.2:80
這樣就可以通過通路60.205.177.173的800端口來通路173.168.16.2上的web服務了,如果不能進行通路,可以試着将對應的SNAT規則配置一下