Linux でドメイン フィルタリングを行うにはどうすればよいでしょうか?

Linux でドメイン フィルタリングを行うにはどうすればよいでしょうか?

できれば に似たもの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

ブラックリストに載せる最も簡単な方法は、おそらくdnsmasq

インストールdnsmasq

$ sudo apt-get install dnsmasq

この行を追加して/etc/dnsmasq.conf

address=/facebook.com/127.0.0.1

これによりブロックされますフェイスブックおよびそのすべてのサブドメイン。

注: Ubuntuについては以下を参照してくださいこの郵便受け

答え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説明します。

ウェブ広告をブロックするためのシンプルな DNS ベースのアプローチ

関連情報