![限制 INPUT UDP 端口每秒传入数据包的数量 [仅限每个 IP,而非全局]](https://linux22.com/image/678200/%E9%99%90%E5%88%B6%20INPUT%20UDP%20%E7%AB%AF%E5%8F%A3%E6%AF%8F%E7%A7%92%E4%BC%A0%E5%85%A5%E6%95%B0%E6%8D%AE%E5%8C%85%E7%9A%84%E6%95%B0%E9%87%8F%20%5B%E4%BB%85%E9%99%90%E6%AF%8F%E4%B8%AA%20IP%EF%BC%8C%E8%80%8C%E9%9D%9E%E5%85%A8%E5%B1%80%5D%20.png)
我搜索了一下,没有找到一条规则可以限制每秒每个 IP 输入 UDP 端口的传入数据包数量。
我需要它所有连接到我的套接字的 IP,不是为了具体的一。
我在 Ubuntu 14.0.4 LTS amd64 上使用 iptables。
我熟悉 UDP 的工作原理。在我的场景中,有人可以使用不同的端口创建大量 UDP 套接字。
我只需要一个来自单个 IP 的套接字就可以连接到我的 UDP 端口。
使用 iptables 可以实现吗?我了解 Netfilter 和 C++,我可以用它来实现吗?
答案1
您可以执行以下操作:
iptables -A INPUT -p udp -s 111.111.111.111 --dport 123 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
你需要限制iptables 扩展。提供的示例限制每分钟最多 25 个连接。表示limit-burst 100
只有在连接总数达到限制突发级别后才会强制执行每分钟限制。
来自手册:
-s, --source address[/mask][,...]
Source specification. Address can be either a network name, a hostname, a network IP address (with /mask), or a plain IP
address. Hostnames will be resolved once only, before the rule is submitted to the kernel. Please note that specifying any
name to be resolved with a remote query such as DNS is a really bad idea. The mask can be either an ipv4 network mask (for
iptables) or a plain number, specifying the number of 1's at the left side of the network mask. Thus, an iptables mask of 24
is equivalent to 255.255.255.0. A "!" argument before the address specification inverts the sense of the address. The flag
--src is an alias for this option. Multiple addresses can be specified, but this will expand to multiple rules (when adding
with -A), or will cause multiple rules to be deleted (with -D).