(3)iptables匹配條件總結(jié)

1.配置多源ip或者網(wǎng)段限制

# 丟棄掉來自192.168.1.111,192.168.1.112的所有報文
iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.112 -j DROP

# DROP掉某個網(wǎng)段的報文
iptables -t filter -I INPUT -s 10.6.0.0/16 -j DROP

# 對來源地址取反棺蛛,只要發(fā)往本機的報文的源地址不是192.168.1.146,就接受報文
iptables -t filter -I INPUT ! -s 192.168.1.146 -j DROP

2.配置對目標ip的限制

是用-d 參數(shù)對目的地址進行限制衅枫。注意峭弟,如果是對源和目標地址都有限制,需要同時滿足才會執(zhí)行對應規(guī)則屯断。

# 禁止報文從192.168.1.146發(fā)到192.168.1.156
iptables -t filter INPUT -s 192.168.1.146 -d 192.168.1.156 -j DROP

# 禁止報文發(fā)到192.168.1.156的所有報文
iptables -t filter INPUT -d 192.168.1.156 -j DROP

3.協(xié)議類型匹配

使用 -p 參數(shù)對報文協(xié)議進行匹配文虏,協(xié)議內(nèi)容包含: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh。

# REJECT掉發(fā)往192.168.1.156的tcp協(xié)議報文
iptables -t filter -I INPUT -d 192.168.1.156 -p tcp -j REJECT

4.匹配網(wǎng)卡

使用-i對車機報文通過某一網(wǎng)卡流入進行限制殖演,使用-o 對車機報文通過某一網(wǎng)卡流出進行限制氧秘。

-i選項只能用于PREROUTING鏈、INPUT鏈趴久、FORWARD鏈丸相,那么-o選項只能用于FORWARD鏈、OUTPUT鏈彼棍、POSTROUTING鏈

# DROP掉經(jīng)過wlan0口的ping報文
iptables -t filter -I INPUT -i wlan0 -p icmp -j DROP

5.限制端口

5.1 限制目標端口

使用 --dport限制目標端口灭忠。在使用--dport選項時膳算,必須事先指定了使用哪種協(xié)議,即必須先使用-p選項弛作。

使用-–dport之前涕蜂,我們使用-m選項,指定了對應的擴展模塊為tcp映琳,也就是說机隙,如果想要使用-–dport這個擴展匹配條件,則必須依靠某個擴展模塊完成萨西。

# REJECT 外來報文的目標端口為本機的22號端口(ssh默認端口)
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22 -j REJECT

#  -m tcp表示使用tcp擴展模塊有鹿,–dport表示tcp擴展模塊中的一個擴展匹配條件,可用于匹配報文的目標端口谎脯。
#  注意印颤,-p tcp與 -m tcp并不沖突,-p用于匹配報文的協(xié)議穿肄,-m 用于指定擴展模塊的名稱年局,正好,這個擴展模塊也叫tcp咸产。
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp --dport 22 -j REJECT
5.2 限制源端口

使用--sport可以判斷報文是否從指定的端口發(fā)出矢否,即匹配報文的源端口是否與指定的端口一致

iptables -t filter -I INPUT -s 192.168.1.146 -p tcp --sport 22 -j REJECT
5.3 限制端口范圍
# REJECT目標端口為22到25之間的所有端口
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp --dport 22:25 -j REJECT

# 表示匹配0號到22號之間的所有端口
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp --dport :22 -j REJECT

# 表示匹配80號端口以及其以后的所有端口(直到65535)
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp --dport :22 -j REJECT

# 管理多個離散的源端口
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dport 22,36,88 -j REJECT

6. iprange擴展模塊

-s選項與-d選項并不能一次性的指定一段連續(xù)的IP地址范圍,如果我們需要指定一段連續(xù)的IP地址范圍脑溢,可以使用iprange擴展模塊僵朗。

iprange擴展模塊中有兩個擴展匹配條件可以使用: --src-range 和 --dst-range

# 如果報文的源IP地址如果在192.168.1.127到192.168.1.146之間,則丟棄報文
iptables -t filter -I INPUT -m iprange --src-rang 192.168.1.127-192.168.1.146 -j DROP

7.String擴展模塊

使用string擴展模塊屑彻,可以指定要匹配的字符串验庙,如果報文中包含對應的字符串,則符合匹配條件社牲。

iptables -t filter -I INPUT -m string --algo bm --string "xxxx" -j REJECT

-m string表示使用string模塊粪薛,--algo bm表示使用bm算法去匹配指定的字符串,--string "xxxx"則表示我們想要匹配的字符串為”xxxx”.

  • --algo:用于指定匹配算法搏恤,可選的算法有bm與kmp违寿,此選項為必須選項,我們不用糾結(jié)于選擇哪個算法熟空,但是我們必須指定一個藤巢。
  • --string:用于指定需要匹配的字符串。

