iptables防火牆

一、簡介

IPTABLES 是與最新的 3.5 版本 Linux 內核集成的 IP 信息包過濾系統。若是 Linux 系統鏈接到因特網或 LAN、服務器或鏈接 LAN 和因特網的代理服務器, 則該系統有利於在 Linux 系統上更好地控制 IP 信息包過濾和防火牆配置。(百度百科)前端

  • 防火牆起到數據包過濾做用。
    SNAT 私網用戶到公網 源NAT是咱們出去
    DNAT 公網用戶到私網 目標NAT是公網進來web

  • 硬件防火牆有三個接口
    內網接口
    外網接口
    DMZ接口 DMZ是英文「demilitarized zone」的縮寫,中文名稱爲「隔離區」,也稱「非軍事化區」。

firewalld 與 iptables的比較:後端

1.firewalld能夠動態修改單條規則,動態管理規則集,容許更新規則而不破壞現有會話和鏈接。而iptables,在修改了規則後必須得所有刷新才能夠生效;
    2.firewalld使用區域和服務而不是鏈式規則;
    3.firewalld默認是拒絕的,須要設置之後才能放行。而iptables默認是容許的,須要拒絕的才能限制;
    4.firewalld並不具有防火牆的功能,和iptables同樣須要經過內核的netfilter來實現。只不過firewalld和iptables的使用方法不同!

firewalld是iptables的一個封裝,可讓你更容易地管理iptables規則。它並非iptables的替代品,雖然iptables命令仍可用於firewalld,但建議firewalld時僅使用firewalld命令。centos

學習iptables不得不提的幾個概念,首先咱們應該瞭解什麼是四表五鏈:
iptables防火牆安全

1.Filter 表[過濾]
filter表用來過濾數據包,咱們能夠在任什麼時候候匹配包並過濾它們。咱們就是在這裏根據包的內容對包作DROP或ACCEPT的。固然,咱們也能夠預先在其餘地方作些過濾,可是這個表纔是設計用來過濾的。幾乎全部的target均可以在這兒使用。大量具體的介紹在後面,如今你只要知道過濾工做主要是在這兒完成的就好了。bash

2.nat 表[假裝]
此表僅用於NAT,也就是轉換包的源或目標地址。注意,就象咱們前面說過的,只有流的第一個包會被這個鏈匹配,其後的包會自動被作相同的處理。實際的操做分爲如下幾類:
• DNAT
• SNAT
• MASQUERADE
DNAT 操做主要用在這樣一種狀況,你有一個合法的IP地址,要把對防火牆的訪問重定向到其餘的機子上(好比DMZ)。也就是說,咱們改變的是目的地址,以使包能重路由到某臺主機。
SNAT 改變包的源地址,這在極大程度上能夠隱藏你的本地網絡或者DMZ等。一個很好的例子是咱們知道防火牆的外部地址,但必須用這個地址替換本地網絡地址。有了這個操做,防火牆就能自動地對包作SNAT和De-SNAT(就是反向的SNAT),以使LAN能鏈接到Internet。若是使用相似 192.168.0.0/24這樣的地址,是不會從Internet獲得任何迴應的。由於IANA定義這些網絡(還有其餘的)爲私有的,只能用於LAN內部。
MASQUERADE 的做用和MASQUERADE 徹底同樣,只是計算機的負荷稍微多一點。由於對每一個匹配的包,MASQUERADE 都要查找可用的IP地址,而不象SNAT 用的IP地址是配置好的。固然,這也有好處,就是咱們可使用經過PPP、 PPPOE、SLIP等撥號獲得的地址,這些地址但是由ISP的DHCP隨機分配的。服務器

