我正在寻找一种方法来“控制”每秒VoIP邀请(UDP)的高容量(每秒调用)在我的VoIP服务器到端口5060的iptables级别。
我需要做的是将每秒邀请的数量限制在一定的速率(例如20 cps),如果我收到大量CPS到服务器,我需要将它们重定向到另一台机器上的另一个端口(例如UDP/5090),在同一台机器上,另一个程序正在运行,用SIP消息"603谢绝“来回答它们。这个是可能的吗?
到目前为止,我对类似的问题有很多答案,我有点迷茫.我需要使用--限制?,连接限制?,hitcount??
与此同时,是否可以通过源ip地址来完成此操作?
概念上我在想这样的事情..。如有可能:
INPUT
iptables --append INPUT --match conntrack --ctstate NEW --jump RATE-LIMIT
RATE-LIMIT
iptables --append RATE-LIMIT --match limit --limit 20/sec --limit-burst 20 --jump ACCEPT
iptables --append RATE-LIMIT --jump DECLINE-INVITE
DECLINE-INVITE
iptables --append DECLINE-INVITE [how to redirect to port udp 5090]谢谢!里卡多
发布于 2021-05-03 22:26:12
首先,让我们看一下Netfilter和通用网络中的分组流原理图:

在OP试图操作的步骤: filter/INPUT (过滤器/输入)已经太晚了,无法完成预定的操作,在路由决定之前,必须在nat/PREROUTING中完成执行DNAT的任务。
因此,这必须是更早的,对于其他一些情况,可能需要使用两个不同的表: mangle/PREROUTING用于某些特殊测试,nat/PREROUTING用于端口重定向,数据包上有标记,以将从mangle表传递到nat表的意图传递给nat表。实际上,这样的情况非常复杂,可能涉及原始表中的连接区,并且从不使用简单的设置(下面是一个例子:IPTables重定向所有UDP数据包,包括已建立的)
在这里,nat/PREROUTING就足够了。这是因为只有启动新流的数据包(state )才会检查OP的情况,而这正是nat表中已经发生的情况:只有状态新的数据包被看到(如示意图中所提醒的那样),其他每个数据包都将遵循所做的NAT决定。因此,这个块:--match conntrack --ctstate NEW在任何nat表规则中都是多余的:它总是正确的。限制匹配没有限制,可以在任何表/链中使用。
最后:
-j ACCEPT只是意思是“在这种情况下不要做任何NAT”-p udp,即使只有5060个/UDP数据包符合此规则。iptables -t nat -N RATE-LIMIT
iptables -t nat -N DECLINE-INVITE
iptables -t nat -A PREROUTING -p udp --dport 5060 -j RATE-LIMIT
iptables -t nat -A RATE-LIMIT -m limit --limit 20/sec --limit-burst 20 -j ACCEPT
iptables -t nat -A RATE-LIMIT -j DECLINE-INVITE
iptables -t nat -A DECLINE-INVITE -p udp -j DNAT --to-destination :5090https://unix.stackexchange.com/questions/647913
复制相似问题