できれば に似たものiptables
。基本的に、 の IP と同じようにドメイン フィルタリング/ホワイトリスト/ブラックリストを作成したいのですが、iptables
これを行う方法について何か推奨事項はありますか?
答え1
iptables ルールで名前解決を使用してトラフィックをドロップすると、そのルールの作成中に名前が解決されます。何かが変更されると、ルールは有効ではなくなります。これは解決策になる可能性があります (美しい解決策ではありません...):
# iptables -I FORWARD -p udp --dport 53 -m string --hex-string "|03|www|08|facebook|03|com" --algo bm -j DROP
LAN 内の別のホストから:
# host www.facebook.com
www.facebook.com A record not found, try again
udp/53
基本的に、 16 進文字列 を持つすべての DNS パケット ( ) をドロップするように指示していることになりますwww.facebook.com to
。これにより、名前解決がドロップされますが、HTTP トラフィック自体はドロップされないことに注意してください。
パイプ()で区切られた16進数は、 DNSクエリの|03|www|08|facebook|03|com
ドット記号の表現です.
。これは、次の文字のうち、各部分が何文字を表すかを示します。完全修飾ドメイン名(ホスト、ドメイン、トップレベルドメイン) 例:
ホスト:mail.google.com
16進数表現:04 6d 61 69 6c 06 67 6f 6f 67 6c 65 03 63 6f 6d
「視覚的」表現:04mail06google03com
tcpdump でパケットを取得する:
# tcpdump -i eth0 -X dst port 53
15:50:11.643672 IP xxx.xxx.xxx.xxx:xxx > ns4.google.com.domain: 16530 A? mail.google.com. (33)
0x0000: 4500 003d 779a 4000 4011 b390 c949 4742 E..=w.@[email protected]
0x0010: d8ef 260a 8424 0035 0029 0fc0 4092 0000 ..&..$.5.)..@...
0x0020: 0001 0000 0000 0000 046d 6169 6c06 676f .........mail.go
0x0030: 6f67 6c65 0363 6f6d 0000 0100 01 ogle.com.....
でも覚えておいて:
- smtp、ftp、http などのより具体的なトラフィックをフィルタリングしようとしている場合は、そのプロトコルのプロキシの方が適しています。
- DNS クエリを「ハイジャック」していて、ドメインをブロックしていません。ユーザーはそれほど愚かではありません ;)
答え2
質問への回答は遅すぎるかもしれませんが、最近同様の問題を解決する必要があり、Googleでここにたどり着きました
検索に失敗した後、DNS 応答を傍受し、その中のドメイン名を指定された正規表現と比較し、一致した IP アドレスをリストする小さなユーティリティを C で作成しました。これがそのユーティリティです。参考:
独自のDNSサーバーを設定する必要はありません。ユーティリティはどのサーバーからのDNS応答もキャッチできます。
例えば、現在解決されているfacebook.com(およびサブドメイン)のIPアドレスを確認するには、次のコマンドを実行します。
# ./sidmat eth0 "^facebook\.com$|\.facebook\.com$"
173.252.120.6
...
eth0 はルーターのネットワークインターフェース(または DNS 応答が渡される場所)です。
iptables(またはipsetとiptables)と簡単に統合できます。
しかし:
- ユーティリティは非常にシンプルです。多くのチェックを行わないため、攻撃者はそれを騙すことができます。
- ユーザーが名前解決にDNSを使用しない場合、この手法は役に立たない。
答え3
答え4
ローカルキャッシュbind9を実行する場合、多くの場合、dummy-block
zone "facebook.com" { type master; file "dummy-block"; };
そしてdummy-block
ファイル:
$TTL 604800
@ IN SOA localhost. root.localhost. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS localhost.
@ IN A 127.0.0.1
* IN A 127.0.0.1
参照:
BIND9とISC-DHCPの実行例を挙げてfacebook.com
説明します。