linux防火墙流量控制的核心是iptables的limit模块,其原理基于令牌桶算法。①令牌以固定速率生成,--limit指定该速率;②令牌桶有容量限制,--limit-burst定义突发流量上限;③数据包需获取令牌才能通过,无令牌则丢弃或延迟。这保障了长期平均速率不被突破,同时允许短时流量突发。编写规则时应先清理旧规则、设置默认策略、允许已建立连接和本地回环,再添加限速规则。例如限制ssh每分钟6个新连接,突发10个;icmp每秒2个,突发5个。测试可使用ab或curl模拟高并发请求,并观察日志及iptables计数器验证效果。最后务必保存规则以防重启丢失。流量控制不仅提升安全性,还确保资源公平分配与性能稳定。

Linux防火墙进行流量控制,核心通常是利用
iptables
limit

要实现Linux下的防火墙流量控制,尤其是限速,我们主要依赖
iptables
limit
一个基本的限速流程通常是这样的:

清理现有规则(可选,但推荐在测试环境进行):
iptables -F iptables -X iptables -Z iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT
(注意:在生产环境操作前务必备份规则并谨慎!)
设置默认策略(例如,对入站流量更严格):
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT
这表示默认拒绝所有进入和转发的连接,然后我们再明确允许需要的流量。
允许已建立的连接和相关连接: 这是非常关键的一步,否则你可能会把自己锁在外面。
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
允许本地回环接口:
iptables -A INPUT -i lo -j ACCEPT
添加限速规则: 使用
limit
# 允许每分钟最多6个新的SSH连接尝试,突发(burst)限制为10个 iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 6/minute --limit-burst 10 -j ACCEPT # 超过限制的SSH连接尝试将被丢弃 iptables -A INPUT -p tcp --dport 22 -j DROP
这个例子中,
--limit 6/minute
--limit-burst 10
再比如,限制ICMP(ping)请求的速率,避免被ping洪水攻击:
# 允许每秒最多2个ICMP请求,突发限制为5个 iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 2/second --limit-burst 5 -j ACCEPT # 超过限制的ICMP请求将被丢弃 iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
保存规则: 规则默认是临时的,重启后会消失。你需要保存它们:
sudo netfilter-persistent save
sudo service netfilter-persistent save
sudo iptables-save > /etc/sysconfig/iptables
systemctl enable iptables
firewalld
iptables-save > /path/to/your/rules.v4
iptables-restore < /path/to/your/rules.v4
在我看来,对Linux服务器进行流量控制,远不止是字面意义上的“限速”那么简单。它更像是一种精细化的资源管理和风险规避策略。我们为什么需要它?
首先,安全是绕不开的话题。想一下,如果你的SSH端口被持续的暴力破解攻击,或者某个服务端口被大量的恶意请求淹没,服务器的资源很快就会被耗尽,甚至可能导致服务崩溃。流量控制,尤其是对连接速率的限制,能有效抵御这类基于连接数的DoS(拒绝服务)攻击和暴力破解尝试。它就像给你的服务器门口装了个“流量计”,当发现有人想一窝蜂地冲进来时,就会适当地减速或拒绝,保护内部的稳定。
其次,资源公平性与性能保障。在多用户或多服务并存的环境中,如果没有流量控制,某个单一的进程或用户可能会因为编写不当的程序、过度的请求,或者仅仅是下载大文件,就占用所有可用的带宽或CPU资源,导致其他正常服务的响应速度变慢甚至不可用。我遇到过这样的情况:一个简单的API接口因为没有限流,在某个客户端误触发循环调用后,直接把整个Web服务器拖垮了。通过流量控制,我们可以确保每个服务或用户都能获得相对公平的资源,避免“劣币驱逐良币”的现象,从而保障整体系统的性能和可用性。
最后,它也是一种成本控制。尤其是在云计算环境中,出站流量往往是需要付费的。如果你的服务器被恶意利用发送垃圾邮件,或者某个应用出现bug导致大量不必要的出站请求,那账单上的数字可能会让你大吃一惊。通过对出站流量的合理控制,也能在一定程度上规避这类意外的成本飙升。
总的来说,流量控制就像是服务器的“交通警察”,在保障道路畅通的同时,也维持着秩序,避免拥堵和事故。
iptables
iptables
--limit
--limit-burst
想象一下,你有一个桶,这个桶里可以装一定数量的“令牌”。这些令牌是按照一个固定的速率源源不断地生成并放入桶中。当一个数据包想要通过防火墙时,它首先需要从桶里“拿走”一个令牌。如果桶里有足够的令牌,数据包就可以通过;如果没有令牌了,那么这个数据包就必须等待,或者被直接丢弃(取决于你的规则设置)。
--limit <rate>
--limit 6/minute
--limit-burst <number>
--limit-burst 10
所以,当一个数据包到来时:
这种机制的巧妙之处在于,它既能保证长期平均速率不被突破,又能允许短时间的流量突发,从而在性能和安全之间找到一个平衡点。它不像简单的计数器那样,达到某个数量就直接锁死,而是提供了一种更平滑、更智能的流量控制方式。
iptables
编写
iptables
我们来编写一个稍微复杂一点的,限制HTTP(80端口)和HTTPS(443端口)入站连接的规则,并尝试测试它。
场景: 限制单个IP地址对我们Web服务的连接速率,防止恶意爬虫或DDoS。
1. 编写规则:
# 假设我们已经设置了默认策略和ESTABLISHED/RELATED规则 # 针对HTTP (80端口) 的限速: # 允许每个IP地址每秒最多20个新连接,突发限制为50个。 # 超过这个限制的连接,我们先记录下来(LOG),然后丢弃(DROP)。 iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 20/second --limit-burst 50 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j LOG --log-prefix "HTTP_DROP: " --log-level 7 iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j DROP # 针对HTTPS (443端口) 的限速: # 同样,每个IP地址每秒最多20个新连接,突发限制50个。 iptables -A INPUT -p tcp --dport 443 -m state --state NEW -m limit --limit 20/second --limit-burst 50 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j LOG --log-prefix "HTTPS_DROP: " --log-level 7 iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j DROP
这里,我们使用了
--log-prefix
--log-level 7
/var/log/syslog
/var/log/messages
2. 测试规则:
测试是关键,尤其是在生产环境部署前,务必在测试环境反复验证。
查看规则:
sudo iptables -vnL --line-numbers
-v
-n
-L
--line-numbers
模拟流量: 从另一个客户端机器(或虚拟机)向你的Linux服务器发起大量连接。
ab
siege
ab
ab -n 1000 -c 100 http://你的服务器IP/
或者简单的
curl
for i in {1..100}; do curl -s -o /dev/null http://你的服务器IP/ & done(这个更粗暴,可能一下子就触发限速了)
观察日志:
tail -f /var/log/syslog # 或者 /var/log/messages,取决于你的系统配置
你应该能看到带有 "HTTP_DROP: " 或 "HTTPS_DROP: " 前缀的日志信息,这表明你的限速规则已经成功地丢弃了超过限制的连接。
观察iptables
sudo iptables -vnL
packets
bytes
DROP
3. 注意事项与常见错误:
iptables
ACCEPT
DROP
-m state --state RELATED,ESTABLISHED -j ACCEPT
INPUT
DROP
DROP
iptables
测试时,从一个非生产环境开始,逐步调整和观察,直到找到最适合你的配置。这是一个迭代的过程,没有一劳永逸的完美方案。
以上就是Linux如何配置防火墙进行流量控制?_Linuxiptables限速规则详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号