1. 程式人生 > >linux下iptables命令的應用與詳解

linux下iptables命令的應用與詳解

iptables

一、iptables的規則表和鏈。

表(tables)提供特定的功能,iptables內置了4個表,即filter表、nat表、mangle表和raw表,分別用於實現包過濾,網絡地址轉換、包重構(修改)和數據跟蹤處理。

鏈(chains)是數據包傳播的路徑,每一條鏈其實就是眾多規則中的一個檢查清單,每一條鏈中可以有一 條或數條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據 該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定 義的默認策略來處理數據包。

Iptables采用“表”和“鏈”的分層結構。下面羅列一下這四張表和五個鏈。註意一定要明白這些表和鏈的關系及作用。

技術分享

(1)iptables規則表:

①filter表——三個鏈:INPUT、FORWARD、OUTPUT
作用:過濾數據包 內核模塊:iptables_filter.
②Nat表

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

優先級由高到低的順序為:raw-->mangle-->nat-->filter

(2)iptables規則鏈:

①INPUT——進來的數據包應用此規則鏈中的策略
②OUTPUT——外出的數據包應用此規則鏈中的策略
③FORWARD——轉發數據包時應用此規則鏈中的策略
④PREROUTING——對數據包作路由選擇前應用此鏈中的規則
註意:所有的數據包進來的時侯都先由這個鏈處理)
⑤POSTROUTING——對數據包作路由選擇後應用此鏈中的規則
註意:所有的數據包出來的時侯都先由這個鏈處理)

鏈上規則的秩序:

①同類規則(訪問同一應用),匹配範圍小的放上面

②不同類規則(訪問不同應用),匹配到報文頻率較大的放上面

③將那些可由一條規則描述的多個規則合並為一個

④設置默認策略

第一種情況:入站數據流向

從外界到達防火墻的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),之後會進行路由選擇(判斷該數據包應該發往何處),如果數據包 的目標主機是防火墻本機(比如說Internet用戶訪問防火墻主機中的web服務器的數據包),那麽內核將其傳給INPUT鏈進行處理(決定是否允許通 過等),通過以後再交給系統上層的應用程序(比如Apache服務器)進行響應。

第二沖情況:轉發數據流向
來自外界的數據包到達防火墻後,首先被PREROUTING規則鏈處理,之後會進行路由選擇,如果數據包的目標地址是其它外部地址(比如局域網用戶通過網 關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),然後再交給POSTROUTING規則鏈(是否修改數據包的地 址等)進行處理。

第三種情況:出站數據流向
防火墻本機向外部地址發送的數據包(比如在防火墻主機中測試公網DNS服務器時),首先被OUTPUT規則鏈處理,之後進行路由選擇,然後傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。

技術分享

二、iptables命令詳解:

iptables的基本語法格式