8.time擴展模塊

可以通過time擴展模塊息罗,根據(jù)時間段區(qū)匹配報文掂咒,如果報文到達的時間在指定的時間范圍以內(nèi),則符合匹配條件。

8.1 約束在晚上12點-早上7點不能上網(wǎng)绍刮,保證充足睡眠糜工。

# 限制http端口
iptables -t filter -I INPUT -p tcp --dport 80 -m time --timestart 00:00:00 --timestop 07:00:00 -j REJECT
# 限制https端口
iptables -t filter -I INPUT -p tcp --dport 443 -m time --timestart 00:00:00 --timestop 07:00:00 -j REJECT

8.2 約束周末不能上網(wǎng)

--weekdays可以取反

iptables -t filter -I INPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT
iptables -t filter -I INPUT -p tcp --dport 443 -m time --weekdays 6,7 -j REJECT

8.3 約束每月某些天不能上網(wǎng)

--monthdays 可以取反

iptables -t filter -I INPUT -p tcp --dport 80 -m time --monthdays 10,11 -j REJECT
iptables -t filter -I INPUT -p tcp --dport 443 -m time --monthdays 10,11 -j REJECT

8.4 限制時間段

iptables -t filter -I INPUT -p tcp --dport 80 -m time --datestart 2021-05-24 --datestop 2021-05-30 -j REJECT
iptables -t filter -I INPUT -p tcp --dport 443 -m time --datestart 2021-05-24 --datestop 2021-05-30 -j REJECT

9.connlimit擴展模塊

使用connlimit擴展模塊,可以限制每個IP地址同時鏈接到server端的鏈接數(shù)量录淡,注意:我們不用指定IP捌木,其默認就是針對”每個客戶端IP”,即對單IP的并發(fā)連接數(shù)限制嫉戚。

9.1 限制每個IP地址最多只能占用兩個ssh鏈接遠程到server端

使用–connlimit-above 2表示限制每個IP的鏈接數(shù)量上限為2刨裆,再配合-p tcp, –dport 22,即表示限制每個客戶端IP的ssh并發(fā)鏈接數(shù)量不能高于2彬檀。

iptables -t filter -I INPUT -p tcp --dport 22 -m connlimt --connlimit-above 2 -j ACCEPT

9.2 限制某個網(wǎng)段帆啃,最多多少個鏈接

使用--connlimit-mask限制某個網(wǎng)段,–connlimit-mask 27表示某個C類網(wǎng)段窍帝,這個網(wǎng)段中最多只能有30臺機器(30個IP)努潘,這30個IP地址最多只能有10個ssh連接同時連接到服務器端。

iptables -t filter -I INPUT -p tcp --dport 22 -m connlimt --connlimit-above 10 --connlimit-mask 27 -j ACCEPT

mask是子網(wǎng)掩碼的意思坤学,通過子網(wǎng)掩碼來限制ip段疯坤。

10.limit擴展模塊

使用limit模塊是對”報文到達速率”進行限制,可以以秒為單位進行限制深浮,也可以以分鐘压怠、小時、天作為單位進行限制飞苇。

10.1 限制菌瘫,外部主機對本機進行ping操作時,本機最多每6秒中放行一個ping布卡。

iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT

如果單是以上規(guī)則雨让,是無法限制每6秒到來的報文的。因為當1-5秒到來的報文忿等,會走默認規(guī)則栖忠,默認是ACCEPT。

因此这弧,還需要添加默認的匹配規(guī)則娃闲。

iptables -t filter -I INPUT -p icmp -j REJECT

需要注意的是虚汛,需要先配置接受規(guī)則匾浪,再配置拒絕規(guī)則。

如上配置之后卷哩,我們看看現(xiàn)象如下

令牌桶算法.PNG

可以看到1-5的報文沒有被過濾到蛋辈,后面的報文每6秒接受到一次,以滿足攔截需求的。

出現(xiàn)這個現(xiàn)象的原因是:limit模塊使用了令牌桶算法冷溶。

