web-dev-qa-db-ja.com

Linuxでドメインフィルタリングを行う方法

できればiptablesに似たもの。基本的に、iptablesのIPの場合と同じように、ドメインフィルタリング/ホワイトリスト/ブラックリストを作成します。これを行う方法に関する推奨事項はありますか?

12
user26053

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

基本的に、16進数の文字列udp/53がドロップされているすべてのDNSパケット(www.facebook.com to)に対して、あなたは言っています。これにより、httpトラフィック自体ではなく、名前解決がドロップされることに注意してください。

Pipes(|03|www|08|facebook|03|com)で区切られた16進数は、dnsクエリのdot.シンボルの表現です。 [〜#〜] fqdn [〜#〜] (ホスト、ドメイン、トップレベルドメイン)の各部分を表す以下の文字の数が表示されます。例:

ホスト: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クエリを「ハイジャック」し、ドメインをブロックしていません。ユーザーはそんなに馬鹿ではありません;)

出典: ここ および ここ

8
user34720

多分あなたの質問への答えは遅すぎるかもしれませんが、最近私は同様の問題を解決する必要があり、グーグルは私をここに連れてきます

検索が失敗した後、DNS応答をインターセプトし、その中のドメイン名を指定された正規表現と比較し、一致するIPアドレスをリストする小さなユーティリティをCで作成しました。ここにあります: https://github.com/vmxdev/sidmat/

独自のDNSサーバーを設定する必要はありません。ユーティリティはどのサーバーからのDNS応答もキャッチできます

たとえば、現在解決されているfacebook.com(およびサブドメイン)のIPアドレスを表示するには、次のコマンドを実行します。

# ./sidmat eth0 "^facebook\.com$|\.facebook\.com$"
173.252.120.6
...

ここで、eth0はルーターのネットワークインターフェイスです(またはDNS応答が通過します)。

Iptables(またはiptablesとipset)と簡単に統合できます。

だが:

  • ユーティリティは本当に簡単です。それは多くのチェックを実行しないので、攻撃者はそれをだますことができます
  • ユーザーが名前解決にDNSを使用しない場合、この手法は役に立ちません
4
vmx

ブラックリストの最も簡単な方法は、おそらくdnsmasqを使用することです。

インストールdnsmasq

$ Sudo apt-get install dnsmasq

この行を/etc/dnsmasq.confに追加します

address=/facebook.com/127.0.0.1

これにより facebook.com とそのすべてのサブドメインがブロックされます。

注:ubuntuについては この投稿 を参照してください。

3
lemonsqueeze

ローカルキャッシング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を実行 with facebook.comの例。

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

1
user55518