3.mangle 表[改包]
這個表主要用來mangle包,你可使用mangle匹配來改變包的TOS等特性。
強烈建議你不要在這個表裏作任何過濾,不論是DANT,SNAT或者Masquerade。
如下是mangle表中僅有的幾種操做:
• TOS
• TTL
• MARK
TOS操做用來設置或改變數據包的服務類型域。這經常使用來設置網絡上的數據包如何被路由等策略。注意這個操做並不完善,有時得不所願。它在Internet上還不能使用,並且不少路由器不會注意到這個域值。換句話說,不要設置發往Internet的包,除非你打算依靠TOS來路由,好比用iproute2。TTL操做用來改變數據包的生存時間域,咱們可讓全部數據包只有一個特殊的TTL。它的存在有一個很好的理由,那就是咱們能夠欺騙一些ISP。爲何要欺騙他們呢?由於他們不肯意讓咱們共享一個鏈接。那些ISP會查找一臺單獨的計算機是否使用不一樣的TTL,而且以此做爲判斷鏈接是否被共享的標誌。MARK用來給包設置特殊的標記。iproute2能識別這些標記,並根據不一樣的標記(或沒有標記)決定不一樣的路由。用這些標記咱們能夠作帶寬限制和基於請求的分類。網絡

4.RAW 表[鏈路跟蹤]
RAW表只使用在PREROUTING鏈和OUTPUT鏈上,由於優先級最高,從而能夠對收到的數據包在鏈接跟蹤前進行處理。一但用戶使用了RAW表,在某個鏈上,RAW表處理完後,將跳過NAT表和 ip_conntrack處理,即再也不作地址轉換和數據包的連接跟蹤處理了。
RAW表能夠應用在那些不須要作nat的狀況下,以提升性能。如大量訪問的web服務器,可讓80端口再也不讓iptables作數據包的連接跟蹤處理,以提升用戶的訪問速度。app

其次咱們應該熟悉iptables的工程流程:
iptables防火牆ssh

最後咱們再來看一下規則匹配流程:
iptables防火牆

路由發生的時刻:
    報文進入本機後:
        判斷目標主機;
    報文發出以前:
        判斷經由哪一個接口送往下一跳;

iptables:四表五鏈
    添加規則時的考量點:
        (1) 要實現哪一種功能:判斷添加在哪張表上;
        (2) 報文流經的路徑:判斷添加在哪一個鏈上;

    鏈:鏈上規則的次序,即爲檢查的次序;所以隱含必定的法則
        (1) 同類規則(訪問同一應用),匹配範圍小的放上面;
        (2) 不一樣類規則(訪問不一樣應用),匹配到報文頻率較大的放上面;
        (3) 將那些可由一條規則描述的多個規則合併爲一個;
        (4) 設置默認策略;【若是用不到鏈接追蹤功能應該關閉】

二、命令使用語法

