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)象如下
可以看到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報文的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