それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

wget (uclient-fetch)が ipv6 でエラーになる→ wgetrc でv4に限定して解決

wget がエラーになる。

wget が名前解決エラーになる場合、ipv6 アドレスへ接続に行き、接続失敗することがある。

wgetrc を設定ファイルに書いてもユーザーごとになってしまうので、システムグローバルに適用する wgetrcファイル に設定を掛けば、自動実行のプロセスやフォークした先でも大丈夫。 openwrt で wget を使っているので opkg update が失敗する。v6アドレス怖い。

/bin/uclient-fetch の場合も同じ

uclient-fetchが内部的に使われてるバージョンがあるので、uclient-fetch を wget に入れ替える必要がある。

mv /bin/uclient-fetch /bin/uclient-fetch.orig
ln -s /usr/bin/wget  /bin/uclient-fetch

openwrt は busyboxwget から独自仕様のuclient-fetchに変わって行くようです。

ただ、wget に切り替えると、単純なuclient-fetchとちがいSSLを厳密にチェックするので、エラーが出る可能性がある。 そこでwgetrc に以下を追加する。

/etc/wgetrc

inet4_only = on
check-certificate = no

wgetrc で v4 へ固定する。

解決策は2つ

wget 引数

wget -4 https://example.com
## または
alias wget='wget -4 '

ただし、スクリプトから/bin/wgetが呼ばれる場合は対応できない。

/etc/wgetrc

inet4_only = on

これで解決する。ipv6 の名前解決をとめてもいいし、alias でもいいし、wgetrcでもいい。wgetrc が個人的には影響範囲が少なくてファイルを指定するのが楽な手法だと思う。

ほんと、フレッツのv6ってやつは面倒を引き起こす。

ただし wget パッケージ依存

wgetbusybox 提供のミニマム版だとwegetrc を読み込んでくれないので フルパッケージをインストールする必要があった。

wgetgnu wget に切り替える必要があった

opkg install wget 
echo inet4_only = on > /etc/wgetrc

それでも解決しない場合。

外部スクリプトから直接呼ばれる場合など、wget を移動させて強引に解決する。

/usr/bin/wget/usr/bin/wget.back -4 を呼ぶように改造

mv /usr/bin/wget /usr/bin/wget.bak
touch /usr/bin/wget
chmod +x /usr/bin/wget
cat <<EOF > /usr/bin/wget
#!/bin/sh
## 2021-12-02 ntt v6
/usr/bin/wget.bak -4  "\$@"
EOF

もとに戻す。

mv /usr/bin/wget.bak /usr/bin/wget

2021-12-02

強引に解決する方法を追記。

2023-10-16

追記

2024-08-10

uclient-fetch に付いて追加

参考資料

https://www.gnu.org/software/wget/manual/html_node/Wgetrc-Location.html

https://www.gnu.org/software/wget/manual/wget.html

wget: Installing package breaks opkg due to default IPv6 preference · Issue #11814 · openwrt/packages · GitHub