Linux:特定のアプリケーション/ホスト名でIPv6をブロックする


8

問題と狙い

ISPからIPv6を取得していないため、IPv6トンネルは正常に動作しますが、もちろん非常に高速ではありません。そして、本当に信頼できません。「念のため」にIPv6を使用できるようにしたいのですが、特定のホスト(ドメイン)をIPv4のみで接続する必要があります。

デフォルトのプロトコル

すべてのアプリケーションが最初にIPv6を試すように思えます。これはおそらくglibcの設定です。このデフォルトが(すべてのアプリケーションに対して)逆にされれば、私は問題ありません。

ネットフィルター

NetfilterでIPv6アドレス/ネットワークをブロックすることは可能ですが、2つの問題があります。

  1. アプリがIPv4を試す前にIPv6タイムアウトを待機するため、遅延が発生しますか?
  2. いくつかのドメインは混沌としたように混ざっているようです。google.comとyoutube.comを分離することは、それを回避できるのであれば望ましくないように思えます。

私はただのmanページがあることに注意しip route、ルーティングタイプのために言いますunreachable

ローカル送信者はEHOSTUNREACHエラーを受け取ります。

NetfilterのDROPまたはREJECTでも同じことが起こりますか?このようなエラーが原因で遅延が発生することはありません。

DNSフィルタリング

別の解決策(それが可能であればかなり簡単な解決策)は、特定のドメインのAAAAレコードをフィルタリングすることです。それが(簡単に)できない場合:DNSサーバーとNetfilterを接続して、「IPアドレスXがドメインYに属している」ことを確認して、それをNetfilterに追加できますか?すべてをログに記録してログをgrepするよりもエレガントなものはありますか?

行く方法?

どの(その他の)可能性があり、最も簡単なものは何ですか?


2
最新のWebブラウザーなど、Happy EyeballsRFC 6555)を実装するものには気付かないでしょう。
マイケルハンプトン2013年

DNSはそのように機能するようには設計されていません。いずれにしても、より信頼性の高いトンネルサービスを試すことができます。
マイケルハンプトン

回答:


16

でアドレス選択を制御できます/etc/gai.conf。構成ファイルは十分に文書化されており、すでにデフォルトが含まれているので、調整を始めることができます。

ここで興味深いデフォルトは次のとおりです。

label  ::1/128       0
label  ::/0          1
label  2002::/16     2
label ::/96          3
label ::ffff:0:0/96  4
precedence  ::1/128       50
precedence  ::/0          40
precedence  2002::/16     30
precedence ::/96          20
precedence ::ffff:0:0/96  10

最後の行は、すべてのIPv4アドレスに最も低い優先順位を与えます。

すべてのIPv4を優先したい場合は、次のように変更できます。

precedence ::ffff:0:0/96  100

特定のIPv4アドレスまたはブロックのみを優先したい場合は、それらも指定できます。IPv4にマップされたIPv6を16進数で使用する必要があることに注意してください。

したがって、すべてのIPv6よりも203.0.113.0/24を優先するには、以下を追加します。

label ::ffff:cb00:7100/120 5
precedence ::ffff:cb00:7100/120 100

実行中のアプリケーションを再起動して、加えた変更をアプリケーションに反映させます。


Debian派生システムで/etc/gai.confは、はすでに存在しています。Red Hat派生システムにはありませんが、サンプルファイルはにあり/usr/share/doc/glibc-common-*/gai.confます。コピーしてください/etc


これまで聞いたことがない。DNSソリューションではありませんが、すばらしいヒントです。
Hauke Laging 2013年

あなたは最も簡単な方法を求めました... :)
マイケルハンプトン

4

OK、これは完全に異なる答えです。

不適切なIPv6接続の問題のあるホストを/etc/hosts、対応するIPv4アドレスとともに配置します。

例えば:

199.7.53.74 whois.verisign-grs.com

それら(この場合)またはIPv6接続が改善されたら、必ず削除してください。


1
これは、単一のIPを持つ単一のホストにとっては簡単です。先ほど触れたように、これは**。youtube.comについてです。したがって、多くのホスト名が影響を受けます。理論的には、これはDNSで簡単です。「。youtube.com内のすべてのAAAAレコードをブロック」。あなたのアプローチは、これらすべてのアドレスを(おそらく、ドメイン構造もIPも頻繁に変更せず、スクリプトが毎日それをチェックするようにしても問題ないでしょう)に置くことです/etc/hosts。だれも「DNSサーバーソフトウェアXYはこの方法でフィルタリングできない!!」私はおそらくそれで終わるでしょう。
Hauke Laging 2013年

私はほとんどすべての既知のDNSサーバーパッケージに精通しており、簡単に、またはまったく、あなたが望んでいるように見えるものを実行するものはありません。独自のカスタムコードを記述したい場合...しかし、もちろん本当の解決策はIPv6接続を改善することです。別のトンネルブローカーを試してみませんか?
マイケルハンプトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.