iptables详解(4):iptables匹配条件总结之一
基本匹配条件
-s 匹配条件 源地址
① 一次性指定多个ip源地址,用“逗号”隔开,多个特定ip地址
iptables -t filter -I INPUT -s 192.168.23.242,192.168.23.47 -j DROP
② 指定特定网段
iptables -I INPUT -s 192.168.23.0/24 -J DROP
③ 匹配取反条件
iptables -t filter -A INPUT ! -s 192.168.23.246 -j ACCEPT
意思为不是23.246的包就可以接受 但是没有指明23.246的包如何处理
所以23.246的包应该是没有匹配规则之后就会执行默认的规则也就是accpet规则所以取反规则相当于无效。
-d 匹配条件目标地址
我们可以用如下规则去查看我们当前机器的地址总共有多少
ifconfig | awk '/inet addr/{print $1,$2}'
比如当前机器有多个网络出口,当前我只对某个接口进行接口的生效作用,当我个更换机器的的网络出口的时
该网络协议包还是可以正常运作,以路由器为例
当前路由器有蜂窝LTE出口ip、wlan出口ip、wan口出口ip、lan口出口ip等等
①指定不接收某个指定 ip 地址,指定不接收wan口请求相关的ping包等
iptables -I INPUT -s 192.168.23.46 -d 192.168.23.44 -j DROP
则当前规则生效
②一次性指定多个ip地址和-s一样
-p 协议类型
①只想拒绝 tcp请求
iptables -t filter -I INPUT -s 192.168.23.246 -d 192.168.23.44 -p tcp -j DROP
当前ping还是可以ping通 但是ssh失败了失去响应 说明当前的防火墙规则生效
在centos6中,-p支持的协议类型有
tcp、udp、udplite、icmp、esp、ah、sctp
centos7中除了上面的协议外 还支持 icmpv6、mh
当不适用-p则默表示所有类型的协议都会被匹配到,与使用-p all的效果相同
-i 网卡接口
-i 用于匹配报文流入的网卡, 从网卡出去的报文是不会用到-i选项的
-i 一般用于PREROUTING、INPUT链、FORWARD链
当主机有多块网卡时,可以使用-o选项,匹配报文将由哪块网卡流出,-o和-i是相对的,-i用于匹配报文从哪个网卡流入。-o 匹配从哪个网卡流出
-o 一般只能是POSTROUTING链、OUTPUT链、 FORWARD链
扩展匹配条件
--dport(--sport)源端口目的端口
基本匹配条件如源地址、目的地址可以直接用 然而扩展匹配条件的使用 需要依赖相应的扩展模块。
如果在-p中已经指定协议,则默认使用协议中写的模块名。
如果没有必须要指定对应的模块 -m +模块名 这样才能正常使用 --dport功能
--dport(--sport)
① 在使用--dport之前一定要先定义好是在哪个模块协议上进行使用的
否则会无法正常使用 --sport
iptables -I INPUT -p tcp -s 192.168.23.246 --sport 22 -j DROP
② 拒绝多个端口的访问 可以在-m 后面加上multiport加上多个端口
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
③ 用 :的方式来决定当前的端口是从哪个端口到哪个端口
iptables -A INPUT -p tcp -m multiport --dports 22,80,22:443 -j ACCEPT
--src-range (--dst-range)
指定一段连续的ip地址范围
iptables -I INPUT -m iprange --src-range 192.168.23.240-192.168.23.246 -j DROP
--string
--alogo指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项
--string指定需要匹配的字符串
报文中包含字符XXX,我们就丢弃当前的报文
iptables -I INPUT -m string --algo bm --string "百度一下" -j REJECT
-m string表示使用string模块--algo bm表示用bm算法去匹配指定的字符串,--string " "要匹配的内容
--algo:用于指定匹配算法 可选的算法有bm和kmp 此选项为必选项
time
表示报文到达的时间在指定的时间范围内 则符合匹配条件
比如在指定的时间内规定不能看网页,如家中的熊孩子周六日的早上9:00到下午6:00不能浏览网页
--timestart 指定时间范围的开始时间,不可取反
--timestop 指定时间范围的结束时间,不可取反
--weekdays 指定星期几 可取反
--monthdays 指定几号,可取反
--datestart 用于指定日期范围的开始日期 不可取反
--datestop 用于指定日期范围的结束时间 不可取反
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19: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 ! --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT
限制从2019.12.15-2019.12.16都不能上网
connlimit模块
主要用来限制连接服务器的数量
常用的扩展匹配条件如下
--connlimit-above 单独使用此选项时,表示限制每个ip的链接数量
--connlimit-mask 选项不可单独使用,配合--connlimit-above选项,配合此选项针对某类ip段内的一定数量的ip进行连接数量限制
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 20 --connlimit-mask 24 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT
限制链接数量上限,如每个ip地址最多只能占用2个ssh链接远程到server端,我们可以用如下的限制
可以发现第三个连接就不能正常连接进来了
mask为掩码的意思 24转换成十进制表示的是255.255.255.0一个最多只能包含254个ip的C类网址中,
同时最多只能有2个ssh客户端连接到当前服务器...如果子网掩码是27 表示为这个网段中最多只能有30个ip
limit模块
主要用来调整网络流量和速率限制
--limit-burst 类比令牌桶算法 此选项用于指定令牌桶中令牌的最大数量
--limit 类比令牌桶算法 此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有second minute hour day
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
令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。
大小固定的令牌桶可自行以恒定的速率源源不断地产生令牌。如果令牌不被消耗,或者被消耗的速度小于产生的速度,令牌就会不断地增多,直到把桶填满。后面再产生的令牌就会从桶中溢出。最后桶中可以保存的最大令牌数永远不会超过桶的大小。
如果令牌桶中存在令牌则允许发送流量,如果令牌桶中不存在令牌,则不允许发送流量
令牌桶算法 假如用户配置的平均发送速率为r,每个1/r 秒 一个令牌被加入捅中
假设桶最多可以存b个令牌 如果令牌桶满 则令牌会被丢弃
当一个n个字节(一个字节需要一个令牌才能发送数据)的数据包到达 就从令牌桶中拿出那个令牌 将数据包发送到网络
如果令牌桶中少于 n个令牌,那么数据包在流量限制之外,
对于在流量限制之外的数据包的处理方式有以下几种
1 被丢弃 2排列在队列中当令牌桶积累足够多令牌再传输 3 单个数据包拿单个令牌继续发送需要做特殊标记 网络过载时就会把这些特殊标记包丢弃
--limit用于指定多长时间生成一个新令牌的b limit-burst指的是木桶中最多存放几个令牌
如上例中表示令牌桶最多存放3个令牌 每分钟生成10个令牌(6s 生成一个令牌)
对报文到达速率进行限制 想要限制单位时间内流入的包的数量 就用limit模块(单位时间可以是 分钟 小时 天)
比如限制本机最多每6s放行一个ping包
--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 iptables -t filter -I OUTPUT -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 OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT