舉例實現iptables多端口匹配、連接追蹤、字符串匹配、時間匹配、并發連接限制、速率匹配、報文狀態匹配等應用

一、基本匹配條件:

基本匹配條件:內建
    基本匹配條件:無需加載任何模塊,由iptables/netfilter自行提供;
  • [!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或范圍,加!是取反;
[root@bogon ~]# iptables -t filter -A INPUT -s 192.168.0.0/16 -d 192.168.1.11 -p tcp -j ACCEPT#允許來自192.168的原地址訪問本機tcp服務
[root@bogon ~]# iptables -A OUTPUT -s192.168.1.11 -d  192.168.0.0/16  -p tcp -j ACCEPT#允許本機來訪問192.168的目的地址的主機tcp服務
  • [!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或范圍,加!是取反;
    所有地址:0.0.0.0/0
  • [!] -p, --protocol protocol:指定協議
    protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or "all"
    {tcp|udp|icmp}
[root@bogon ~]# iptables -A INPUT -d 192.168.1.11 -p icmp -j ACCEPT #允許icmp協議ping進來
[root@bogon ~]# iptables -A OUTPUT -s 192.168.1.11 -p icmp -j ACCEPT#允許icmp協議有ping返回值
  • [!] -i, --in-interface name:數據報文流入的接口;只能應用于數據報文流入的環節,只能應用于PREROUTING,INPUT和FORWARD鏈;
  • [!] -o, --out-interface name:數據報文流出的接口;只能應用于數據報文流出的環節,只能應用于FORWARD、OUTPUT和POSTROUTING鏈;
    處理動作:-j targetname [per-target-options]
    ACCEPT
    DROP
    REJECT

二、匹配條件中的擴展匹配條件:

  • 隱式擴展:在使用-p選項指明了特定的協議時,無需再同時使用-m選項指明擴展模塊的擴展機制;
  • 顯式擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制;

1、隱式擴展

  • 隱式擴展:不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使用-p指明了協議,就表示已經指明了要擴展的模塊;
tcp協議:
  • [!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍;
[root@bogon ~]# iptables -I INPUT -s 192.168.1.0/16 -d 192.168.1.11 -p tcp --dport 22 -j ACCEPT #指定原地址范圍可以訪問本機的22號端口
[root@bogon ~]# iptables -I OUTPUT -s 192.168.1.11 -d 192.168.1.0/16 -p tcp --sport 22 -j ACCEPT#
[root@bogon ~]# iptables -A INPUT -d 192.168.1.11 -j -REJECT#如果不能被上面兩條匹配,主機拒絕任何訪問
[root@bogon ~]# iptables -A OUTPUT -s 192.168.1.11 -j -REJECT
[root@bogon ~]# iptables -P INPUT ACCEPT
[root@bogon ~]# iptables -P OUTPUT ACCEPT
  • [!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍;
  • [!] --tcp-flags mask comp
    mask is the flags which we should examine, written as a comma-separated list,
    例如 SYN,ACK,FIN,RST
    comp is a comma-separated list of flags which must be set,
    例如SYN
    例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要檢查的標志位為SYN,ACK,FIN,RST四個,其中SYN必須為1,余下的必須為0;
    [!] --syn:用于匹配第一次握手,相當于”--tcp-flags SYN,ACK,FIN,RST SYN“;
udp協議
  • [!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍;
  • [!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍;
[root@bogon ~]# iptables -I INPUT -d 192.168.1.11 -p udp --dport 137:138 -j ACCEPT #開放可以訪問本機udp的137到138端口
[root@bogon ~]# iptables -I OUTPUT -s 192.168.1.11 -p udp --sport 137:138 -j ACCEPT #本機udp的137到138端口可出站
icmp協議:
  • [!] --icmp-type {type[/code]|typename}
    echo-request:8 #ping出去,回顯請求
    echo-reply:0 #ping響應
設置本機可以ping其他主機,其他主機不能ping本機             
[root@bogon ~]# iptables -A INPUT -i eth0  -j REJECT#設置網卡,規則之外都拒絕
[root@bogon ~]# iptables -A OUTPUT -i eth0  -j REJECT
[root@bogon ~]# iptables -I OUTPUT -s 192.168.1.1 -p icmp --icmp-type 8 -j ACCEPT#設置出站ping報文
[root@bogon ~]# iptables -I INPUT 2 -d 192.168.1.1 -p icmp --icmp-type 0/0 -j ACCEPT#設置入站ping響應報文
如果允許其他主機ping則進站為8,出站為0。

2、顯式擴展

  • 顯式擴展:必須要手動加載擴展模塊, [-m matchname [per-match-options]];
  • 顯式擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制;

(1)、multiport多端口匹配

以離散或連續的 方式定義多端口匹配條件,最多15個,支持協議tcp, udp, udplite, dccp and sctp;

  • [!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;
  • [!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
[root@bogon ~]#  iptables -R INPUT  -d 192.168.1.11 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT#修改入站打開多端口
[root@bogon ~]#  iptables -R OUTPUT  -s 192.168.1.11 -p tcp -m multiport --sports 22,80,139,445,3306 -j ACCEPT#修改出站打開多端口

(2)、iprange連接追蹤匹配

以連續地址塊的方式來指明多IP地址匹配條件;

  • [!] --src-range from[-to]
  • [!] --dst-range from[-to]
[root@bogon ~]# iptables -I INPUT 3 -d 192.168.1.11 -p tcp --dports 23 -m iprange --src-range 192.168.1.60-192.168.1.70 -j REJECT#設置一個連續的地址范圍內可以訪問本機23端口
[root@bogon ~]# iptables -I OUTPUT 3 -s 192.168.1.11 -p tcp --sports 23 -m iprange --src-range 192.168.1.60-192.168.1.70 -j REJECT

(3)、time擴展:基于時間區間做訪問控制

--timestart hh:mm[:ss]
--timestop hh:mm[:ss]

  • [!] --weekdays day[,day...]
  • [!] --monthdays day[,day...]
    --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
    --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--kerneltz:使用內核配置的時區而非默認的UTC;

[root@bogon ~]# iptables -I OUTPUT 4 -s 192.168.1.11 -p udp --dports 123,323  -j REJECT#開啟出站123,323端口
[root@bogon ~]# iptables -I INPUT 4 -d 192.168.1.11 -p udp --sports 123,323  -j REJECT#開啟入站123,323端
[root@bogon ~]# iptables -R INPUT 4 -d 192.168.1.11 -p tcp  --dport 23 -m iprange --src-reange 192.168.1.60-192.16.1.70 -m time --timestart 10:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT#設定時間為每周1-5的10點到16點允許60-70的ip地址主機入站訪問23端口
[root@bogon ~]# iptables -R OUTPUT 4 -s 192.168.1.11 -p tcp  --sport 23 -m iprange --dsp-reange 192.168.1.60-192.16.1.70 -m time --timestart 10:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT#設定時間為每周1-5的10點到16點允許60-70的ip地址主機訪問23端口出站響應
注意:centos6不用指明--kerneltz

(4)、string字符串匹配(只能對明文編碼匹配)

   --algo {bm|kmp}

[!] --string pattern
[!] --hex-string pattern
--from offset
--to offset

[root@bogon ~]# iptables -I OUTPUT -s 192.168.1.11 -m string --algo kmp --string "holle" -j REJECT#出站報文出現holle字符串,則不能發送

(5)、connlimit 單個客戶端最多并發數量匹配

--connlimit-upto n     #小于n允許
--connlimit-above n   #大于n拒絕
[root@bogon ~]# iptables -I INPUT -s 192.168.10/16 -d 192.168.1.11 -p tcp --dport 3306 -j ACCEPT#開放入站訪問3306端口
[root@bogon ~]# iptables -I OUTPUT -d 192.168.10/16 -s 192.168.1.11 -p tcp --sport 3306 -j ACCEPT#開放訪問3306端口出站響應                
[root@bogon ~]# iptables -R INPUT -s 192.168.10/16 -d 192.168.1.11 -p tcp --dport 3306  -m connlimit --connlimit-upto 2 -j ACCEPT#開放入站訪問3306端口,每個ip只能連接2次
                    

(6)、limit 基于限制發包速率做限制

專用選項:利用令牌桶算法
--limit rate[/second|/minute|/hour|/day] 單位時間的速率
--limit-burst number 最大收集多少令牌

[root@bogon ~]# iptables -I INPUT 6 -d 192.168.1.11 -p icmp --icmp-type 8 -m liit-burst 5 --limit 20/minute -j ACCEPT#入站限制5個令牌,每分鐘20個發包速率
[root@bogon ~]# iptables -I OUTPUT 6 -s 192.168.1.11 -p icmp --icmp-type 0 -j ACCEPT#出站不限制速率

限制本機某tcp服務接收新請求的速率:--syn, -m limit

三、state擴展:追蹤報文

啟用連接追蹤模板記錄連接,并根據連接匹配連接狀態的擴展;

  • [!] --state state 指明那些狀態
    INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.

NEW: 新連接請求;
ESTABLISHED:已建立的連接;
INVALID:無法識別的連接;
RELATED:相關聯的連接,當前連接是一個新請求,但附屬于某個已存在的連接;
UNTRACKED:未追蹤的連接;

1.state擴展:

內核模塊裝載:
nf_conntrack
nf_conntrack_ipv4

追蹤到的連接:/proc/net/nf_conntrack
調整可記錄的連接數量最大值:/proc/sys/net/nf_conntrack_max
超時時長:/proc/sys/net/netfilter/timeout

[root@bogon ~]# iptables -F #清空規則
[root@bogon ~]# iptables -A INPUT -d 192.168.1.11 -p tcp -m multiport ---dports 22:23,80,139,445,3306 -m state --state NEW -j ACCEPT#新建tcp連接放行入站訪問22,23,80,139,445,3306端口
[root@bogon ~]# iptables -I INPUT 2 -d 192.168.1.11 -p udp --dport  137:138 -m state --state NEW -j ACCEPT#新建udp連接放行入站訪問137,138端口
[root@bogon ~]# iptables -I OUTPUT 2 -s 192.168.1.11 -p udp -m --multiport ---dport  123,323 -m state --state NEW -j ACCEPT#允許123,323出站響應
[root@bogon ~]# iptables -I INPUT -d 192.168.1.11 -m state --state ESTABLISHED -j ACCEPT#允許已建立的入站連接訪問所有端口
[root@bogon ~]# iptables -I   OUTPUT -s 192.168.1.11 -m state --state ESTABLISHED -j ACCEPT#允許已建立的出站連接訪問所有端口響應
[root@bogon ~]# iptables -A  INPUT -d192.168.1.11 -j REJECT#默認入站規則為拒絕
[root@bogon ~]# iptables -A  INPUT -s192.168.1.11 -j REJECT#默認出站為拒絕
[root@bogon ~]# iptables -vnL  #查詢規則
測試連接

RELATED狀態的追蹤:
需要手動裝載狀態的追蹤模塊:nf_conntrack_ftp

[root@bogon ~]#modprobe  nf_conntrack_ftp #手動裝載狀態的追蹤模塊
[root@bogon ~]#lsmod  #查詢模塊
[root@bogon ~]# iptables -R INPUT 3 -d 192.168.1.11 -p tcp -m multiport --dports 21:23,80,139,445,3306 -m state --state NEW -j ACCEPT#修改第三條tcp連接放行入站訪問
[root@bogon ~]# iptables -R INPUT 1 -d 192.168.1.11 -m state --state ESTABLISHED,RELATED -j ACCEPT#修改第一條允許已建立的入站連接訪問所有端口

2.處理動作(跳轉目標):

-j targetname [per-target-options]

  • 簡單target:
    ACCEPT, DROP

  • 擴展target:
    REJECT
    --reject-with type:拒絕類型

  • LOG日志
    --log-level
    --log-prefix

[root@bogon ~]# iptables -I INPUT 3 -d 192.168.1.11 -p tcp  --dport 23 -m state --state NEW -j LOG --log-prefix"access telnet"#保存入站的23端口訪問日志前綴為access telnet                    
                默認日志保存于/var/log/messages

3.自定義鏈做為target(處理動作):

[root@bogon ~]# iptables -N in_ping_rules#自定義一個ping處理動作
[root@bogon ~]# iptables -A in_ping_rules -d 192.168.1.11 -p icmp --icmp-type8 -j ACCEPT #設定本機可以ping其他主機
[root@bogon ~]# iptables -I in_ping_rules -d 192.168.1.11  -s 192.168.1.12  -p icmp  -j REJECT #禁止68主機ping本機

#加入INPUT表里才能生效
[root@bogon ~]# iptables -I INPUT 5 -d 192.168.1.11 -p icmp -j in_ping_rules#在INPUT表中第五行加入引用自定義處理動作
  • 一個主鏈可以調用多個自定義鏈,要想刪除自定義鏈,必須先清空自定義鏈
[root@bogon ~]# iptables -F  in_ping_rules#清空規則
[root@bogon ~]# iptables -vnL#查詢
[root@bogon ~]# iptables -X  in_ping_rules#刪除

RETURN:返回調用者;

四、保存和載入規則:

  • 保存:iptables-save > /PATH/TO/SOME_RULE_FILE
  • 重載:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
    -n, --noflush:不清除原有規則
    -t, --test:僅分析生成規則集,但不提交
  • CentOS 6:
    • 保存規則:

service iptables save
保存規則于/etc/sysconfig/iptables文件,覆蓋保存;
重載規則:
service iptables restart
默認重載/etc/sysconfig/iptables文件中的規則
配置文件:/etc/sysconfig/iptables-config

  • CentOS 7:

(1) 自定義Unit File,進行iptables-restore;
(2) firewalld服務;
(3) 自定義腳本;

五、規則優化的思路:

使用自定義鏈管理特定應用的相關規則,模塊化管理規則;

(1) 優先放行雙方向狀態為ESTABLISHED的報文;
(2) 服務于不同類別的功能的規則,匹配到報文可能性更大的放前面;
(3) 服務于同一類別的功能的規則,匹配條件較嚴格的放在前面;
(4) 設置默認策略:白名單機制
(a) iptables -P,不建議;
(b) 建議在規則的最后定義規則做為默認策略;

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容