それマグで!

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

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

wget が v6 でエラーになる→ wgetrc で解決

wget がエラーになる。

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

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

wgetrc で v4 へ固定する。

/etc/wgetrc

inet4_only = on

これで解決する.

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

ただし wget パッケージ依存

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

参考資料

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

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

dig がエラーを出した。

dig がエラーになってた

名前解決ができない。

dig: isc_nm_udpconnect: network unreachable

なんのエラーかと思って調べてたら、v6 で経路が見つからない。というv6ルーティングやv6アドレスのエラーだった。

無理やりv6を指定して、v4 ネームサーバーを指定すればいつでも再現できる。

root@Wrt:~# dig -6 t.co  @1.1.1.1
dig: isc_nm_udpconnect: network unreachable

つまり、壊れたフレッツv6網で出るわけですね。まいったね。

同じことを drill でやると・・・

$ drill -6 t.co @1.1.1.1
Error: error sending query: No (valid) nameservers defined in the resolver

drill のほうがメッセージが親切ですね。drill 使おうかな

wireguard で ip route default のデフォルトルートがおかしくなる。

wireguard で ip route がおかしくなる。

wiregaurd でwg0 を設定すると、 デフォルトルートが完全にwg0 に持っていかれる。

ip route でルーティングテーブルを確認し、 eth0 へデフォルト・ルートが向いているのにも関わらず、 ip route 1.1.1.1 してもwg0 へ向いてしまう。

とくに、クライアント側が AllowIPs で 0.0.0.0/0 を設定しているときに起きてしまう。

default を設定しているのに。

takuya@ubuntu01:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         Aw_Wrt.lan      0.0.0.0         UG    0      0        0 br0
172.16.3.0      0.0.0.0         255.255.255.0   U     0      0        0 wg0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 br0
192.168.2.223   0.0.0.0         255.255.255.255 UH    0      0        0 wg0
takuya@ubuntu01:~$ ip route
default via 192.168.1.1 dev br0
172.16.3.0/24 dev wg0 scope link
192.168.1.0/24 dev br0 proto kernel scope link src 192.168.1.240
192.168.2.223 dev wg0 scope link

経路は wg0 経由になっている。

takuya@ubuntu01:~$ ip route get 1.1.1.1
1.1.1.1 dev wg0 table 51820 src 172.16.3.2 uid 1000
    cache

tableを使っている。

wireguard の起動をよく見ていると route add 時に fwmarktableを使っている。

takuya@ubuntu01:~$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 172.16.3.2 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -4 route add 192.168.2.223/32 dev wg0
[#] ip -4 route add 172.16.3.0/24 dev wg0
[#] wg set wg0 fwmark 51820
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables-restore -n

table とは?

LinuxのPBR( policy base routeing ) 関連ですね。私達が ip routeで見ているのは、 main テーブルです。

入口が複数で、疎通可能な出口が複数あって、戻りパケットや転送を、いcずれから出すんだよ。みたいなときに使う設定だったと思う。

Table 設定=Off?

wg-quick でデフォルトは、Table=autoです。 rule テーブルは自動的に作成され、AllowIpSに記載された経路がmainより、高い優先度で作成されます。

Table — Controls the routing table to which routes are added.
              There are two special values: `off' disables the creation
              of routes altogether, and `auto' (the default) adds 
              routes to the default table and enables special handling 
              of default routes.

Table=auto のとき、

takuya@ubuntu01:~$ sudo wg-quick down wg0
takuya@ubuntu01:~$ sudo ip rule list
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

起動後にrule table が追加さたのがわかる。

takuya@ubuntu01:~$ sudo wg-quick up wg0
takuya@ubuntu01:~$ sudo ip rule list
0:      from all lookup local
32764:  from all lookup main suppress_prefixlength 0
32765:  not from all fwmark 0xca6c lookup 51820
32766:  from all lookup main
32767:  from all lookup default

wg-quick により、netfilterによるタグ付け(Fwmark) が有効になっている。

ここで main より先に、fwmark 0xca6c lookup 51820 にマッチするので wg0 が作成した 51820テーブルへパケットが流される。

なので、ip route で表示されないがパケットは wg0 へ流れるわけです。

一般ユーザーが、wg-quick 0.0.0.0/0許可設定するとき、default ルートを触らずにしておくなら Table=off でも構わないと思われる。

また、経路設定時に余計なことが起きないように tableへのデフォルトルートをいったん削除するということもあり。

sudo ip route del table 51820 default

テーブルIDは、ENDPointのポート番号になっているらしい。

https://unix.stackexchange.com/questions/607313/wireguard-routing