現在、すべてのUDPトラフィックをブロックするiptablesがありますが、特定のDNSクエリのみを通過させたいと考えています。
例としてgoogle.comを使用してみましょう。
文字列照合を使用してリクエスト内のドメイン名を見つけ、許可しようとしています。これが私が思いついたものです。
iptables -A OUTPUT -o eth0 -p udp --sport 53 -m string --string "google.com" --algo bm -j ACCEP
T
--dport 53
の代わりに--sport
も試しました。サイコロはありません。
誰かがこれを行う方法を知っているか、私が間違っていた場所を知っているなら、あなたの助けに感謝します!
ありがとう、ジャレッド
私はこれが少し遅いことを知っています、しかしあなたが質問を閉じていないので...
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
パラメーターを使用して検索範囲を制限することにより、ルールをわずかに調整し、速度を上げることができます。
ドットのある文字列では信頼できないことがわかりました。
これは機能します:
iptables -A OUTPUT -o eth0 -p udp --port 53 -m string --string google --algo bm -j ACCEPT