デフォルトの 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
、接続はすぐにドロップされ、2 秒のタイムアウトが関連付けられています。常に戻り値であるため、2 秒がタイムアウトであると想定しています。(ソース コードでこれを実行する時間はありません)
VPC で 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
Deny が設定されていない場合は、dig
期待どおりに動作します。最後に、nmap
その UDP ポートでスキャンを実行すると、「open|filtered」応答が返されます。
残念ながら、ファイアウォールやフィルタリング デバイスも応答せずにパケットをドロップすることが知られています。そのため、Nmap は数回試行しても応答を受信しない場合、ポートが開いているかフィルタリングされているかを判断できません。
答え2
UDP を許可するルール 99 より前に処理される、番号の小さいルールがあります。ルールは昇順で評価されます。
「ルール番号。ルールは、番号が最も小さいルールから評価されます。ルールがトラフィックに一致すると、それと矛盾する可能性がある番号が大きいルールに関係なく、そのルールが適用されます。」
https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html#nacl-rules