iptables命令:

   iptables [-t table] {-A|-D} chain rule-specification

   iptables [-t table] -I chain [rulenum] rule-specification

   iptables [-t table] -R chain rulenum rule-specification

   iptables [-t table] -D chain rulenum

   iptables [-t table] -S [chain [rulenum]]

   iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

   iptables [-t table] -N chain

   iptables [-t table] -X [chain]

   iptables [-t table] -P chain target

   iptables [-t table] -E old-chain-name new-chain-name

   -t table:
        filter, nat, mangle, raw

    鏈管理:
        -F:flush,清空規則鏈;省略鏈,表示清空指定表上的全部的鏈;
        -N:new, 建立新的自定義規則鏈;
        -X:drop, 刪除用戶自定義的空的規則鏈;
        -Z:zero,清零,置零規則計數器;
        -P:Policy,爲指定鏈設置默認策略;對filter表中的鏈而言,默認策略一般有ACCEPT, DROP, REJECT; 
        -E: rEname,重命名自定義鏈;引用計數不爲0的自定義鏈,沒法更名,也沒法刪除;
    規則管理:
        -A:append,將新規則追加於指定鏈的尾部;
        -I:insert,將新規則插入至指定鏈的指定位置; 【不指定rulenum插入爲第一條】
        -D:delete,刪除指定鏈上的指定規則;
            有兩種指定方式:
                (1) 指定匹配條件;
                (2) 指定規則編號;
        -R:replace,替換指定鏈上的指定規則;
    查看:
        -L:list,列出指定鏈上的全部規則;
            -n: numberic,以數字格式顯示地址和端口號;  【不進行反解,和route、netstat同樣】
            -v: verbose,顯示詳細信息;  【包括計數器信息】
                -vv, -vvv
            --line-numbers:顯示規則編號;
            -x: exactly, 顯示計數器計數結果的精確值;

    匹配條件:
        基本匹配:
            [!] -s, --src, --source IP|Netaddr:檢查報文中源IP地址是否符合此處指定的地址範圍;
            [!] -d, --dst, --destination IP|Netaddr:檢查報文中目標IP地址是否符合此處指定的地址範圍;
            -p, --protocol {tcp|udp|icmp}:檢查報文中的協議,即ip首部中的protocols所標識的協議;
            -i, --in-interface IFACE:數據報文的流入接口;僅能用於PREROUTING, INPUT及FORWARD鏈上;
            -o, --out-interface IFACE:數據報文的流出接口;僅能用於FORWARD, OUTPUT及POSTROUTING鏈上;

        擴展匹配:-m macth_name --spec_options
                例如:-m tcp --dport 22

            隱式擴展:對-p protocol指明的協議進行的擴展,可省略-m選項;
                -p tcp
                    --dport PORT[-PORT]:目標端口,能夠是單個端口或連續多個端口;  【#注意:不連續的端口號不能夠】如:[1024:65535]
                    --sport PORT[-PORT]
                    --tcp-flags LIST1 LIST2:檢查LIST1所指明的全部標誌位,且這其中,LIST2所表示出的全部標誌位必須爲1,而餘下的必須爲0;沒有LIST1中指明的,不做檢查;
                        SYN, ACK, FIN, RST, PSH, URG

                        --tcp-flags SYN,ACK,FIN,RST SYN
                    --syn: 
                               【--tcp-flags ALL ALL】 檢查全部標誌位每個都爲1
                               【--tcp-flags ALL NONE】檢查全部標誌位每個都爲0
                -p udp
                    --dport
                    --sport

                -p icmp
                    --icmp-type
                        可用數字表示其類型:
                            0:echo-reply
                            8: echo-request

            顯式擴展: 必須使用-m選項指定使用的擴展;

管理規則
-A:附加一條規則,添加在鏈的尾部
-I CHAIN [num]: 插入一條規則,插入爲對應CHAIN上的第num條;
-D CHAIN [num]: 刪除指定鏈中的第num條規則;
-R CHAIN [num]: 替換指定的規則;

管理鏈:
-F [CHAIN]:flush,清空指定規則鏈,若是省略CHAIN,則能夠實現刪除對應表中的全部鏈
-P CHAIN: 設定指定鏈的默認策略;
-N:自定義一個新的空鏈
-X: 刪除一個自定義的空鏈
-Z:置零指定鏈中全部規則的計數器;
-E: 重命名自定義的鏈;

查看類:
-L: 顯示指定表中的規則;
-n: 以數字格式顯示主機地址和端口號;
-v: 顯示鏈及規則的詳細信息
-vv:
-x: 顯示計數器的精確值
--line-numbers: 顯示規則號碼

動做(target):
ACCEPT:放行
DROP:丟棄
REJECT:拒絕
DNAT:目標地址轉換
SNAT:源地址轉換
REDIRECT:端口重定向
MASQUERADE:地址假裝
LOG:日誌
MARK:打標記

三、經常使用命令

#!/bin/bash
#   默認filter鏈策略是ACCEPT======》能夠將它們設置成DROP 【默認策略一般有ACCEPT, DROP, REJECT】
#   注意默認規則是DROP的時候,遠程鏈接時千萬不要執行 iptables -F 會瞬間掉線,由於chain的規則是當即生效!
#   注意【防掉線策略】iptables -L -n -v && sleep 10 && iptables -P INPUT ACCEPT;iptables -P OUTPUT ACCEPT;iptables -F 或者設置crontab 5分之後自動清空iptables規則sh test.sh && sleep 10 && iptables -P INPUT ACCEPT; iptables -P OUTPUT ACCEPT; iptables -F
#[iptables -P INPUT ACCEPT]
#[iptables -P OUTPUT ACCEPT]

    #iptables -F
    #service iptables save
    service iptables stop #清除全部規則,恢復默認策略ACCEPT
    iptables -A INPUT -i lo -j ACCEPT
    iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.22 -p tcp --dport 22 -j ACCEPT
    iptables -t filter -A OUTPUT -s 172.16.100.22 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP
    service iptables save
    service iptables restart

