我在默认 VPC 中创建了一个 AWS 实例,并在网络 ACL 中阻止了所有 UDP 流量。我的出站规则如下:
规则编号 | 类型 | 协议 | 端口范围 | 目的地 | 允许否认 |
---|---|---|---|---|---|
99 | 所有 UDP | UDP(17) | 全部 | 0.0.0.0/0 | 否定 |
100 | 全部 TCP | TCP(6) | 全部 | 0.0.0.0/0 | 允许 |
* | 所有流量 | 全部 | 全部 | 0.0.0.0/0 | 否定 |
如果我使用traceroute
,则正如预期的那样,我什么也得不到:
[ec2-user@ip-172-31-32-169 ~]$ traceroute 1.1.1.1
traceroute to 1.1.1.1 (1.1.1.1), 30 hops max, 60 byte packets
1 * * *
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
...
但是,如果我使用nc
,我做收到意想不到的回应:
[ec2-user@ip-172-31-32-169 ~]$ nc -vzu 1.1.1.1 53
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 1.1.1.1:53.
Ncat: UDP packet sent successfully
Ncat: 1 bytes sent, 0 bytes received in 2.01 seconds.
为什么会发生这种情况?另外,它总是需要 2 秒才能得到响应。为什么是 2 秒?
答案1
TL;DR - UDP 被 NACL 规则阻止。您收到的响应nc
具有欺骗性,我相信(但尚未确认)2.01 秒的时间是超时。
Netcat 表示它发送了一个数据包,确实如此。但是您的 NACL 充当了 EC2 实例所连接的子网的第 3/4 层防火墙。数据包是从主机发送的,但 NACL 阻止了它(并丢弃了它)。由于您使用了标志-z
,它会立即断开连接,并且与之相关的超时时间为两秒。我假设两秒是超时时间,因为它始终是返回值。(我没有时间在源代码中运行它)
我在 VPC 中重新创建了您的 NACL,并遇到了与上述相同的结果,包括准确的“已接收”值。但是当我尝试使用该 NACL 查找该网站时,dig
如果设置了拒绝,则会出现超时。
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 1.1.1.1:53.
Ncat: UDP packet sent successfully
Ncat: 1 bytes sent, 0 bytes received in 2.01 seconds.
[root@ip-10-99-0-198 centos]# dig +short @1.1.1.1 www.google.com
;; connection timed out; no servers could be reached
当拒绝未到位时,dig
工作将按预期进行。最后要说的是,如果您nmap
在该 UDP 端口上运行扫描,您将获得“打开|过滤”响应。
不幸的是,防火墙和过滤设备也会丢弃数据包而不做出响应。因此,当 Nmap 尝试多次仍未收到响应时,它无法确定端口是开放的还是被过滤的。
答案2
您有一个编号较低的规则,该规则在允许 UDP 的规则 99 之前处理。规则按升序评估。
“规则编号。规则从编号最低的规则开始评估。只要某条规则与流量匹配,就会应用该规则,而不管是否有任何编号更高的规则可能与之相矛盾。”
https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html#nacl-rules