我有一个邮件服务器,我有一个坏习惯,用户喜欢在一秒钟内同时单击发送/接收按钮,导致日志中充斥着不必要的信息。
我正在尝试限制我的网络中的每个 IP 地址(内部 IP 地址)以便能够在 30 秒内连接到邮件服务器一次,但它不应该应用于外部 IP 地址,邮件服务器有时会从另一个允许的邮件服务器接收转发邮件。
我已经阅读了 iptables 的手册页并发现--connlimit-above N
它只限制连接而不是按时间单位限制。
谁能告诉我如何使用 iptables 或 ufw 来完成此操作?
答案1
这是速率限制的标准情况:
iptables -I INPUT -p tcp --dport 25 -i eth0 -s 192.168.0.0/24 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 25 -i eth0 -s 192.168.0.0/24 -m state --state NEW -m recent --update --seconds 30 --hitcount 2 -j DROP
这里我假设你的 LAN 是192.168.0.0/24你的界面是eth0,如果不是,请相应更改。
第一条规则检测所有新的有数据包过来eth0来自 LAN,目的地为 TCP 端口 25,并将 IP 地址添加到最近的列表;第二个命令,在收到新的同一端口上的数据包,检查最近的列表 (- 更新)并且,如果地址被输入到列表中的时间小于--秒 30之前,如果给定数量的--命中次数 2已达到。
请注意,这仅适用于新的数据包:如果你正在进行合法的对话,你不想干扰它,只需阻止另一个对话的建立。在这一点上,我的回答与 Angelo 的完全不同
答案2
好的,我还没有测试过这个,所以如果它不起作用,我提前道歉(但希望这能让你足够弄清楚):
iptables -A INPUT -s 192.168.0.0/24 -p tcp -m state --state ESTABLISHED --tcp-flags FIN,ACK FIN,ACK --dport 25 -m recent --name smtplimit --set
iptables -A INPUT -s 192.168.0.0/24 -p tcp -m state --state ESTABLISHED --tcp-flags RST RST --dport 25 -m recent --name smtplimit --set
iptables -A INPUT -s 192.168.0.0/24 -m recent --name smtplimit --rcheck --seconds 30 --hitcount 1 -m limit --limit 1/minute -j LOG --log-prefix 'SMTP limit:'
iptables -A INPUT -s 192.168.0.0/24 -m recent --name smtplimit --rcheck --seconds 30 --hitcount 1 -j DROP