カーネルオプションで起動されたLinux(Ubuntu Groovy)サーバーがあるため、ipv6.disable=1
IPv6を使用できません。
また、IPv4専用システムで動作すると主張するいくつかのデュアルスタックソフトウェアがありますが、それを変更することはできません。今ソフトウェアはにバインドしようとします::
が、当然失敗します。このサーバーをIPv4にバインドして使用するようにオペレーティングシステムを何らかの方法で設定できますか0.0.0.0
?
編集:またはバインディングの前、名前解決中にこれを実行できますか?ソフトウェアは解析を試み::
、応答としてIPv4アドレスを取得した場合は127.0.0.1
IPv4を使用すると仮定します。
答え1
可能であっても、あなたが求めるものはうまくいきません。ソフトウェアが::にバインドされている場合、アドレスがIPv6形式で表示されると仮定できます。許可されるソケットはIPv6で、IPv4アドレスはカプセル化されます。
したがって、192.168.1.1 は::FFFF:192.168.1.1 になります。
つまり、どういうわけか別のIPにバインドできるとしても、それをIPv4ソケットに設定し、ソフトウェアはそれを処理するようにコンパイルされません。ソフトウェアではIPv6ソケットが必要ですが、IPv6が無効になっているため、これを行うことはできません。
IPv6を無効にすると、互換性コードはありません。結論は、IPv6が無効になっていて、使用しているソフトウェアでそれを有効にする必要があることです。
ここで唯一のオプションは、IPv6を有効にするか(なぜ無効にする必要があるのか質問からはわかりません)、ソースから直接IPv6ソフトウェアを再コンパイルし、問題を「修正」するためにソースコードをパッチすることです。
答え2
あなたができることは妥協することです。 IPv6を有効にしますが、どこでも効果的に使用できるようにしないでください。
起動時にIPv6を有効にしますが、sysctl -w ...
次のパラメータを使用するか、またはこれらのパラメータを追加して/etc/sysctl.conf
将来のおよび現在のインターフェイスで無効にします/etc/sysctl.d
。
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6=1
このように、IPv6の使用は効果的に無効になりますが、IPv6ソケットAPIは有効なままです。したがって、アプリケーションはまだデュアルスタックモードにバインドでき::
、IPv4もそれに関連付けることができます(デフォルトは次のとおりです)。RFC 3493)。
::1に関する例外と質問を検討することができます。ルオ設定とアプリケーションの動作によって異なります。いくつかの選択肢から:
/etc/hosts
以下の項目から削除してください。::1 localhost ip6-localhost ip6-loopback
または、IPv6を無効にしないでください。ルオ(以前の設定以降)私達は::1を得ます:
net.ipv6.conf.lo.disable_ipv6=0
エントリを予約するには
/etc/hosts
、::1 より 127.0.0.1 優先順位を付与するか、次を追加して IPv6 より IPv4 優先順位を付与することをお勧めします/etc/gai.conf
。precedence ::ffff:127.0.0.1/128 100
または:
precedence ::ffff:0:0/96 100
注:一部のネットワーク設定ツール(NetworkManagerなど)はトグルをdisable_ipv6
独自の設定にリセットするため、設定されたインターフェイスでIPv6を無効にするように明示的に設定する必要があります。
回避策:これが受け入れにくい場合は、IPv6を無効にする代替手段があります(CONFIG_IP_ADVANCED_ROUTER
すべての主要な展開カーネルは。
交換による IPv6 ルーティング ルールがルーティング テーブルを使用しないようにする好み0ルールとブラックホールIPv6 ルート ルックアップが失敗するルール (デフォルト設定 32766 を含むすべてのルールを削除してNetwork is unreachable
代わりに取得できますInvalid argument
):
ip -6 rule delete preference 0
ip -6 rule add preference 0 blackhole
インターフェイスに他の設定がない場合でも:
$ ping ::1
ping: connect: Invalid argument
ping ff05::2
ping: connect: Invalid argument
IPv6の受信はまだ成功していますが(RFCに応じてデフォルトでデュアルスタックに設定されています):
$ socat tcp6-listen:4242 /dev/null &
[1] 430541
$ ss -tnle sport == 4242
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 *:4242 *:* uid:1000 ino:5971821 sk:1106 v6only:0 <->
IPv4ルーティングがブロックされないため、デュアルスタックモードでもIPv4トラフィックを引き続き受信できます。