放行本機的tftp服務:

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p udp --dport 69 -j ACCEPT
    iptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p udp --sport 69 -j ACCEPT

放行本機dns服務:

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p udp --dport 53 -j ACCEPT
    iptables -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p udp --sport 53 -j ACCEPT
    iptables -A OUTPUT -s 172.16.100.7 -p udp --dport 53 -j ACCEPT
    iptables -A INPUT -d 172.16.100.7 -p udp --sport 53 -j ACCEPT

放行ping其它主機

iptables -A OUTPUT -s 172.16.100.7 -p icmp  --icmp-type 8 -j ACCEPT
    iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 0 -j ACCEPT

放行其它主機ping

iptables -A INPUT -d 172.31.33.200 -p icmp --icmp-type 8 -j ACCEPT
    iptables -A OUTPUT -s 172.31.33.200 -p icmp  --icmp-type 0 -j ACCEPT

放行來自於172.16.0.0/16網絡的主機對本機ssh服務的請求

iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -p tcp --dport 22 -j ACCEPT
    iptables -t filter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT

多端口匹配

iptables -I INPUT -s 172.16.0.0/16 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCEPT
    iptables -I OUTPUT -d 172.16.0.0/16 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCEPT

ip地址範圍匹配

iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.100.1-172.16.100.120 -j ACCEPT
    iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.100.1-172.16.100.120 -j ACCEPT

報文中字符串匹配

iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT

速率限制匹配

iptables -A INPUT -d 172.16.100.9 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
    iptables -A OUTPUT -s 172.16.100.9 -p icmp --icmp-type 0 -j ACCEPT

啓用鏈接追蹤

iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT
    iptables -I INPUT 2 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
    iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT

    最優條目
         iptables -I INPUT 2 -d 172.31.33.200 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
         iptables -I OUTPUT -s 172.31.33.200 -m state --state ESTABLISHED -j ACCEPT

如何保存及重載規則:

保存規則至指定文件:
        iptables-save > /PATH/TO/SOMEFILE

    從指定文件重載規則:
        iptables-restore < /PATH/FROM/SOMEFILE

    CentOS 6:
        service iptables save 
            iptables-save > /etc/sysconfig/iptables

        service iptables restart
            iptables-restore < /etc/sysconfig/iptables

    CentOS 7:
        引入了新的iptables前端管理服務工具:firewalld
            firewalld-cmd
            firewalld-config
                 【systemctl disable firewalld.service】禁止開機啓動
                 【systemctl stop firewalld.service】中止服務

四、總結

iptables防火牆並不能阻止DDOS,建議在項目實施中採購硬件防火牆,置於整個系統以前,用於防DDOS和端口映射;若是對安全有特殊要求,可再加上應用層級的防火牆。在項目實施中建議關閉Linux服務器的iptables防火牆或FreeBSD的ipfw,目的爲:①更好的提升後端服務器網絡性能;②方便數據流在整個業務系統內部流通,安全方面工做由硬件防火牆來承擔。目前主要將iptables用於內部做NAT防火牆,它的性能和方便管理性確實強悍,經迅雷測試可發現,公司內部的10M帶寬能被利用得一絲無餘;強烈推薦的是讓iptables做NAT路由轉發,事實證實效果很好。繁忙的服務器不要啓用ip_conntrack【centos6是nf_conntrack】鏈接跟蹤模塊,不然會致使後續的用戶請求被丟棄。若是是使用遠程來調試iptables防火牆,最好是設置crontab做業是定時中止防火牆,以防本身被鎖定,5分鐘中止一次iptables便可,等整個腳本徹底穩定後再關閉此crontab做業。若是是機房租賃的服務器,在沒有配置前端硬件防火牆的狀況下,Linux主機必定要開啓iptables防火牆。

相關文章
相關標籤/搜索