使用 iptables 限制每个 IP 的传入连接

使用 iptables 限制每个 IP 的传入连接

我需要限制每个 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

限制连接数的方法是使用connlimitmatch。例如:

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

相关内容