iprange模块
使用iprange模块可以指定一段连续的IP地址范围
--src-range
--dst-range
# example
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.1-192.168.1.100 -j DROP
# 通过 ! 取反
iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.1-192.168.1.100 -j DROP
string模块
指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件
选项 | 操作 |
---|---|
–algo | 用于指定匹配算法,可选的算法有bm和kmp,此选项为必选项,必须指定一个 |
–string | 指定要匹配的字符串 |
iptables -t filter -I INPUT -m string --algo kmp --string "OOXX" -j REJET
time模块
# examples
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27
# --monthdays --weekdays 可以用 ! 取反
connlimit模块
限制每个IP地址同时链接到server端的链接数量
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
# 限制某类网段
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT
在指定–connlimit-mask之后,就意味着可以针对“某类IP段内一定数量的IP”进行链接数量的限制
limit模块
limit模块是对“报文到达速率”进行限制的
iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
iptables -t filter -A INPUT -p icmp -j REJECT
- 需要指定–limit-burst“空闲时可放行的包的数量”,否则在匹配到limit规则之前,不会受到速率限制
- –limit-burst默认是5,基于令牌桶算法
iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
# 3s 生成3个令牌
iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3/second --limit 10/minute -j ACCEPT
可用的时间单位有:/second、/minute、/hour、/day
tcp模块
设置–tcp-flags标志位。匹配TCP三次握手时的标志位
# ALL可以表示“SYN,ACK,FIN,RST,URG,PSH”
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT
# 使用--syn相当于使用--tcp-flags SYN,ACK,FIN,RST SYN
# 即匹配第一次握手的报文,tcp新建连接的请求报文
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT
udp模块
这个模块匹配条件比较少,只有–sport和–dport,即匹配报文的源端口和目标端口
iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT
iptables -t filter -I INPUT -p udp --dport 137:157 -j ACCEPT
icmp扩展
# 禁止icmp类型的报文进入本机
iptables -t filter -I INPUT -p icmp -j REJECT
# --icmp-type表示根据具体的type与code去匹配icmp报文
# ping请求类型的type=8,code=0,别人无法ping本机
# 本机ping的type=0,code=0,因此本机可以ping
iptables -f filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
# 根据icmp报文的描述也可以匹配,效果同上
iptables -I INPUT -p icmp --icmp-type "echo-request" -j REJECT
state扩展
state扩展可以让iptables实现连接追踪机制
对于state而言,有以下状态:
- NEW,连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW
- ESTABLISHED,我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立
- RELATED: 关联状态,例如FTP存在两个进程,一个命令进程,一个数据进程。
- 命令进程负责服务端与客户端之间的命令传输
- 数据进程负责服务端与客户端之间的数据传输
- 具体传输哪些数据,是由命令去控制的,所以,"数据连接"中的报文与"命令连接"是有"关系"的
- 因此,数据连接中的报文可能就是RELATED状态
- INVALID,如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID,我们可以主动屏蔽状态为INVALID的报文
- UNTRACKED,报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接
# 放行ESTABLISHED和RELATED状态的包,其余全拒绝
iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -j REJECT