iptables [-t 表名] 命令選項 [鏈名] [條件匹配] [-j 目標動作或跳轉]
說明:表名、鏈名用於指定 iptables命令所操作的表和鏈,命令選項用於指定管理iptables規則的方式 比如:插入、增加、刪除、查看等;條件匹配用於指定對符合什麽樣 條件的數據包進行處理;目標動作或跳轉用於指定數據包的處理方式(比如允許通過、拒絕、丟棄、跳轉(Jump)給其它鏈處理。

(1)基本命令

①-L 【鏈名】列出指定鏈上的所有規則,默認列出所有鏈上的規則。

舉例:列出INPUT鏈上的所有規則

iptables -L INPUT

-n 以數字方式顯示

-v 列出更詳細信息

通常-vnL(L只能寫到最後)一起使用,查看防火墻上面的所有策略。

iptables -vnL

②--line-numbers 以序列號方式列出策略,通常和-vnL一起使用。

舉例:查看防火墻上有多少條策略

iptables -vnL --line-numbers

③-A 追加

④-I 插入一條策略,默認是第一條策略。

舉例:把禁止172.17.66.66ping本機寫到INPUT規則鏈的第二條。

iptables -A INPUT 2 -s 172.17.66.66 -p icmp -j REJECT

⑤-R 修改策略

舉例:修改上個例子中禁ping本機的ip地址172.17.66.66為172.17.88.88

iptables -R INPUT 2 -s 172.17.88.88 -p icmp -j RENECT

⑥-D 刪除策略 【註意:需要指明規則序號和規則本身】

舉例:刪除INPUT規則鏈上所有策略

iptables -D INPUT 2

⑦-F 清空所有策略

舉例:清空防火墻上所有策略

iptables -F

⑧-S 命令方式顯示出策略,可以重定向文件裏。

舉例:把所有策略導入到iptables.txt文件裏

iptables -S > iptables.txt

⑨-N 自定義規則鏈(必須放到系統自帶的五個規則鏈中的一個才能生效】

自定義規則鏈:iptables -N account

給自定義規則鏈添加策略:iptables -A account -s 172.17.66.66,172.17.88.88 -j ACCEPT

自定義規則鏈加到系統規則鏈裏:iptables -A INPUT -j account

⑩-X 刪除自定義的規則鏈

從系統規則鏈裏刪除自定義鏈:iptables -D INPUT (自定義規則序號)

清空自定義規則鏈裏面的策略:iptables -F account

刪除自定義的規則鏈:iptables -X account

技術分享

技術分享

(2)基本匹配條件:無需加載模塊,由iptables/netfilter自行提供,不需要加-m

①[!] --dport 指定端口

iptables -A INPUT -p tcp --dport 22:23:24,80 -j REJECT

②[!] -s --source address[/mask][,...]:源IP地址或範圍

③[!] -d --destination address[/mask][,...]:目標IP地址或範圍

④[!] -p --protocol protocol:指定協議,可使用數字如0(all)

protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp,

舉例:拒絕172.17.66.66訪問172.17.88.88的tcp80端口

iptables -A FORWARD -s 172.17.66.66 -d 172.17.88.88 -p tcp --dport 80 -j REJECT

說明:[!]說明可以取反。

舉例:除了172.17.66.66不能ping本機,其它都可以

iptables -A INPPUT ! -s 172.17.66.66 -p icmp -j REJECT

⑤[!] -i, --in-interface name:報文流入的接口;只能應用於數據報文流入環節,只應用於INPUT、FORWARD、PREROUTING鏈

舉例:【iptables -A INPUT -s 172.17.66.66 -i eth0 -j REJECT

⑥[!] -o, --out-interface name:報文流出的接口;只能應用於數據報文流出的環節,只應用於FORWARD、OUTPUT、POSTROUTING鏈

(3)擴展命令:

multiport擴展

以離散方式定義多端口匹配,最多指定15個端口

[!] --source-ports,--sports port[,port|,port:port]...指定多個源端口

[!] --destination-ports,--dports port[,port|,port:port]...指定多個目標端口

[!] --ports port[,port|,port:port]...多個源或目標端口

示例:允許172.17.0.0/16這個段的網絡通過20、80端口訪問本機

iptables -A INPUT -s 172.16.0.0/16 -p tcp -m multiport --dports 20,80 -j ACCEPT

②iprange擴展

指明連續的(但一般不是整個網絡)ip地址範圍

[!] --src-range from[-to] 源IP地址範圍

[!] --dst-range from[-to] 目標IP地址範圍

示例:拒絕172.16.100.5-172.16.100.10這個網段的ip通過tcp80端口訪問本機

iptables -A INPUT -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP

mac擴展

指明源MAC地址

--mac-source XX:XX:XX:XX:XX:XX

示例:拒絕00:50:56:12:34:56這個mac地址訪問本機

iptables -A INPUT -s 172.16.0.100 -m mac --macsource 00:50:56:12:34:56 -j ACCEPT

④string擴展: 【回應報文】

對報文中的應用層數據做字符串模式匹配檢測

--algo {bm|kmp}:字符串匹配檢測算法

bm:Boyer-Moore

kmp:Knuth-Pratt-Morris

[!] --string pattern:要檢測的字符串模式

[!] --hex-string pattern:要檢測字符串模式,16進制格式

示例:拒絕172.16.0.0/16這個網段的ip訪問帶有goolge字樣的網站

iptables -A OUTPUT -s 172.16.0.0/16 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT

⑤time擴展

根據將報文到達的時間與指定的時間範圍進行匹配

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期

--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--timestart hh:mm[:ss] 時間

--timestop hh:mm[:ss]

[!] --monthdays day[,day...] 每個月的幾號

[!] --weekdays day[,day...] 星期幾

註意:CentOS7系統默認為UTC 【需要減八個小時是北京時區】

舉例:拒絕172.16.0.0/16這個網段在每周的Sat,Sun的14:30-18:30訪問tcp的80端口

iptables -A INPUT -s 172.16.0.0/16 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP

⑥connlimit擴展

根據每客戶端IP做並發連接數數量匹配可防止CC(Challenge Collapsar挑戰黑洞)攻擊

--connlimit-upto n:連接的數量小於等於n時匹配

--connlimit-above n:連接的數量大於n時匹配

示例:當連接數量大於2時拒絕訪問172.16.100.10

iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

state擴展

conntrack機制:追蹤本機上的請求和響應之間的關系

狀態有如下幾種:

NEW:新發出請求;連接追蹤信息庫中不存在此連接的相關信息條目,因此,將其識別為第一次發出的請求

iptables -A INPUT -s 172.17.66.66 -p tcp --dports 80 -m state --state NEW -j REJECT 【正在進行的沒事,新連接的拒絕,即重新訪問80端口的都不行】

ESTABLISHED:NEW狀態之後,連接追蹤信息庫中為其建立的條目失效之前期間內所進行的通信狀態

RELATED:新發起的但與已有連接相關聯的連接,如:ftp協議中的數據連接與命令連接之間的關系

INVALID:無效的連接,如flag標記不正確

UNTRACKED:未進行追蹤的連接,如raw表中關閉追蹤

三、網絡防火墻

iptables/netfilter網絡防火墻:
(1) 充當網關
(2) 使用filter表的FORWARD鏈

SNAT

讓本地網絡中的主機通過某一特定地址訪問外部網絡,實現地址偽裝

網絡拓撲:

技術分享


基於原地址的轉換一般用在我們的許多內網用戶通過一個外網的口上網的時候,這時我們將我們內網的地址轉換為一個外網的IP,我們就可以實現連接其他外網IP的功能

定義的樣式:

比如我們現在要將所有192.168.0.0/24網段的IP經過路由器(記得開啟轉發功能,同時連接外網和內網)的時候全都轉換成8.8.8.8這個假設出來的外網地址:

命令:iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 8.8.8.8

這樣,只要是來自本地網絡的試圖通過網卡訪問網絡的,都會被統統轉換成8.8.8.8這個IP.

②DNAT

對於目標地址轉換,數據流向是從外向內的,外面的是客戶端,裏面的是服務器端通過目標地址轉換,我們可以讓外面的ip通過我們對外的外網ip來訪問我們服務器不同的服務器,而我們的服務卻放在內網服務器的不同的服務器上。

定義的樣式:

比如我們現在在互聯網上想訪問192.168.0.0/24這個網段的局域網,經過路由器的時候全部轉換為192.168.2.2這個內網地址:

命令:iptables -t nat -A PREROUTING -d 8.8.8.8 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.0/24

四、控制規則的存放以及開啟

註意:你所定義的所有內容,當你重啟機器的時候都會失效,要想我們能夠生效,需要使用一個命令將它保存起來

①service iptables save 命令

它會保存在/etc/sysconfig/iptables這個文件中

②iptables-save 命令

iptables-save > /etc/sysconfig/iptables

③iptables-restore 命令

開機的時候,它會自動加載/etc/sysconfig/iptabels

如果開機不能加載或者沒有加載,而你想讓一個自己寫的配置文件(假設為iptables.2)手動生效的話:

iptables-restore < /etc/sysconfig/iptables.2

則完成了將iptables中定義的規則手動生效


linux下iptables命令的應用與詳解