iptables(2)


iptables命令的使用格式:nginx

    iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]]  [-j targetname [per-target-options]]算法

wKiom1gLYQvytgSeAAB0__31ebQ898.jpg-wh_50


wKiom1gLYS7QmzSZAAIr-_tNT3s390.jpg-wh_50

匹配條件:shell

基本匹配條件安全

擴展匹配條件bash

    隱式擴展服務器

    顯式擴展網絡

注意:多重條件之間的隱含邏輯爲「與」操做;併發

基本匹配條件:負載均衡

    條件以前的!表示能夠對條件進行取反ssh

    (1)[!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或地址範圍;

        

iptables -I INPUT -s 10.1.0.71 -j REJECT //拒絕來自10.1.0.71的訪問
iptables -I INPUT -s 10.1.0.0/16 -j ACCEPT //放行10.1.0.0/16網絡中的主機訪問
iptables -R INPUT 1 -s 10.1.0.71 -j DROP //來自10.1.0.71的訪問的包丟掉
iptables -D INPUT 1 //刪除INPUT鏈中的第一條規則
iptables -D INPUT -s 10.1.0.71 -j DROP //刪除明確給出規則的INPUT鏈規則


    (2)[!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或地址範圍;

    

    (3)[!] -p, --protocol protocol:檢查報文中傳輸層的協議類型,支持tcp, udp,  udplite, icmp,  icmpv6,esp,  ah, sctp, mh,或者 "all";

         iptables -A INPUT -s 10.1.0.0/16 -d 10.1.0.6 -p tcp -j ACCEPT //開放來自10.1.0.0/16網絡中的主機訪問10.1.0.6網卡的tcp協議報文

    (4)[!] -i, --in-interface name:檢查報文進入本機時的接口是否符合本處指定的接口;INPUT, FORWARD  and  PREROUTING ;

    (5)[!] -o, --out-interface name:檢查報文即將離開本機時經由的接口是否符合本處指定的接口;FORWARD, OUTPUT and POSTROUTING;

    

    

    -m, --match match:顯式指明要使用的擴展模塊;

    -j, --jump target:跳轉目標;

     

擴展匹配條件:

(1)隱式擴展:不用-m選項明確給出要使用的擴展機制的擴展;此處主要指使用-p {tcp|udp|icmp}給定協議後可直接對給定的協議所進行的擴展;

也能夠在給定協議以後使用 -m tcp ,  -m udp ...顯式擴展必須給定-m指定

-p tcp:可直接使用tcp協議對應的擴展選項;

    (1)[!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個鏈接的端口; 

    iptables -A INPUT -s 10.1.0.0/16 -d 10.1.0.67 -p tcp --dport 22 -j ACCEPT //進站

    iptables -A OUTPUT -d 10.1.0.0/16 -s 10.1.0.67 -p tcp --sport 22 -j ACCEPT 

//開放本網段的進入本機22端口的請求報文

    (2)[!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個鏈接的端口;

        (3)[!] --tcp-flags mask comp

  SYN,ACK,FIN,RST,URG,PSH;

mask:要檢查的標誌位列表,以逗號分隔,例如SYN,ACK,FIN,RST 

comp:mask給定的衆標誌位中,其值必須爲1的標誌位列表,餘下的必須爲0;

--tcp-flags SYN,ACK,FIN,RST SYN 

    (4)[!] --syn:至關於--tcp-flags SYN,ACK,FIN,RST SYN 

    -p udp:可直接使用udp協議對應的擴展選項;

    (1)[!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個鏈接的端口;

    (2)[!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個鏈接的端口;

-p icmp:可直接使用icmp協議對應的擴展選項;

    [!] --icmp-type {type[/code]|typename}

    --icmp-type  0/0:匹配對ping請求的響應報文

    --icmp-type 8/0:匹配ping請求報文

    wKioL1gLYiGRze3GAADFZncW4Bs854.jpg-wh_50

(2)顯式擴展:必須使用-m選項給出matchname的擴展,並且有些擴展都還存在專用選項;

    一、multiport

    以離散或連續的方式定義的多端口匹配條件; Up  to 15 ports can be specified. 

    

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

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

    [!] --ports port[,port|,port:port]...:匹配此處指定的源或目標端口;

    iptables -A INPUT -d 10.1.0.6 -p tcp -m multiport --dport 22,23,80 -j ACCEPT //開放本地的22,23,80端口進站請求

    iptables -A INPUT -s 10.1.0.6 -p tcp -m multiport --sport 22,23,80 -j ACCEPT //容許22,23,80端口迴應客戶請求

二、iprange

    以連續的ip地址範圍指明多地址匹配條件;

    

    [!] --src-range from[-to]

    -m iprange --src-range from 10.1.68.1 to 10.1.68.10

    [!] --dst-range from[-to]

三、string

    對報文中的應用層數據作字符串匹配檢測;

    

    [!] --string pattern

    [!] --hex-string pattern

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

    --from offset

    --to offset

    過濾過過程當中遇到的問題:當使用httpd啓動80端口時迴應報文中的敏感詞彙能夠過濾

         可是當使用nginx啓動80端口迴應報文時對字符過濾時沒有效果

四、time

    根據報文到達的時間與指定的時間範圍進行匹配度檢測;

    

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

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

    時間沒法取反

    --timestart hh:mm[:ss]

    --timestop hh:mm[:ss]

    iptables -I INPUT -d 10.1.68.15 -p tcp --dport 23 -m time --timestart 16:00:01 --timestop 09:59:59 --weekdays wed -j REJECT //限制telnet服務在週三的下午四點到早上九點五十九不提供訪問

     使用能夠起始時間大於開始時間

    -A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri  --datestop 2038-01-19T11:14:07 -j ACCEPT //telnet服務只在工做時間提供服務

     [!] --monthdays day[,day...]

     

     [!] --weekdays day[,day...]

     

五、connlimit 

    根據每客戶端IP作併發鏈接數限制,即限制單IP可同時發起鏈接請求;

    

    --connlimit-upto n:鏈接數小於等於閾值;

    --connlimit-above n:鏈接數超出閾值;

    --connlimit-mask 24 :prefix_length

    ~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

六、limit 

    基於收發報文的速率進行匹配;

    

    --limit rate[/second|/minute|/hour|/day] 默認是每小時三個,

    --limit-burst number//默認有令牌桶中有五個令牌。

    若是是使用iptables -I INPUT -p icmp --icmp-type 8 -m limit  -j ACCEPT

    //不指定速率則會第一次由令牌桶中的五個令牌響應請求,以後每小時放行三個請求

    

    

    ~]# iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT

 

七、state 

    狀態檢測:鏈接追蹤機制(conntrack)

         至關於有一個連接追蹤的表,有新請求過來,看錶中有沒有,沒有就加進去。若是表滿了,會使一些訪問被拒絕

    

    NEW:表中沒不存在的條目,新鏈接

    ESTABLISHED:已創建的鏈接,即表中已經存在此條目

    RELATED:相關聯的鏈接

    INVALID:沒法識別的鏈接 //不像新的也不是已經鏈接的表中沒條目可是又有相關信息

    UNTRACKED:未被追蹤鏈接;

    

    相關的內核模塊:

    nf_conntrack

    nf_conntrack_ipv4  

    nf_conntrack_ftp//想追蹤相關連的連接,須要開啓此模塊

    

    追蹤到的鏈接:/proc/net/nf_conntrack文件中;

    

    能追蹤的最大鏈接數量定義在:/proc/sys/net/nf_conntrack_max

    建議調整至足夠大;若是鏈接請求超過此值,訪問會被拒絕。若是服務器是調度器負載均衡器 ,最好不要開啓此功能

    

    不一樣的協議的鏈接追蹤時長:

    /proc/sys/net/netfilter/

    如:咱們的服務器由80端口鏈接別人,正常狀況下這種狀態是不存在的,若是服務器中***,控制咱們的80端口發出鏈接出去;咱們設置80端口只容許進來爲new的請求,出去ESTABLISEHD。;若是OUTPUT規則設置爲DROP,咱們可讓出去的是ESTABLISEHD狀態的放行,能夠安全的放行全部鏈接進入的服務。若是設置ftp能出去,設置RELATED狀態的服務准許出去。就能基於狀態放行ftp服務

    

    INPUT鏈默認規則爲爲DROP

iptables -A INPUT -d 10.1.68.15 -p tcp -m multiport --dports 22,80,23 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d 10.1.68.15 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT


 

OUTPUT鏈默認規則爲DROP

iptables -A OUTPUT -s 10.1.68.15  -m state --state ESTABLISHED -j ACCEPT


 

[!] --state state

如何開放被動模式的ftp服務:

    (1) 裝載追蹤ftp協議的模塊;

    # modprobe nf_conntrack_ftp

    

    

    (2) 放行入站命令鏈接

# iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT


(3) 放行入站數據鏈接

# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT


(4) 放行出站的ESTABLISHED鏈接

# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT								


處理動做(跳轉目標):

    -j tagetname [per-target-options]

    簡單target:

    ACCEPT,DROP

    

    擴展target:

    REJECT:

            --reject-with type

icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默認爲icmp-port-unreachable;

LOG:

Turn  on  kernel  logging of matching packets.

   --log-level level

   --log-prefix prefix:日誌信息的前導信息;即給定日誌記錄的描述字符串。

保存和載入規則:

    保存:iptables-save > /PATH/TO/SOME_RULE_FILE 

    重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE

        -n, --noflush:不清除原有規則

        -t, --test:僅分析生成規則集,但不予提交;

    

    注意:重載文件中的規則,會清除已有規則;

    

    CentOS 6:

        保存規則:service  iptables  save

        保存規則於/etc/sysconfig/iptables,保存操做會清除文件中原有的內容;

        重載規則:server iptables restart 

        默認重載/etc/sysconfig/iptables文件中的規則

        

        腳本配置文件:/etc/sysconfig/iptables-config

        用於指明要裝載的模塊;

    

    CentOS 7開機自動生效規則:

        (1) firewalld服務;

        (2) shell腳本,直接記錄iptables命令;

        (3) 自定義unit file或init script;

規則優化的思路:

    (1) 優先放行雙方向狀態爲ESTABLISHED的報文;

    (2) 服務於不一樣類別的功能的規則,匹配到報文可能性更大的放前面;//相對服務來講就是服務被訪問的比較多的放前面

    (3) 服務於同一類別的功能的規則,匹配條件較爲嚴格的放前面;

    (4) 設置默認策略:白名單機制

    (a) 可以使用iptables -P設定默認策略;

    (b) 建議在規則鏈的最後定義規則作爲默認策略;//使用這種方式相對於a方案的好處是不須要針對本機訪問再作額外定義

    

    練習:基於狀態放行telnet, ftp, ssh, http, samba, icmp等服務;

    (1) 對本機的ping請求每分鐘不得超出20個;

    (2) 每客戶端對本機的ssh的併發鏈接數不得超過3個;

    (3) 本機的telnet服務僅容許工做時間內訪問;

# Generated by iptables-save v1.4.7 on Thu Oct 20 09:32:28 2016
*filter
:INPUT ACCEPT [28:2389]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -m limit --limit 3/hour --limit-burst 1 -j DROP 
-A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri  --datestop 2038-01-19T11:14:07 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p tcp -m state --state NEW,ESTABLISHED -m multiport --dports 22,80,21,3306,139,445 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 3 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 3 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT //這一條能夠放到最前面,能夠去掉上邊規則中的ESTABLISEHD狀態,加快匹配規則
-A INPUT -d 10.1.68.9/32 -j DROP 
-A OUTPUT -s 10.1.68.9/32 -p tcp -m tcp --dport 80 -j ACCEPT 
-A OUTPUT -s 10.1.68.9/32 -p tcp -m tcp --dport 2049 -j ACCEPT 
-A OUTPUT -s 10.1.68.9/32 -p tcp -m tcp --dport 22 -j ACCEPT 
-A OUTPUT -s 10.1.68.9/32 -p icmp -j ACCEPT 
-A OUTPUT -s 10.1.68.9/32 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -s 10.1.68.9/32 -j DROP 
COMMIT
# Completed on Thu Oct 20 09:32:28 2016


對OUTPUT作必定調整後:

*filter
:INPUT ACCEPT [87:7149]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -m limit --limit 3/hour --limit-burst 1 -j DROP 
-A INPUT -d 10.1.68.9/32 -p tcp -m tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays Mon,Tue,Wed,Thu,Fri  --datestop 2038-01-19T11:14:07 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p tcp -m state --state NEW,ESTABLISHED -m multiport --dports 22,80,21,3306,139,445 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 3 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p icmp -m icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 3 -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -d 10.1.68.9/32 -j DROP 
-A OUTPUT -s 10.1.68.9/32 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A OUTPUT -s 10.1.68.9/32 -j DROP 
COMMIT
# Completed on Thu Oct 20 22:44:31 2016
相關文章
相關標籤/搜索