我需要限制每个 IP 对某个端口的访问。假设每分钟 5 个连接 - 不能更多。
我见过 iptables最近的,连接限制和限制,但它们并不完全符合我的需要。
假设你有一个客户端每秒尝试连接一次。在我的场景中,我需要允许 5 个数据包每分钟。
最近的:如果某个 IP 每隔 1 秒尝试连接一次,--hitcount 5 将记住此 IP 并将其保留在列表中,直到在 --second 60 时间内没有数据包进入。因此,在我的场景中,它将永久限制客户端。
限制:这个限制按照我的意愿用--limit 5/min,但是对于所有IP - 无法为每个IP指定这个。
连接限制:限制同时连接的数量,而不是限制某个时间的连接数量。
事实上,我需要限制 + 最近的组合。谁知道怎么做?
答案1
最后终于用最近的方法做到了:
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW \
-m recent --rcheck --seconds 60 --hitcount 5 --name ssh --rsource \
-j REJECT --reject-with icmp-port-unreachable
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW \
-m recent --set --name ssh --rsource
--update 将在每次接收数据包时重新启动计时器,但 --rcheck 只会检查它。60 秒后,结构将被删除,并重新启动新的计时器。
这是我得到它的方式(我没有查找资料来源 - 太懒了)
答案2
使用哈希限制匹配扩展:
port=9999
iptables -A INPUT -p tcp --dport $port \
-m conntrack --ctstate NEW \
-m hashlimit --hashlimit-name SuperUser \
--hashlimit-above 5/minute \
--hashlimit-mode srcip \
-j DROP
调试版本:
#!/bin/sh
dport=9999
limit=2/minute
burst=2
iptables -F
iptables -N SuperUser 2>/dev/null
iptables -N SuperUserLimited 2>/dev/null
# SuperUserLimited
iptables -A SuperUserLimited -j LOG \
--log-level info \
--log-prefix 'SU:dropped '
iptables -A SuperUserLimited -j DROP
# SuperUser
iptables -A SuperUser -j LOG \
--log-level info \
--log-prefix 'SU:new '
iptables -A SuperUser -m hashlimit \
--hashlimit-name SuperUser \
--hashlimit-above $limit \
--hashlimit-burst $burst \
--hashlimit-mode srcip \
-j SuperUserLimited
iptables -A SuperUser -j LOG \
--log-level info \
--log-prefix 'SU:accepted '
# main
iptables -A INPUT -p tcp --dport $dport \
-m state --state NEW \
-j SuperUser
答案3
限制连接数的方法是使用connlimit
match。例如:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
它将拒绝来自一个源 IP 的 5 个以上连接。如果你想要防止 DDoS 攻击hashlimit
,你可以限制每个 IP、每个 IP + 端口组合等。因此,Web 服务器的示例将是这样的
iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit 45/sec --hashlimit-burst 60 --hashlimit-mode srcip --hashlimit-name DDOS --hashlimit-htable-size 32768 --hashlimit-htable-max 32768 --hashlimit-htable-gcinterval 1000 --hashlimit-htable-expire 100000 -j ACCEPT