web-dev-qa-db-ja.com

iptablesは特定のドメイン名に対してのみDNSクエリを許可できますか?

現在、すべてのUDPトラフィックをブロックするiptablesがありますが、特定のDNSクエリのみを通過させたいと考えています。

例としてgoogle.comを使用してみましょう。

文字列照合を使用してリクエスト内のドメイン名を見つけ、許可しようとしています。これが私が思いついたものです。

iptables -A OUTPUT -o eth0 -p udp --sport 53 -m string --string "google.com" --algo bm -j ACCEPT

--dport 53の代わりに--sportも試しました。サイコロはありません。

誰かがこれを行う方法を知っているか、私が間違っていた場所を知っているなら、あなたの助けに感謝します!

ありがとう、ジャレッド

16
Jarred Kenny

私はこれが少し遅いことを知っています、しかしあなたが質問を閉じていないので...

WiresharkなどでDNS要求パケットの内容を見ると、ドット文字が使用されていないことがわかります。ドメイン名の各部分はカウントされた文字列であるため、google.comのリクエストの実際のバイトは次のようになります。

06 67 6f 6f 67 6c 65 03 63 6f 6d

最初のバイト(06)はgoogleの長さで、その後に6つのASCII文字、次にcomの長さのカウントバイト(03)が続きます。続いて...あなたはアイデアを得る。

Iptablesでこれを一致させるには、以下を使用します。

iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --hex-string "|06|google|03|com" -algo bm -j ACCEPT

--hex-stringパラメーターは、提供された文字列を解析して、垂直バーのペアで区切られた16進値を探します。縦棒の外側はすべてASCIIテキストとして解釈されます。

エントリを追加した後にOUTPUTテーブルを一覧表示すると、次の行に沿って何かが見つかります。

ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain STRING match  "|06676f6f676c6503636f6d|" ALGO name bm TO 65535

--fromおよび--toパラメーターを使用して検索範囲を制限することにより、ルールをわずかに調整し、速度を上げることができます。

27
Corey

ドットのある文字列では信頼できないことがわかりました。

これは機能します:

iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --string google --algo bm -j ACCEPT
4
Saverio Proto