web-dev-qa-db-ja.com

iptablesルールはAWS NLBおよびElastic IPでは機能せず、EC2インスタンスのパブリックIPを使用して機能します

私は少し途方に暮れています。

最初にいくつかのコンテキスト: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クエリは、期待どおりにドロップされます。

natPREROUTINGチェーンも使用)およびfilterINPUTチェーンを使用)テーブルで同じルールを試しました。 iptablesルールに明らかなものがないのですか?

他のアイデアはありますか?

3
irlrobot

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
2
slm

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はあなたがすることでそれを行います!

0
irlrobot