limit模块的作用是针对报文的速率进行限制,限制的单位有秒、分钟、小时、天等,例如一分钟内只接收10个请求报文,多余的报文则会被丢弃。
limit模块的常用参数:
--limit rate[/second|/minute|/hour|/day]
:指定限制的平均速率单位,以秒(s)、分(m)、时(h)、天为单位,默认是3小时。--limit-burst
:要匹配的最大初始包的数量,例如1分钟内限制10个请求报文,那么首先一次性会接收我们指定初始化包的数量,剩余请求包按着速率单位来进行接收,默认值为5个报文。- 1.先添加一条规则,限制1分钟内只收10个icmp协议的请求报文。
- [root@jxl-1 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/minute -j ACCEPT
-
- 2.然后添加第二条规则,超出10个报文后,其余的报文全部丢弃。
- [root@jxl-1 ~]# iptables -t filter -A INPUT -p icmp -j DROP
-
- 3.查看添加的防火墙规则
- [root@jxl-1 ~]# iptables -L -n -v --line-number
- Chain INPUT (policy ACCEPT 1331 packets, 1111K bytes)
- num pkts bytes target prot opt in out source destination
- 1 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
- 2 0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0
-
- Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
- num pkts bytes target prot opt in out source destination
-
- Chain OUTPUT (policy ACCEPT 1334 packets, 1844K bytes)
- num pkts bytes target prot opt in out source destination
-
查看效果,可以看到前5个数据包都可以正常接收,那是因为limit默认初始包就是5个,因此没有任何问题,从第六个数据包开始后,每隔6秒才会正常处理一个数据包,因为1分钟限制10次数据包的接收,那就表示6秒收一个,效果如下图所示。
也可以理解为是一开始可以快速通过5个数据报文,后面的数据报文是每分钟通过10个。
实现思路和1)中一模一样,只不过就是调整一下初始包的数量。
- 1.先添加一条规则,限制1分钟内只收10个icmp协议的请求报文。
- [root@jxl-1 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
-
- 2.然后添加第二条规则,超出10个报文后,其余的报文全部丢弃。
- [root@jxl-1 ~]# iptables -t filter -A INPUT -p icmp -j DROP
-
效果如下,首先发送了10个数据包正常接收,剩下的数据包每隔1分钟接收1个。
限速如何通过limit模块来实现呢?其实也很简单,我们可以计算出1个数据包的大小,然后用500k的大小除以数据包的大小,得出500k能换算出多少个数据包,例如是300个,那么最后设置1秒钟接收的数据包的数量为300个,就可以实现每秒的传输速率带宽在500k左右。
一个数据包的大小大概在1500字节。
公式:(限制的带宽速率*1000)/(单个数据包的大小)
500k的限速,每秒可限制的数据包数量大概为(500*1000/150 = 300个)300个。
- [root@jxl-1 ~]# iptables -t filter -I OUTPUT -p tcp -m limit --limit 300/s -j ACCEPT
- [root@jxl-1 ~]# iptables -t filter -A OUTPUT -p tcp -j DROP
-
速率带宽多多少少是由落差的,如果就想限制在500k以内,可以根据测试的结果来调整每秒数据包的效果,如下图所示,拉取文件的速率为327k/s,此时数据包的数量我是设置的120个。