令牌桶算法:我們可以這樣想象渐白,有一個木桶,木桶里面放了5塊令牌逞频,而且這個木桶最多也只能放下5塊令牌纯衍,所有報文如果想要出關(guān)入關(guān),都必須要持有木桶中的令牌才行苗胀,這個木桶有一個神奇的功能襟诸,就是每隔6秒鐘會生成一塊新的令牌,如果此時基协,木桶中的令牌不足5塊歌亲,那么新生成的令牌就存放在木桶中,如果木桶中已經(jīng)存在5塊令牌澜驮,新生成的令牌就無處安放了陷揪,只能溢出木桶(令牌被丟棄),如果此時有5個報文想要入關(guān)杂穷,那么這5個報文就去木桶里找令牌悍缠,正好一人一個,于是他們5個手持令牌耐量,快樂的入關(guān)了扮休,此時木桶空了,再有報文想要入關(guān)拴鸵,已經(jīng)沒有對應的令牌可以使用了玷坠,但是,過了6秒鐘劲藐,新的令牌生成了八堡,此刻,正好來了一個報文想要入關(guān)聘芜,于是兄渺,這個報文拿起這個令牌,就入關(guān)了汰现,在這個報文之后挂谍,如果很長一段時間內(nèi)沒有新的報文想要入關(guān),木桶中的令牌又會慢慢的積攢了起來瞎饲,直到達到5個令牌口叙,并且一直保持著5個令牌,直到有人需要使用這些令牌嗅战,這就是令牌桶算法的大致邏輯妄田。

因此俺亮,我們可以–limit-burst來限制桶的令牌數(shù)目。

iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT

11.匹配TCP報文頭標志位

可以使用--tcp-flags 匹配報文tcp頭部的標志位疟呐。

# 匹配第一次握手
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT

”SYN,ACK,FIN,RST,URG,PSH SYN”, 這串字符就是用于配置我們要匹配的標志位的脚曾,我們可以把這串字符拆成兩部分去理解,第一部分為”SYN,ACK,FIN,RST,URG,PSH”启具,第二部分為”SYN”本讥。

第一部分表示:我們需要匹配報文tcp頭中的哪些標志位,那么上例的配置表示鲁冯,我們需要匹配報文tcp頭中的6個標志位囤踩,這6個標志位分別為為”SYN、ACK晓褪、FIN堵漱、RST、URG涣仿、PSH”勤庐,我們可以把這一部分理解成需要匹配的標志位列表。

第二部分表示:第一部分的標志位列表中好港,哪些標志位必須為1愉镰,上例中,第二部分為SYN钧汹,則表示丈探,第一部分需要匹配的標志位列表中,SYN標志位的值必須為1拔莱,其他標志位必須為0碗降。

所以,上例中的”SYN,ACK,FIN,RST,URG,PSH SYN”表示塘秦,需要匹配報文tcp頭中的”SYN讼渊、ACK、FIN尊剔、RST爪幻、URG、PSH”這些標志位须误,其中SYN標志位必須為1挨稿,其他的5個標志位必須為0 .

# 匹配第二次握手
iptables -t filter -I INPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT

以上兩條可以簡寫為:

iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT
iptables -t filter -I INPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT

12.icmp擴展

我們平常使用ping命令ping某主機時,如果主機可達京痢,對應主機會對我們的ping請求做出回應(此處不考慮禁ping等情況)奶甘,也就是說,我們發(fā)出ping請求历造,對方回應ping請求甩十,雖然ping請求報文與ping回應報文都屬于ICMP類型的報文船庇,但是如果在概念上細分的話吭产,它們所屬的類型還是不同的侣监,我們發(fā)出的ping請求屬于類型8的icmp報文,而對方主機的ping回應報文則屬于類型0的icmp報文臣淤,根據(jù)應用場景的不同橄霉,icmp報文被細分為如下各種類型。

icmp協(xié)議.png

從上圖可以看出邑蒋,所有表示”目標不可達”的icmp報文的type碼為3姓蜂,而”目標不可達”又可以細分為多種情況,是網(wǎng)絡不可達呢医吊?還是主機不可達呢钱慢?再或者是端口不可達呢?所以卿堂,為了更加細化的區(qū)分它們束莫,icmp對每種type又細分了對應的code,用不同的code對應具體的場景草描, 所以览绿,我們可以使用type/code去匹配具體類型的ICMP報文,比如可以使用”3/1″表示主機不可達的icmp報文穗慕。

上圖中的第一行就表示ping回應報文饿敲,它的type為0,code也為0逛绵,從上圖可以看出怀各,ping回應報文屬于查詢類(query)的ICMP報文,從大類上分术浪,ICMP報文還能分為查詢類與錯誤類兩大類渠啤,目標不可達類的icmp報文則屬于錯誤類報文。

而我們發(fā)出的ping請求報文對應的type為8添吗,code為0沥曹。

12.1 此時我們只想要ping通別人,但是不想讓別人ping通我們

iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8 -j REJECT
// echo-request是協(xié)議名碟联,中間空格用‘-’代替
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type "echo-request" -j REJECT

使用”-m icmp”表示使用icmp擴展妓美,因為上例中使用了”-p icmp”,所以”-m icmp”可以省略鲤孵,使用”–icmp-type”選項表示根據(jù)具體的type與code去匹配對應的icmp報文壶栋,而上圖中的”–icmp-type 8/0″表示icmp報文的type為8,code為0才會被匹配到普监,也就是只有ping請求類型的報文才能被匹配到贵试,所以琉兜,別人對我們發(fā)起的ping請求將會被拒絕通過防火墻,而我們之所以能夠ping通別人毙玻,是因為別人回應我們的報文的icmp type為0豌蟋,code也為0,所以無法被上述規(guī)則匹配到桑滩,所以我們可以看到別人回應我們的信息梧疲。

13.判斷報文是來自回應還是請求

我們可以使用state模塊的--state來追蹤鏈接的狀態(tài)。

對于state模塊的連接而言运准,”連接”其中的報文可以分為5種狀態(tài)幌氮,報文狀態(tài)可以為NEW、ESTABLISHED胁澳、RELATED该互、INVALID、UNTRACKED韭畸。(詳細定義參考文檔)

  • NEW:連接中的第一個包宇智,狀態(tài)就是NEW,我們可以理解為新連接的第一個包的狀態(tài)為NEW陆盘。

  • ESTABLISHED:我們可以把NEW狀態(tài)包后面的包的狀態(tài)理解為ESTABLISHED普筹,表示連接已建立。

  • RELATED:從字面上理解RELATED譯為關(guān)系隘马,但是這樣仍然不容易理解太防,我們舉個例子。

比如FTP服務酸员,F(xiàn)TP服務端會建立兩個進程蜒车,一個命令進程,一個數(shù)據(jù)進程幔嗦。

命令進程負責服務端與客戶端之間的命令傳輸(我們可以把這個傳輸過程理解成state中所謂的一個”連接”酿愧,暫稱為”命令連接”)。

數(shù)據(jù)進程負責服務端與客戶端之間的數(shù)據(jù)傳輸 ( 我們把這個過程暫稱為”數(shù)據(jù)連接” )邀泉。

但是具體傳輸哪些數(shù)據(jù)嬉挡,是由命令去控制的,所以汇恤,”數(shù)據(jù)連接”中的報文與”命令連接”是有”關(guān)系”的庞钢。

那么,”數(shù)據(jù)連接”中的報文可能就是RELATED狀態(tài)因谎,因為這些報文與”命令連接”中的報文有關(guān)系基括。

(注:如果想要對ftp進行連接追蹤,需要單獨加載對應的內(nèi)核模塊nf_conntrack_ftp财岔,如果想要自動加載风皿,可以配置/etc/sysconfig/iptables-config文件)

  • INVALID:如果一個包沒有辦法被識別河爹,或者這個包沒有任何狀態(tài),那么這個包的狀態(tài)就是INVALID桐款,我們可以主動屏蔽狀態(tài)為INVALID的報文咸这。

  • UNTRACKED:報文的狀態(tài)為untracked時,表示報文未被追蹤鲁僚,當報文的狀態(tài)為Untracked時通常表示無法找到相關(guān)的連接炊苫。

iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -j REJECT

參考文檔

User-land states定義

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末裁厅,一起剝皮案震驚了整個濱河市冰沙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌执虹,老刑警劉巖拓挥,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異袋励,居然都是意外死亡侥啤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門茬故,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盖灸,“玉大人,你說我怎么就攤上這事磺芭×扪祝” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵钾腺,是天一觀的道長徙垫。 經(jīng)常有香客問我,道長放棒,這世上最難降的妖魔是什么姻报? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮间螟,結(jié)果婚禮上吴旋,老公的妹妹穿的比我還像新娘。我一直安慰自己厢破,他們只是感情好荣瑟,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著溉奕,像睡著了一般褂傀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上加勤,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天仙辟,我揣著相機與錄音同波,去河邊找鬼。 笑死叠国,一個胖子當著我的面吹牛未檩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粟焊,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼冤狡,長吁一口氣:“原來是場噩夢啊……” “哼逻卖!你這毒婦竟也來了泵喘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤缀程,失蹤者是張志新(化名)和其女友劉穎香追,沒想到半個月后合瓢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡透典,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年晴楔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峭咒。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡税弃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凑队,到底是詐尸還是另有隱情则果,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布顽决,位于F島的核電站短条,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏才菠。R本人自食惡果不足惜茸时,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赋访。 院中可真熱鬧可都,春花似錦、人聲如沸蚓耽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽步悠。三九已至签杈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背答姥。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工铣除, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鹦付。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓尚粘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親敲长。 傳聞我的和親對象是個殘疾皇子郎嫁,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容