5.iptables的匹配条件(二)
iprange模块
指定一段连续的IP地址范围,可以使用iprange扩展模块。
--src-range:匹配报文的源地址所在范围
--dst-range:匹配报文的目的地址所在范围
表示如果报文的源IP地址如果在10.10.10.16到10.10.10.18之间,则丢弃报文;IP段的始末IP使用横杠“-”连接
string模块
使用string扩展模块,可以指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件。
比如,如果报文中包含“hello world”,我们就丢弃当前报文
首先,我们在IP为10.10.10.16的主机上启动httpd服务,然后编写两个主页内容分别为“hello world”、“1111”,没有配置任何规则时,15主机可以正常访问16主机上的这个两个页面。
那么,我们想要达到的目的是,如果报文中包含“hello world”字符,我们就拒绝报文进入主机,所以,我们可以在15主机上进行设置:
上图中,-m string表示使用string模块
--algo bm表示使用bm算法去匹配指定的字符串;必选项
--string "hello world" 表示我们想要匹配的字符串
time模块
可以使用time扩展模块,根据时间段匹配报文,如果报文到达的时间在指定的时间范围内,则符合条件。
比如,晚上8点到早上6点不能使用ssh连接当前服务器,可以这样设置:
使用ssh连接,显然是拒绝的:
-m time 表示使用time扩展模块
--timestart 选项指定起始时间
--timestop 选项指定结束时间
如果想要只是周六日不能远程ssh连接服务器,
可以使用--weekdays
选项指定每个星期的具体哪一天,可以同时指定多个,用逗号隔开
--monthdays选项具体指定每个月的哪一天
例如,设置每月的18号,22号
当一条规则同时存在多个条件时,多个条件之间默认存在“与”的关系,所以可以同时使用--weekdays
选项和--monthdays
,表示指定每个月的第几个星期。
connlimit模块
connlimit模块可以限制每个IP地址同时链接到server端的链接数量,不指定IP,其默认就是针对每个客户端IP,即对单个IP的并发连接数限制。
比如,想要限制每个IP地址最多使用两个SSH连接到本地,可以如下设置:
-m connlimit 指定使用connlimit扩展模块
--connlimit-above 2 表示限制每个IP的连接数量上限为2
--connlimit-mask选项,限制某类网段的连接数量
--connlimit-mask 24 表示某个C类网段;24为255.255.255.0
使用--connlimit-mask选项后,可以针对“某类IP段内的一定数量的IP”进行连接数量的限制。
limit模块
limit模块是对“报文到达速率”进行限制;限制单位时间内流入的包的数据。
例如,限制每秒中最多流入3个包,或则限制每分钟最多流入30个包
限制外部主机对本机进行ping操作时,每秒最6秒最多放行一个ping包,可以进行如下设置:
第一条规则表示每分钟最多放行10个icmp包,也就是每6秒放行一个,第6秒的icmp包会被上例的第一条规则匹配到,第6秒之前的包则不会被第一条规则匹配到,于是被后面的拒绝规则匹配到了。
使用ping测试
为什么前5个ping包没有受到限制?
这是因为--limit-burst
模块,指定“空闲时可放行的包的数量”,默认值为5,才会出现刚才的问题,前5个ping包没有受到任何速率的限制,之后的包才受到了规则的限制。
命令总结
# iprange
--src-range # 匹配报文的源地址所在范围
--dst-range # 匹配报文的目的地址所在范围
# string
--string "hello" # 表示想要匹配的字符串
--algo bm # 表示使用bm算法去匹配指定的字符串,必选项,可用算法:bm、kmp
# time
--timestart # 指定起始时间,不可取反
--timestop # 指定结束时间,不可取反
--weekdays # 指定每个星期的具体哪一天,可取反
--monthdays # 指定每个月的哪一天,可取反
--datestart # 指定日期范围的开始时间,不可取反
--datestop # 指定日期范围的结束时间,不可取反
# connlimit
--connlimit-above # 限制每个IP的连接数量上限
--connlimit-mask # 限制某网段的连接数量
# limit
--limit # 限制单位时间内流入的包的数据
--limit-burst # 指定空闲时可放行的包的数量