为什么设置 iptables 规则后 UDP 端口 443 不接受连接?
环境
- 操作系统:Linux 6.8.0-47-generic #47-Ubuntu,aarch64
- 云虚拟机:是(Hetzner)
当前设置
我正在尝试在端口 443 上设置 UDP 通信,但尽管配置了防火墙规则,仍然遇到问题。
采取的措施
添加防火墙规则:
sudo iptables -A INPUT -p udp --dport 443 -j ACCEPT sudo netfilter-persistent save
当前 iptables 规则:
# IPv4 rules iptables -L -v -n | grep 443 35318 4093K f2b-nginx-limit-req 6 -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 210K 25M f2b-nginx-php-accessrules 6 -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 209K 25M f2b-wordpress 6 -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 209K 25M f2b-nginx-bad-request 6 -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443 302 88281 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:443 # IPv6 rules ip6tables -L -v -n | grep 443 61618 9650K f2b-wordpress 6 -- * * ::/0 ::/0 multiport dports 80,443 61600 9649K f2b-nginx-bad-request 6 -- * * ::/0 ::/0 multiport dports 80,443 61600 9649K f2b-nginx-php-accessrules 6 -- * * ::/0 ::/0 multiport dports 80,443 1467 316K ACCEPT 17 -- * * ::/0 ::/0 udp dpt:443
端口扫描结果:
sudo nmap -sU -p 443 <server-ip> Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-26 20:14 CEST Nmap scan report for <server-ip> Host is up (0.0027s latency). PORT STATE SERVICE 443/udp open|filtered https Nmap done: 1 IP address (1 host up) scanned in 0.49 seconds
尝试进行 netcat 测试:
- 服务器端:
sudo nc -lu 443
- 客户端:
echo 'test' | nc -u <server-ip> 443
- 服务器端:
问题
尽管在 nmap 扫描中端口显示为“open|filtered”,但没有流量到达监听的 netcat 进程。
问题
- 为什么端口显示为“打开|过滤”而不是明确“打开”?
- 我可能需要哪些额外的配置才能使 UDP 流量通过端口 443?
- 我应该采取什么诊断步骤来确定流量被阻塞的位置?
我已经检查过的内容
- 防火墙规则已设置并保存,适用于 IPv4 和 IPv6
- 根据 nmap 显示端口未被阻塞
- 客户端和服务器之间存在基本连接
- Hetzner 云防火墙配置为允许端口 443 UDP
- fail2ban 针对端口 80,443 有多条规则,但这些规则似乎适用于 TCP(与 nginx 相关)
附加信息
如果有人需要有关我的设置的更多详细信息或其他调试信息,请告诉我。
1. 为什么端口显示为“打开|过滤”而不是明确“打开”?
与 TCP 不同,开放的 UDP 端口并不能保证一定能给出答案。一切都取决于 UDP 之上的应用层协议。
如果客户端发送出一个 UDP 数据包并收到 ICMP端口不可达消息,则表明目标 UDP 端口已关闭:要么没有应用程序在该端口接收数据包,要么防火墙模拟了一个关闭的端口。
但是,如果客户端根本没有收到任何响应,则数据包可能被服务器端应用程序接收并忽略,因为它不符合预期的格式,并且应用程序不设计为发回错误消息数据包;或者可能是因为防火墙丢弃了数据包。因此有
open|filtered
迹象表明。2. 我可能需要哪些额外的配置才能使 UDP 流量通过端口 443?
您需要配置您的 Web 服务器软件以接受基于 UDP 形式的 HTTP 协议(即 QUIC 和 HTTP/3)。
Fail2ban 规则名称
f2b-nginx-limit-req
,f2b-nginx-php-accessrules
并f2b-nginx-bad-request
建议您的 Web 服务器软件是nginx
,因此请参阅nginx 文档页面关于启用 QUIC 和 HTTP/3 的信息。具体来说,您至少需要
listen 443 quic reuseport;
指令来激活 QUIC / HTTP/3 支持,并且需要此代码片段向 HTTP-over-TCP 客户端宣布 HTTP/3 在 (UDP) 端口 443 上可用:一旦
listen 443 quic reuseport;
生效,您的 nginx 服务器应该会监听传入的 UDP 连接。您可以sudo lsof -i udp:443
在服务器系统上使用以下命令验证这一点。正如 Artem S. Tashkinov 所指出的,您只向我们展示了明确提到端口号 443 的 iptables 规则。很容易出现一些规则,例如,不考虑端口号而阻止所有 UDP 流量:这些规则在 中是不可见的
ip(6?)tables -L -v -n | grep 443
。如果这样的规则在接受到端口 443 的 UDP 流量的规则之前存在,则永远不会达到接受规则,因为第一个匹配的规则(带有ACCEPT
或DROP
另一个类似的“不可撤销”操作)获胜。另一方面,
ip(6?)tables -A INPUT -p udp --dport 443 -j ACCEPT
规则的数据包/数据计数器表明规则的 IPv4 和 IPv6 版本都至少匹配了一些数据包。如果计数器在测试过程中不断增加,则表明iptables
配置可能允许 UDP/443 通过。3. 我应该采取什么诊断步骤来确定流量被阻塞的位置?
如上所述,你应该运行
在服务器系统上验证您的 Web 服务器是否确实在端口 443 上监听 UDP 流量(而不仅仅是 TCP)。