web-dev-qa-db-ja.com

ZypperがIPv6を使用しようとするのを防ぎます

OpenSUSE13.1でボックスを設定しています。私の理解を超えた理由で、ZypperはIPv6アドレスの使用を完全に主張し、IPv4の使用を拒否します。 IPv6はLAN上で機能しないため、これは問題です。

IPv6を複数の方法で無効にしてみました。

  • YaSTにIPv6を無効にするように指示しました。
  • /etc/modprobeを突っついたり突っ込んだりしてみました。
  • カーネルブートパラメータとしてipv6.disable=1を設定してみました。

これらのことのどれもわずかな影響を及ぼしませんでした。 Zypperstillは、実際のIPアドレスの使用を拒否し、絶望的にIPv6を使用しようとし続けます。

ダウンロードサーバーに正常にpingできることに注意してください。 pingコマンドはサーバーのIPv4アドレスを検索し、問題なくpingを実行します。それでも、ZypperはIPv6の使用を主張し、宛先に到達できないために諦めます。 (これは、IPv6経由です。)

この質問 で説明されている正確な問題が発生しています。 (失敗したIPv6アドレスも同じです。)その質問はOpenSUSEの古いリリースに対応しており、受け入れられた回答は、私がすでに試したIPv6を無効にすることを示しています。

私は今、いくつかのソフトウェアパッケージをインストールするという些細なタスクを実行しようとして、人生の何時間も無駄にしています。 誰かは、IPv6を完全に破壊してネットワークを再び機能させる方法を知っていますか?

1

カーネルの観点からは、IPv6をザッピングするために正しいことを行ったようですが、IPv6を気にしないと仮定して、/ etc/hosts内のIPv6エントリを削除することもできます。それでもうまくいかない場合(そしてこれが戻ってきている場合)、Amandaバックアップで問題が発生しました。これはあなたの問題と非常によく似ており、inetutils-inetdの代わりにxinetdをインストールすることによってのみ修正できました(注SuSEがデフォルトで何をインストールするのかわかりません)。最後に(そして必死の手段として)次のようなもので「strace」を使用することをお勧めします:strace -s 1024 -f -o /tmp/zypper.log/path/to/zypperexecutable次に、ログファイルを調べてそのIPv6を探しますアドレスを指定し、役立つ可能性のある有益な情報があるかどうかを確認します。 (参考までに、「strace」は巨大なファイルを生成する可能性があるため、失敗したらすぐにzypperを中止することをお勧めします。)

2
ravenpi

user995746の提案に従って、straceを実行してみました。これがそれが言わなければならないことです:

...
1179  socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 5
1179  connect(5, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "2001:67c:2178:8::13", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = -1 ENETUNREACH (Network is unreachable)
1179  close(5)                          = 0
1179  madvise(0x7ff48750c000, 8368128, MADV_DONTNEED) = 0
1179  _exit(0)                          = ?
1179  +++ exited with 0 +++
1177  <... poll resumed> )              = 0 (Timeout)
1177  socket(PF_INET, SOCK_STREAM|SOCK_CLOEXEC, IPPROTO_TCP) = 5
1177  fcntl(5, F_GETFL)                 = 0x2 (flags O_RDWR)
1177  fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0
1177  connect(5, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("195.135.221.134")}, 16) = -1 EINPROGRESS (Operation now in progress)
1177  poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT}], 1, 1000) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT}], 1, 1000) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT}], 1, 1000) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT}], 1, 1000) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT}], 1, 1000) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT}], 1, 1000) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT|POLLWRNORM}], 1, 0) = 0 (Timeout)
1177  poll([{fd=5, events=POLLOUT}], 1, 1000) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
1177  --- SIGINT {si_signo=SIGINT, si_code=SI_KERNEL} ---
...

したがって、Zypperからのエラーメッセージに「2001:67c:2178:8 :: 13に接続できませんでした:ネットワークに到達できません」と明確に記載されているにもかかわらず、プログラムは実際にはそれを確認しているようです。 IPv6に到達できず、IPv4にフォールバックします。なぜIPv4経由で接続できないのかという疑問が残ります。これは、おそらくLANのファイアウォールの問題のようなものです。

要約すると、IPv6はまったく問題ではないようです。それは、Zypperからのエラーメッセージが非常に誤解を招くだけであるということです。

0

Download.opensuse.org(または使用したいd/lサーバー)を解決し、そのIPv4アドレスを.repoファイルにフィードすることで解決しました。私はsed(1)を使用して、そこにあるすべてのものを検索して置き換えました。魅力のように働いた。

確かに完璧ではありません。そして、動作中の(!)v4接続にフォールバックできないことは...恒星よりも少ないです。他のデュアルスタック対応アプリケーションは、ルーティングされないローカルv6ネットワークがある場合、たとえばdownload.opensuse.orgに完全にアクセスできる(そしてできる)ことを気にしないでください(ISP氏が一緒にプレイしないため、例)。

それまでは、(数値の)IPv4アドレスを使用してください。

注:zypperはlibcurlを使用しますが、$HOME/.curlrcを尊重しません。多分それはグローバルなcurl設定ファイルまたは環境変数を尊重するでしょう。 curl自体は、-4/--ipv4がipv4を強制することを望んでいます。

また、ipv6をサポートせずにlibcurl自体を再コンパイルし、ld.so.confなどを介してそこにzypperポイントを設定すると、期待どおりに機能するはずです。

0
Ralph