匹配条件
一:-s 源地址:指定 ip 时可用 "," 隔开,指定多个;也可以指定网段,用 "!" 取反
注意:取反表示报文源地址 IP 不为 192.168.1.103 即满足条件,执行相应的动作
实例如下:
二:-d 目标地址
注意:
1. 源地址表示报文从哪里来,目标地址表示报文要到哪里去,当目标主机有两块或以上网卡时,示例如下
**2. 上面说到 -s 的使用方法 -d 同样适用 **
案例一:
指定来 80.174 网卡拒绝接收来自 80.138 的报文
接着我们在 192.168.80.138 的机器中检查下
可以看到 80.138 可以 ping 通 80.144 的 ip 地址,但被 80.174 拒绝了 “目标端口不可到达”
三:-p 协议类型,指定需要匹配的协议类型
注意:
1. ssh 协议的传输层协议属于 tcp 协议类型,ping 命令使用 icmp 协议
2. Centos6 中,-p 支持 tcp、udp、udplite、icmp、esp、ah、sctp
3. Centos7 中,-p 支持 tcp、udp、udplite、icmp、esp、ah、sctp、icmpv6、mh
4. 当不使用 -p 时,默认表示要匹配所有类型,与 -p all 效果相同
案例二:拒绝来自 138 的 tcp 类型的请求
在 192.168.80.138 的机器中测试
四:网卡接口
-i:匹配报文是从哪块网卡流入本机的(了解)
-o:匹配报文是从哪块网卡流入本机的(了解)
我们回顾下下图:
数据包从 prerouting 链流入 input 链 与 forward 链
数据包从 output 链 与 forward 链 经 postouting 链流出
所以:-i 用于 prerouting input forward 链;-o 用于 output forward postouting 链
案例三:
-i 与 -o 举例
扩展匹配条件
一: tcp、multiport 扩展模块
选项 | 说明 |
---|---|
tcp 模块 | 当 -p 指定 tcp 协议时,-m 可以将其省略掉 |
-m | 指定扩展模块 |
--dport (tcp 扩展模块) | 目标端口 |
--sport (tcp 扩展模块) | 源端口 |
multiport 模块 | 同时指定多个离散端口 |
1. -p tcp -m tcp --sport 用于匹配 tcp 协议报文的源端口,可以使用 ":" 指定一个连续的端口范围 2. -p 与 -m 并不冲突,因为 -m 指定扩展模块的名称 -p 指定报文的协议,只不过是两者名字碰巧一样 3. 在不使用 -m 时,会默认使用与 -p 指定协议名相同的模块 4. --dport 针对端口可以使用的功能,--sport 同样适用,如:(:20)、(20:80)、(20:80) 案例四: tcp 扩展模块举例
1)拒绝来自 101 的 ssh 请求
iptables -I INPUT -s 192.168.1.101 -p tcp -m tcp --sport 22 -j REJECT
2)拒绝来自 101 的 tcp协议的请求,拒绝的端口范围为:22 - 25 端口
iptables -I INPUT -s 192.168.1.101 -p tcp -m tcp --dport 22:25 -j REJECT
3)拒绝来自 101 的 tcp协议的请求,拒绝的端口范围为:0 - 22 端口
iptables -I INPUT -s 192.168.1.101 -p tcp -m tcp --dport :22 -j REJECT
4)拒绝来自 101 的 tcp协议的请求,拒绝的端口范围为:80 - 65535 端口
iptables -I INPUT -s 192.168.1.101 -p tcp -m tcp --dport 80: -j REJECT
5)拒绝来自 101 的 tcp协议的请求,拒绝的端口范围为:不是 22 端口
iptables -I INPUT -s 192.168.1.101 -p tcp -m tcp ! --sport 22 -j ACCEPT
案例五: multiport 扩展模块举例
1)使用 multiport 模块 指定 拒绝 101,102 两个端口
iptables -l INPUT -s 192.168.1.101 -p udp -m multiport --sports 101,102 -j REJECT
2)使用 multiport 模块 指定 拒绝 22,80 两个端口
iptables -I INPUT -s 192.168.1.101 -p tcp -m multiport --dports 22,80 -j REJECT
3)使用 multiport 模块 指定 拒绝除 22,80 两个端口以外的端口
iptables -I INPUT -s 192.168.1.101 -p tcp -m multiport ! --dports 22,80 -j REJECT
4)使用 multiport 模块 指定 拒绝 80 - 88 范围内的端口
iptables -I INPUT -s 192.168.1.101 -p tcp -m multiport --dports 80:88 -j REJECT
5)使用 multiport 模块 指定 拒绝 22端口、80 - 88 范围内的端口
iptables -I INPUT -s 192.168.1.101 -p tcp -m multiport --dports 22,80:88 -j REJECT
tcp 扩展模块之 --tcp-flags **--tcp-flags:**指 tcp 头中的标志位,可以用此扩展匹配,去匹配 tcp 报文的头部的标识位,然后根据标识位实现控制的功能 使用方法如下:
iptables -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
iptables -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT
其中 tcp 扩展模块专门提供了一个可以匹配 " 第一次握手 " 的选项:**--syn**
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT
**注意:--syn 相当于 --tcp-flags SYN,RST,ACK,FIN SYN**
二: iprange、string、time、connlimit、limit 扩展模块
1. iprange 指定一段连续的 IP 地址范围(-s 与 -d 无法指定一段连续的 IP 地址范围)
--src-range:匹配报文的源地址所在范围
--dst-range:匹配报文的目标地址所在范围
案例六:
指定一段连续的 IP 地址
2. string 匹配字符串,即包含对应的字符串,则匹配成功执行相应动作
--algo:指定匹配的算法(bm/kmp)二者必须选其一
--string:指定需要匹配的字符串
案例七:
匹配字符串 “It works!” 字符串,执行 REJTCT 动作
下面是 Apache 的展示页
规则如下,结果再次访问时未响应
3. time 指定时间范围
扩展条件 | 说明 |
---|---|
--timestart | 指定时间范围的开始时间,不可取反 |
--timestop | 指定时间范围的结束时间,不可取反 |
--weekdays | 指定 "星期几" ,可取反 |
--monthdays | 指定 "几号" ,可取反 |
--datestart | 指定日期范围的开始时间,不可取反 |
--datestop | 指定日期范围的结束时间,不可取反 |
案例八: time 扩展模块举例
1)早上 9 点至晚上 7 点不可以浏览网页
iptables -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
2)周六、日不可以浏览网页
iptables -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT
3)每月的 22、23 不可以浏览网页
iptables -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT
4)每月的除了 22、23 不可以浏览网页
iptables -I OUTPUT -p tcp --dport 80 -m time ! --monthdays 22,23 -j REJECT
5)周六、日的早上 9 点至晚上 7 点不可以浏览网页
iptables -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
6)每月的 22-28 的星期五不可以浏览网页
iptables -I OUTPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
7)2018-12-24 至 2018-12-27 不可以浏览网页
iptables -I OUTPUT -p tcp --dport 80 -m time --datestart 2018-12-24 --datestop 2018-12-27 -j REJECT
4. connlimit 限制 IP 并发连接数
扩展条件 | 说明 |
---|---|
--connlimit-above | 单独使用此选项时,表示限制每个 IP 的连接数量 |
--connlimit-mask | 不可以单独使用,在使用 --connlimit-above 选项时,配合此选项,表示限制 某类 IP 段内一定数量的 IP 连接数 |
案例九: connlimit 扩展模块举例
1)每个 IP 地址最多只能占用两个 ssh 链接远程到服务端(不指定 IP 即表示所有 IP)
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
2)在 C 类网段中,最多同时有 20 个 ssh 客户端连接到服务器
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT
3)在 C 类网段中,最多同时有 10 个 ssh 客户端连接到服务器
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT
5. limit 扩展模块 limit 限制 "报文到达速率",即限制单位时间内流入包的数量
扩展条件 | 说明 |
---|---|
--limit-burst | 参考 " 令牌桶 " 算法,指定令牌桶中令牌的最大数量 |
--limit | 参考 " 令牌桶 " 算法,指定令牌桶中令牌生成的频率,时间单位有:/second、/minute、/hour、/day |
案例十: 当外部主机对本机进行 ping 操作时,本机没 6 秒放行一个包
iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
iptables -t filter -A INPUT -p icmp -j REJECT