使用iptables每IP限制传入连接


5

我需要限制每个IP访问一些端口。假设每分钟有5个连接 - 而不是更多。

我见过iptables 最近 connlimit 限制 ,但所有这些都不符合我的需要。

假设您有一个客户端尝试每秒连接。在我的场景中,我需要允许5个数据包 每分钟

最近 :如果某个IP尝试每1秒连接一次, - hitcount 5将记住此IP并将其保留在列表中,直到没有数据包进入 - 第二次60秒。因此,它会在我的场景中永久限制客户端。

限制 :这个限制我想要 - 限制5 /分钟,但对于所有IP - 无法指定每个IP。

connlimit :限制同时连接的数量,而不是每一次。

事实上,我需要限制+最近的混合物。谁知道怎么做?


您是否尝试限制特定应用程序,例如Apache或Postfix,或者您是否需要某些通用TCP应用程序?
Cristian Ciupitu

我需要限制SSH服务器的连接数
PoltoS

Answers:


2

终于设法用最近的:

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秒后,删除结构并再次启动新计时器。

这就是我得到它的方式(我没有考虑来源 - 太懒了)


1

使用 hashlimit 匹配扩展:

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

嗯,谷歌搜索时从未见过hashlimit。但我不明白它是如何工作的: iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit-name SSH --hashlimit-mode srcip --hashlimit-above 5 / min -j REJECT 此调用不会捕获任何命令,而 iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit-name SSH --hashlimit-mode srcip --hashlimit 5 / min -j REJECT 陷阱所有新连接......
PoltoS

我没有看到 --hashlimit 文档中的选项,因此第二个命令应该引发错误。
Cristian Ciupitu

看来我有一个旧的iptables,其中hashlimit似乎与hashlimit-upto相同。可能是老不行。
PoltoS

我有iptables-1.4.19.1-1.fc20.x86_64。
Cristian Ciupitu

@PoltoS,你有什么iptables版本?什么分布?
Cristian Ciupitu

0

要限制使用的连接数 connlimit 比赛。 一个例子:

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


@PoltoS,怎么回事?
totti

这不是我想要的。这限制了同时连接,而我需要限制在1分钟内建立(并且可能结束)的连接总数。
PoltoS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.