我正在使用 coturn 设置一个仅使用 STUN 的服务器(TURN 已禁用)。似乎 STUN UDP 可用于 DDoS,所以我试图设置nftables
规则以使其更难,但规则似乎并不总是有效。有时,我可以看到类似这样的情况tcpdump
:
21:16:08.006842 IP 5.39.71.183.25565 > A.B.C.D.3478: UDP, length 20
21:16:08.007091 IP A.B.C.D.3478 > 5.39.71.183.25565: UDP, length 72
21:16:08.258386 IP 5.39.71.183.25565 > A.B.C.D.3478: UDP, length 20
21:16:08.258613 IP A.B.C.D.3478 > 5.39.71.183.25565: UDP, length 72
21:16:08.278988 IP 5.39.71.183.25565 > A.B.C.D.3478: UDP, length 20
21:16:08.279229 IP A.B.C.D.3478 > 5.39.71.183.25565: UDP, length 72
21:16:08.475423 IP 5.39.71.183.25565 > A.B.C.D.3478: UDP, length 20
21:16:08.475734 IP A.B.C.D.3478 > 5.39.71.183.25565: UDP, length 72
21:16:08.481217 IP 5.39.71.183.25565 > A.B.C.D.3478: UDP, length 20
21:16:08.481416 IP A.B.C.D.3478 > 5.39.71.183.25565: UDP, length 72
21:16:08.484939 IP 5.39.71.183.25565 > A.B.C.D.3478: UDP, length 20
21:16:08.485211 IP A.B.C.D.3478 > 5.39.71.183.25565: UDP, length 72
21:16:08.490332 IP 5.39.71.183.25565 > A.B.C.D.3478: UDP, length 20
21:16:08.490545 IP A.B.C.D.3478 > 5.39.71.183.25565: UDP, length 72
21:16:08.505617 IP 5.39.71.183.25565 > A.B.C.D.3478: UDP, length 20
21:16:08.505901 IP A.B.C.D.3478 > 5.39.71.183.25565: UDP, length 72
21:16:08.529745 IP 5.39.71.183.25565 > A.B.C.D.3478: UDP, length 20
21:16:08.530020 IP A.B.C.D.3478 > 5.39.71.183.25565: UDP, length 72
21:16:08.819766 IP 5.39.71.183.25565 > A.B.C.D.3478: UDP, length 20
21:16:08.820048 IP A.B.C.D.3478 > 5.39.71.183.25565: UDP, length 72
这高于 上指定的 3/秒限制nft
。nft
规则如下:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state vmap { established : accept, related : accept, invalid : drop }
iifname lo accept
tcp dport 1935 ct state new log prefix "[RTMP]: " accept
tcp dport 443 ct state new log prefix "[HTTPS]: " accept
tcp dport 3478 ct state new log prefix "[STUN TCP]: " limit rate 5/second accept
tcp dport 5349 ct state new log prefix "[STUN TLS]: " limit rate 5/second accept
########################################################################
####### These two rules are where it is not behaving as intended #######
udp dport 3478 log prefix "[STUN UDP]: " limit rate 3/second accept
udp dport 3478 log prefix "[STUN UDP THIS RULE]: " limit rate over 3/second drop
########################################################################
ip saddr E.F.G.H ct state new log prefix "[Some server that is allowed]: " accept
udp dport 5060 ct state new log prefix "[SIP UDP]: " accept
tcp dport 5060 ct state new log prefix "[SIP TCP]: " accept
tcp dport 5061 ct state new log prefix "[SIP TLS]: " accept
udp dport { 5000-31000 } ct state new log prefix "[RTP]: " accept
ip saddr 0.0.0.0 ip daddr 255.255.255.255 udp dport { 67, 68 } ct state new drop
}
chain forward {
type filter hook forward priority 0;
}
chain output {
type filter hook output priority 0;
}
}
由于正在运行其他一些服务,因此存在一些附加规则,但是即使使用其他端口的其他服务已停止,我仍然遇到这个问题。
对我来说最奇怪的是,只有一个地方提到了这些数据包dmesg
:
[4151543.207466] [STUN UDP]: IN=eth0 OUT= MAC=00:00:00:00:00:00:d4:c1:9e:0b:4d:c0:08:00 SRC=5.39.71.183 DST=A.B.C.D LEN=48 TOS=0x00 PREC=0x00 TTL=241 ID=31022 PROTO=UDP SPT=25565 DPT=3478 LEN=28
很可能我不明白某些内容,无论是关于nftables
、STUN、两者还是其他内容。问题:
规则顺序是否错误?例如,STUN UDP 规则应该位于行之前
ct state vmap
?由于
nftables
规则设置了 3/秒的限制,而不考虑数据包的状态,难道不应该在端口 3478 上接收到的每个数据包上进行处理吗?
或者也许是其他我还未发现的原因导致该nftables
限制无法应用。
系统信息:
OS: Debian 11
coturn version: 4.5.2-3 from the Debian repository.
nftables version: v0.9.8 (E.D.S.) from the Debian repository.
答案1
你所有的tcpdumpNetfilter 将捕获视为单流:每个数据包匹配相同的双向连接跟踪5 组(此处:udp,5.39.71.183,25565,ABCD,3478)。因此,一旦此流的第一个数据包(根据状态 中的定义new
)被限制规则接受,则同一流的所有其他数据包(在 Netfilter 的连接跟踪在状态下established
,被第一个短路规则接受:
ct state vmap { established : accept, related : accept, invalid : drop }
虽然您只会在 UDP 中看到这种情况,但 TCP 的行为应该相同,但我猜测使用 UDP 进行 DDoS 比使用 TCP 更容易(没有使用 TCP 进行欺骗等)。
您应该将限制相关的规则移到第一个短路规则之前。