Linux通过TC、IPTABLES和IPSET组合来限制入站IP的速率

有些个别场景需要限制来访IP的并发速率以及单位时间内的流量,使用TC和IPTABLES就可以很好的解决这些问题,在这里注意如果要限制IPV6来访的话,命令是不一样的,因为IPTABLES默认是只限制IPV4。

下面来一个限制65512端口的实例给大家参考:

# 创建根qdisc
tc qdisc add dev eth0 root handle 1: htb

# 创建限制为5Mbps的“throttle”类
# rate是保证最低速率ceil是最大并发速率
tc class add dev eth0 parent 1: classid 1:1 htb rate 50mbit ceil 80mbit

# 创建限制为100Mbps的“normal”类
# rate是保证最低速率ceil是最大并发速率
tc class add dev eth0 parent 1: classid 1:2 htb rate 150mbit ceil 200mbit

# 创建“conn_limit”IPV4集合
# 过期时间为2小时,也就是说这里面的每个IP存在时间是2小时
ipset create conn_limit hash:ip timeout 7200

# 限制MUT在1500值的情况下每个IP在60秒内传输超过480MB的流量,以及每秒并发传输30MB将其添加到conn_limit集合
# --hashlimit-above 344065/minute是每分钟通过的包数量
# --hashlimit-burst 21505是每秒并发的包数量
# 换算的时候记得要计算实际传输量
iptables -t mangle -A OUTPUT -p tcp --sport 65512 -m state --state ESTABLISHED -m hashlimit --hashlimit-above 344065/minute --hashlimit-burst 21505 --hashlimit-mode srcip --hashlimit-name port65512 -j SET --add-set conn_limit dst --exist

# 将匹配“conn_limit”集合的IP流量重定向到“throttle”类
iptables -t mangle -A OUTPUT -p tcp --sport 65512 -m state --state ESTABLISHED -m set --match-set conn_limit dst -j CLASSIFY --set-class 1:1

# 将其他流量重定向到“normal”类
iptables -t mangle -A OUTPUT -p tcp --sport 65512 -m state --state ESTABLISHED -m set ! --match-set conn_limit dst -j CLASSIFY --set-class 1:2

以上IPV4,下面是IPV6:

# 创建根qdisc
tc qdisc add dev eth0 root handle 1: htb

# 创建限制为5Mbps的“throttle”类
tc class add dev eth0 parent 1: classid 1:1 htb rate 50mbit ceil 80mbit

# 创建限制为100Mbps的“normal”类
tc class add dev eth0 parent 1: classid 1:2 htb rate 150mbit ceil 200mbit

# 创建“conn_limit”IPV6集合
ipset create conn_limit hash:ip family inet6 timeout 7200

# 限制MUT在1500值的情况下每个IP在60秒内传输超过480MB的流量,以及每秒并发传输30MB将其添加到conn_limit集合
ip6tables -t mangle -A OUTPUT -p tcp --sport 65512 -m state --state ESTABLISHED -m hashlimit --hashlimit-above 344065/minute --hashlimit-burst 21505 --hashlimit-mode srcip --hashlimit-name port65512 -j SET --add-set conn_limit dst --exist

# 将匹配“conn_limit”集合的IP流量重定向到“throttle”类
ip6tables -t mangle -A OUTPUT -p tcp --sport 65512 -m state --state ESTABLISHED -m set --match-set conn_limit dst -j CLASSIFY --set-class 1:1

# 将其他流量重定向到“normal”类
ip6tables -t mangle -A OUTPUT -p tcp --sport 65512 -m state --state ESTABLISHED -m set ! --match-set conn_limit dst -j CLASSIFY --set-class 1:2

最后提醒大家:这些规则重启之后都会无效,要设置开机启动才会在重启之后启用规则。

版权声明:
作者:绛霄
链接:https://www.u8899.de/2023/03/26/126/
来源:JAXo's Blog
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码