1、iptables的規則表和鏈。web
表(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-->filtertcp
(2)iptables規則鏈:ide
①INPUT——進來的數據包應用此規則鏈中的策略
②OUTPUT——外出的數據包應用此規則鏈中的策略
③FORWARD——轉發數據包時應用此規則鏈中的策略
④PREROUTING——對數據包做路由選擇前應用此鏈中的規則
(注意:全部的數據包進來的時侯都先由這個鏈處理)
⑤POSTROUTING——對數據包做路由選擇後應用此鏈中的規則
(注意:全部的數據包出來的時侯都先由這個鏈處理)測試
鏈上規則的秩序:網站
①同類規則(訪問同一應用),匹配範圍小的放上面google
②不一樣類規則(訪問不一樣應用),匹配到報文頻率較大的放上面
③將那些可由一條規則描述的多個規則合併爲一個
④設置默認策略
第一種狀況:入站數據流向
從外界到達防火牆的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),以後會進行路由選擇(判斷該數據包應該發往何處),若是數據包 的目標主機是防火牆本機(好比說Internet用戶訪問防火牆主機中的web服務器的數據包),那麼內核將其傳給INPUT鏈進行處理(決定是否容許通 過等),經過之後再交給系統上層的應用程序(好比Apache服務器)進行響應。
第二衝狀況:轉發數據流向
來自外界的數據包到達防火牆後,首先被PREROUTING規則鏈處理,以後會進行路由選擇,若是數據包的目標地址是其它外部地址(好比局域網用戶經過網 關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),而後再交給POSTROUTING規則鏈(是否修改數據包的地 址等)進行處理。
第三種狀況:出站數據流向
防火牆本機向外部地址發送的數據包(好比在防火牆主機中測試公網DNS服務器時),首先被OUTPUT規則鏈處理,以後進行路由選擇,而後傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
2、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表中關閉追蹤
3、網絡防火牆
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
4、控制規則的存放以及開啓
注意:你所定義的全部內容,當你重啓機器的時候都會失效,要想咱們可以生效,須要使用一個命令將它保存起來
①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中定義的規則手動生效