私は少し途方に暮れています。
最初にいくつかのコンテキスト:NLBの背後にAWS EC2インスタンスがあります。 NLBはElastic IPを使用しています。 EC2インスタンスはDNSサーバーを実行し、UDPおよびTCP 53でリッスンします。NLBはTCPおよびUDPポート53に設定されています。インスタンスはNLBの目でターゲットグループと健康(および期待どおりに要求に応えます)。
解決しようとしている問題:レコードタイプANY
(およびレート制限とフィルター処理のための他のいくつかのルール)のすべてのDNSクエリを確実に削除するため、次のiptables
ルール:
$ iptables -t raw -I PREROUTING -p udp --dport 53 -m string \
--hex-string "|0000FF0001|" --algo bm --from 40 -j DROP
$ iptables -t raw -I PREROUTING -p tcp --dport 53 -m string \
--hex-string "|0000FF0001|" --algo bm --from 52 -j DROP
$ iptables -t raw -I PREROUTING -p udp --dport 53 -m string \
--hex-string "|0000FF0001|" --algo bm --from 40 -j LOG \
--log-prefix "BLOCKED ANY: "
$ iptables -t raw -I PREROUTING -p tcp --dport 53 -m string \
--hex-string "|0000FF0001|" --algo bm --from 52 -j LOG \
--log-prefix "BLOCKED ANY: "
今問題のために...
Dig some.domain -t any @public.ip.of.instance
を試してもクエリがブロックされ、期待どおり/var/log/kern.log
にログエントリが表示されます。
Dig some.domain -t any @elastic.ip.on.nlb
を試してもリクエストはブロックされず、応答が返されます。 kern.log
にログエントリがありません。
私にとって最も奇妙な点は、NLBを図から取り除き、同じElastic IPをインスタンスに直接割り当てたことです。同じ結果-ANY
に送信されたEIP
クエリは、上記のiptables
ルールが設定されていても削除されません。 ANY
の代わりにプライベートIPを使用して別のインスタンスから送信された同じEIP
クエリは、期待どおりにドロップされます。
nat
(PREROUTING
チェーンも使用)およびfilter
(INPUT
チェーンを使用)テーブルで同じルールを試しました。 iptables
ルールに明らかなものがないのですか?
他のアイデアはありますか?
ServerFaultを見回してこの答えを見つけました- 16進文字列の一致によるパケットのドロップパケット 16進値の間にスペースが表示されるので、試してみることをお勧めします。
$ iptables --append INPUT --match string --algo kmp \
--hex-string '|f4 6d 04 25 b2 02 00 0a|' --jump ACCEPT
$ iptables -t raw -I PREROUTING -p udp --dport 53 -m string \
--hex-string "|00 00 FF 00 01|" --algo bm --from 40 -j DROP
many数時間のトラブルシューティングの後、まあまあです。短い答えは、それがずっと機能していたということです...
NLBの背後にあるEC2インスタンスでtcpdumpを実行しました(tcpdump udp port 53 -X -nn
)。次に、Macbook(Catalina 10.15.2)からDig some.domain -t any @elastic.ip.on.nlb
そして、応答が得られただけでなく、クエリはEC2インスタンスのパケットキャプチャにも表示されませんでした。 Digクエリで使用したElastic IPを使用するNLBの背後にあるEC2インスタンスは1つだけです。奇妙なことに、私は同じDigコマンドをUbuntuマシンとWindows 10コンピューターで実行しました。これらのクエリは両方ともタイムアウトになり(iptablesによって適切にフィルター処理されました)、tcpdumpでそれらが表示され、期待どおりにログメッセージが/var/log/kern.logにありました。 Macbookに戻り、同じDigコマンドを実行しても、tcpdumpに応答が返され、何も返されません... wtf!
私はMacbookを再起動し、正しいIPと同じクエリを使用して100万回チェックし、さまざまなドメインを試し、おそらく他の何百ものものを試しました。これが私のMacbookからのパケットキャプチャに何も含まれていない応答を返すように見えるのはどうしてですか。
したがって、最終的には、奇妙に孤立した問題(おそらくApple怠惰が起こっている...)のように見え、AWSや奇妙なパケットマングリングがAWSによって行われたり、最初に思ったようなiptablesルールが破綻したりしていないようです。本当の答えは、StackExchangeに投稿する前に、複数のマシンで試してみることです。
編集:明確にします。 EIPではなくインスタンスのパブリックIPを使用すると、Macbookからのtcpdumpにクエリが表示されます(期待どおりにタイムアウトします)。クエリが表示されないEIPのみで応答が返されます...
また、これが回答投稿なのか、それとも最初の投稿を修正しただけなのかわかりません。 Modはあなたがすることでそれを行います!