在iptables(一)中已經(jīng)介紹了 iptables 的表凛膏、鏈的概念和關(guān)系朽基,以及表的基本操作定罢。
本次 iptables(二)中將介紹iptables 的匹配方式和常用的擴(kuò)展模塊芍殖。
一掷伙、基本匹配
基本匹配條件:原地址 Source IP 和 目標(biāo)地址 Destination IP
1. 使用-s
參數(shù)時(shí)批量添加 ip
示例:
root@kvm:~# iptables -t filter -I INPUT -s 10.1.1.2,10.1.1.3 -j DROP
root@kvm:~# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 29 packets, 2202 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP all -- * * 10.1.1.3 0.0.0.0/0
0 0 DROP all -- * * 10.1.1.2 0.0.0.0/0
5 420 DROP all -- * * 192.168.55.132 0.0.0.0/0
-s
添加多個 IP 時(shí)中間使用逗號","分割即可
2. 使用-s
參數(shù)添加網(wǎng)段
示例:
root@kvm:~# iptables -t filter -I INPUT -s 10.1.2.0/10 -j ACCEPT
root@kvm:~# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 9 packets, 636 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 10.0.0.0/10 0.0.0.0/0
0 0 DROP all -- * * 10.1.1.3 0.0.0.0/0
0 0 DROP all -- * * 10.1.1.2 0.0.0.0/0
5 420 DROP all -- * * 192.168.55.132 0.0.0.0/0
3. 使用-s
時(shí)可以對條件取反嘿期,在-s
前添加嘆號"!"即可
示例:
root@kvm:~# iptables -t filter -I INPUT ! -s 10.1.1.2 -j ACCEPT
root@kvm:~# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
13 932 ACCEPT all -- * * !10.1.1.2 0.0.0.0/0
- 規(guī)則解釋:
規(guī)則的意思只要報(bào)文原地址不是10.1.1.2都接受疚膊。
現(xiàn)在使用10.1.1.2去 ping iptables測試機(jī)發(fā)現(xiàn)是可以 ping 通的忽舟。
因?yàn)闆]有規(guī)則說明當(dāng) ip 地址是10.1.1.2的時(shí)候去做什么動作随闺,所以當(dāng)10.1.1.2通過 INPUT 鏈時(shí)日川,是找不到相應(yīng)規(guī)則的,它執(zhí)行的是filter 表 INPUT 鏈默認(rèn)ACCEPT規(guī)則矩乐。
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
也就是說當(dāng)你的filter 表 INPUT 鏈默認(rèn)是 DROP 時(shí)龄句,10.1.1.2的機(jī)器將不能 ping 通本機(jī)。
- 錯誤理解:
只要報(bào)文原地址是10.1.1.2就不接受散罕。這樣理解是不對的
4. 使用-d
參數(shù)定制目標(biāo) IP 地址規(guī)則
示例:
iptables 測試機(jī) ip 信息
root@kvm:~# ifconfig | awk '/inet addr/{print $1,$2}'
inet addr:192.168.55.128
inet addr:192.168.55.129
inet addr:192.168.55.130
inet addr:127.0.0.1
inet addr:10.0.80.1
添加禁止192.168.55.132地址到192.168.55.128地址的數(shù)據(jù)請求
root@kvm:~# iptables -t filter -I INPUT -s 192.168.55.132 -d 192.168.55.128 -j DROP
root@kvm:~# iptables -vnL INPUT
Chain INPUT (policy ACCEPT 82 packets, 6368 bytes)
pkts bytes target prot opt in out source destination
2 168 DROP all -- * * 192.168.55.132 192.168.55.128
-s
與-d
是與的關(guān)系分歇,如下例:
只有從192.168.55.132地址到192.168.55.128地址的數(shù)據(jù)才被接受
root@kvm:~# iptables -t filter -I INPUT -s 192.168.55.132 -d 192.168.55.128 -j ACCEPT
5. 使用-p
參數(shù)定制協(xié)議類型規(guī)則
示例:
添加禁止192.168.55.132地址到192.168.55.128地址 tcp 數(shù)據(jù)請求
root@kvm:~# iptables -t filter -I INPUT -s 192.168.55.128 -d 192.168.55.129 -p tcp -j REJECT
root@kvm:~# iptables -vnL INPUT
Chain INPUT (policy ACCEPT 7 packets, 488 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 192.168.55.128 192.168.55.129 reject-with icmp-port-unreachable
6. 使用-i
參數(shù)定制網(wǎng)卡接口規(guī)則
-
-i
只能用于 PREROUTING、 INPUT欧漱、 FORWARD 這三個鏈职抡,因?yàn)橹挥羞@三個鏈可以判斷數(shù)據(jù)從那個網(wǎng)卡流入
iptables -t filter -I INPUT -i eth2 -p icmp -j DROP
-
-o
只能用于 FORWARD、 OUTPUT硫椰、 POSTROUTING這三個鏈繁调,因?yàn)橹挥羞@三個鏈可以判斷數(shù)據(jù)從那個網(wǎng)卡流出
iptables -t filter -I INPUT -o eth2 -p icmp -j DROP
二、 擴(kuò)展匹配
擴(kuò)展條件是netfilter 中的一部分靶草,只是以模塊的形式存在蹄胰,要使用這個,則需要指定依賴模塊奕翔。
iptables 指定模塊參數(shù):
參數(shù) | 說明 | 示例 |
---|---|---|
--match -m match |
指定擴(kuò)展模塊 | iptables -t filter -I INPUT -s 192.168.55.132 -p tcp -m tcp --dport 22 -j REJECT 示例:禁止這個 ip 使用tcp 22端口訪問裕寨, -m tcp :是加載 tcp 擴(kuò)展模塊; |
1. TCP模塊端口規(guī)則
參數(shù)說明
參數(shù) | 說明 | 示例 |
---|---|---|
--dport |
tcp擴(kuò)展模塊中的-目標(biāo)端口 | --dport 22; --dport 22:50 |
--sport |
擴(kuò)展模塊中的-源端口 | --sport 22宾袜; --sport 22:50 |
--tcp-flags |
匹配TCP報(bào)文頭標(biāo)志位 | --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN |
參數(shù) --tcp-flags
示例:
# iptables -f filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
# iptables -f filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT
--tcp-flags中有兩部分:
- “SYN,ACK,FIN,RST,URG,PSH ”: 需要匹配的標(biāo)志位列表
- “SYN”:在第一部分 “SYN,ACK,FIN,RST,URG,PSH ”中 SYN 值必須是1捻艳,其他標(biāo)志位必須是0
上面兩種寫法是一樣的。
2. multiport模塊
指定一個連續(xù)不到的的端口
參數(shù)說明
參數(shù) | 說明 | 示例 |
---|---|---|
--dports |
同時(shí)定義多個不同的不連續(xù)的源端口 | iptables -t filter -I INPUT -s 10.0.1.2 -p tcp -m multiport --dport 22,36,80 -j DROP |
--sports |
同時(shí)定義多個不同的不連續(xù)(也可以指定連續(xù)的)的目標(biāo)端口 | iptables -t filter -I INPUT -s 10.0.1.2 -p tcp -m multiport --sport 22,80:88 -j DROP 80:88指的是80到88的所有端口 |
3. iprange 模塊
指定一個連續(xù)的IP地址范圍
參數(shù)說明
參數(shù) | 說明 | 示例 |
---|---|---|
--src-range |
指定連續(xù)的原地址范圍 | iptables -t filter -I INPUT -m iprange --src-range 10.1.1.2-10.1.1.10 -j DROP |
--dst-range |
指定連續(xù)的目標(biāo)地址范圍 | iptables -t filter -I INPUT -m iprange --dst-range 10.1.1.2-10.1.1.10 -j DROP |
在--src-range
或--dst-range
這個前面加"!"可以取反
4. stging 模塊
可以指定要匹配的字符串庆猫,如果報(bào)文中包含對應(yīng)的字符串认轨,則復(fù)合匹配條件。
參數(shù)說明:
參數(shù) | 說明 | 示例 |
---|---|---|
--algo bm |
指定對應(yīng)的算法bm 月培、kmp
|
iptables -t filter -I INPUT -m string --algo bm --string "xxx" -j DROP |
--string xxx |
指定要匹配的字符串 | iptables -t filter -I INPUT -m string --algo bm --string "xxx" -j DROP |
5. time模塊
可以根據(jù)時(shí)間段去匹配報(bào)文嘁字,如果報(bào)文到達(dá)的時(shí)間在指定的時(shí)間范圍以內(nèi),則符合匹配條件
參數(shù)說明:
參數(shù) | 說明 | 示例 |
---|---|---|
--timestart time |
開始時(shí)間 | iptables -t filter -I INPUT -m time --timestart 09:00:00 --time stop 10:00:00 -j DROP |
--timestop time |
結(jié)束時(shí)間 | iptables -t filter -I INPUT -m time --timestart 09:00:00 --time stop 10:00:00 -j DROP |
--weekdays week |
指定每周的周幾杉畜,指定多個用逗號分開纪蜒。 | iptables -t filter -I INPUT -p tcp --dport 80 -m time --weekdays 6,7 -j ACCEPT 示例中只允許每周的周6日進(jìn)行 tcp 80端口訪問 |
--monthdays day |
指定每個月的第幾天,指定多天用逗號分開此叠。 | iptables -t filter -I INPUT -p tcp --dport 80 -m time --monthdays 20,25 -j ACCEPT 示例中只允許每月的20日和25日進(jìn)行 tcp 80端口訪問 |
--datestart date |
指定開始日期 | iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2019-01-27 -j REJECT |
--datestop date |
指定結(jié)束日期 | iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2019-12-27 -j REJECT |
-
--weekdays
和--monthdays
聯(lián)合使用
#iptables -t filter -I INPUT -p tcp --doprt 80 -m time --weekdays 5 --monthdays 10,11,12,13,14,15,16 -j DREP
表示只有在周五是10~16號時(shí)拒絕訪問
-
--weekdays
和--monthdays
也可以使用"!"取反纯续。
6. connlimit模塊
可以限制每個IP 地址同時(shí)連接到 server 端的連接數(shù)量。
不指定 IP 則表示灭袁,是針對每個請求 IP進(jìn)行限制
參數(shù)說明:
參數(shù) | 說明 | 示例 |
---|---|---|
--connlimit-above number |
限制IP 的連接數(shù)量上限 | iptables -f filter -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 2 -j REJECT 示例:只允許每個 IP 有兩個 ssh 連接到服務(wù)器 |
--connlimit-mask |
限制某類網(wǎng)段的連接數(shù)量 | iptables -f filter -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT 示例:限制 C 類網(wǎng)段的連接次數(shù)猬错,24轉(zhuǎn)換就是255.255.255.0, 也就是254個 ip 有2個可以訪問 |
7. limit模塊
可以限制單位時(shí)間內(nèi)流入包的數(shù)量
可以用秒、分简卧、小時(shí)兔魂、天作為單位進(jìn)行限制
參數(shù)說明:
參數(shù) | 說明 | 示例 |
---|---|---|
--limit number/type |
顯示單位時(shí)間內(nèi)流入包的數(shù)量 /second; /minute; /hour; /day |
下面--limit 示例 |
--limit-burst |
空閑時(shí)可放行包的數(shù)量,默認(rèn)5(類似一個連接池举娩,里面默認(rèn)有5個連接析校,所以當(dāng)請求來的時(shí)候先去池里面找,如果有就拿去用铜涉,當(dāng)5個都用完時(shí)智玻,每過一段時(shí)間會再次生成一個。 |
如: --limit 3/second 表示每3秒產(chǎn)生一個連接芙代。--limit 30/minute 每分鐘產(chǎn)生30個) |
-
--limit
示例
首先添加一個每分鐘只允許10次 ping 的規(guī)則吊奢。也就是每6秒放行一個包。
root@kvm:~# iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
root@kvm:~# iptables -vnL NIPUT
Chain INPUT (policy ACCEPT 14 packets, 1057 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
然后在一臺機(jī)器上 ping 這個 iptables 測試機(jī)纹烹。會發(fā)現(xiàn) ping 這個完全不受影響页滚。
實(shí)際上被放行的規(guī)則已經(jīng)和定義的規(guī)則匹配上,為什么不應(yīng)該放行的規(guī)則被放行了呢铺呵?因?yàn)楸槐淼哪J(rèn)規(guī)則匹配到了裹驰,且默認(rèn)規(guī)則正好是 ACCEPT,所以相當(dāng)于所有的 ping 都被放行了片挂。
解決辦法幻林,修改表中鏈的默認(rèn)規(guī)則贞盯,或者添加一個新的規(guī)則來匹配其他 ping;
root@kvm:~# iptables -t filter -A INPUT -p icmp -j REJECT
root@kvm:~# iptables -vnL
Chain INPUT (policy ACCEPT 11 packets, 784 bytes)
pkts bytes target prot opt in out source destination
8 672 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
0 0 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
再次 ping iptables 測試機(jī)是發(fā)現(xiàn)前5個ping 沒有被控制沪饺,因?yàn)閰?shù)--limit-burst
默認(rèn)值是5躏敢,提前保留了5個可放行的包數(shù),所以前5個 ping 并不受影響整葡。
8. udp模塊
用戶匹配 upd 報(bào)文的源端口與目標(biāo)端口
參數(shù)說明:
參數(shù) | 說明 | 示例 | |
---|---|---|---|
--sport |
源端口(可以設(shè)置連續(xù)端口) | iptables -t filter -I INPUT -p udp -m udp --dport 13 -j ACCEPT | |
--dporr |
目標(biāo)端口(可以設(shè)置連續(xù)端口) | iptables -t filter -I INPUT -p udp -m udp --dport 80:88 -j ACCEPT | 件余、、 |
8. icmp模塊
icmp 報(bào)文類型: (百度百科)
類型 | 類型代碼 | 說明 |
---|---|---|
0 | 0 | Echo Reply——回顯應(yīng)答(Ping應(yīng)答) |
3 | 0 | Network Unreachable——網(wǎng)絡(luò)不可達(dá) |
3 | 1 | Host Unreachable——主機(jī)不可達(dá) |
3 | 2 | Protocol Unreachable——協(xié)議不可達(dá) |
3 | 3 | Port Unreachable——端口不可達(dá) |
3 | 4 | Fragmentation needed but no frag. bit set——需要進(jìn)行分片但設(shè)置不分片比特 |
3 | 5 | Source routing failed——源站選路失敗 |
3 | 6 | Destination network unknown——目的網(wǎng)絡(luò)未知 |
3 | 7 | Destination host unknown——目的主機(jī)未知 |
3 | 8 | Source host isolated (obsolete)——源主機(jī)被隔離(作廢不用) |
3 | 9 | Destination network administratively prohibited——目的網(wǎng)絡(luò)被強(qiáng)制禁止 |
3 | 10 | Destination host administratively prohibited——目的主機(jī)被強(qiáng)制禁止 |
3 | 11 | Network unreachable for TOS——由于服務(wù)類型TOS掘宪,網(wǎng)絡(luò)不可達(dá) |
3 | 12 | Host unreachable for TOS——由于服務(wù)類型TOS蛾扇,主機(jī)不可達(dá) |
3 | 13 | Communication administratively prohibited by filtering——由于過濾攘烛,通信被強(qiáng)制禁止 |
3 | 14 | Host precedence violation——主機(jī)越權(quán) |
3 | 15 | Precedence cutoff in effect——優(yōu)先中止生效 |
4 | 0 | Source quench——源端被關(guān)閉(基本流控制) |
5 | 0 | Redirect for network——對網(wǎng)絡(luò)重定向 |
5 | 1 | Redirect for host——對主機(jī)重定向 |
5 | 2 | Redirect for TOS and network——對服務(wù)類型和網(wǎng)絡(luò)重定向 |
5 | 3 | Redirect for TOS and host——對服務(wù)類型和主機(jī)重定向 |
8 | 0 | Echo request——回顯請求(Ping請求) |
9 | 0 | Router advertisement——路由器通告 |
10 | 0 | Route solicitation——路由器請求 |
11 | 0 | TTL equals 0 during transit——傳輸期間生存時(shí)間為0 |
11 | 1 | TTL equals 0 during reassembly——在數(shù)據(jù)報(bào)組裝期間生存時(shí)間為0 |
12 | 0 | IP header bad (catchall error)——壞的IP首部(包括各種差錯) |
12 | 1 | Required options missing——缺少必需的選項(xiàng) |
13 | 0 | Timestamp request (obsolete)——時(shí)間戳請求(作廢不用) |
14 | 0 | Timestamp reply (obsolete)——時(shí)間戳應(yīng)答(作廢不用) |
15 | 0 | Information request (obsolete)——信息請求(作廢不用) |
16 | 0 | Information reply (obsolete)——信息應(yīng)答(作廢不用) |
17 | 0 | Address mask request——地址掩碼請求 |
18 | 0 | Address mask reply——地址掩碼應(yīng)答 |
參數(shù)說明:
參數(shù) | 說明 | 示例 |
---|---|---|
--icmp-type |
匹配 icmp 報(bào)文的具體類型 | iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT |