それマグで!

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

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

macでwq-quick のDNS設定使うとDNS問い合わせがおかしくなる

mac で wireguardをコマンドから使うと・・・

wg-quick を使って設定からDNSを設定しているのですが、DNSがおかしくなるのです。

wireguard のコマンド wg-tools をhomebrew でインストールし、それを使ってWiregurard接続をした。

接続は問題なく稼働する。だが、接続切断後後にDNS設定が元に戻されない。

調査してみた。

up / down を繰り返して表示されるログを確認した。

wg-quick up wg0
wg-quick down wg0

接続に使った設定は次の通り。

[Interface]
PrivateKey = YE7mc**************
Address = 172.16.4.3
DNS= 192.168.1.1

[Peer]
PublicKey = Dgh8*********s=
EndPoint= mydns.example.com: 12345
PresharedKey= 9YnmaD4***********fPvY=
AllowedIPs = 0.0.0.0/0

wg-quick の設定に DNS を設定している。

接続コマンドの実行結果

上記設定で実行すると、接続とDNS設定はうまくいくのだが、、、、DNSの書き換えが乱暴

takuya@wireguard$ wg-quick up wg0
(略
[#] networksetup -setdnsservers Bluetooth PAN 192.168.2.1
[#] networksetup -setdnsservers Wi-Fi 192.168.2.1
[#] networksetup -setdnsservers USB 10/100/1000 LAN 192.168.2.1
[+] Backgrounding route monitor

すべてのネットワーク接続設定に対し、set DNSが発行されています。

この設定はあまりにも乱暴だと思うんです。

切断後も残る。

切断してみると。DNS設定を削除していないことがわかります。

takuya@wireguard$ wg-quick down wg0
Warning: `/usr/local/etc/wireguard/wg0.conf' is world accessible
[+] Interface for wg0 is utun2
[#] rm -f /var/run/wireguard/utun2.sock
[#] rm -f /var/run/wireguard/wg0.name

接続時にはDNSを設定して、切断後にはDNS設定を消してないんですね。

設定が残ってしまった。これを確認する。

本当に設定が残ってしまったのか、確認してみます。

IFS=$'\n'; for i in $( networksetup  -listallnetworkservices | \grep -v aster); do echo "networksetup -getdnsservers  $i";networksetup -getdnsservers  $i  ;done

networksetup -getdnsservers  Bluetooth PAN
192.168.1.1
networksetup -getdnsservers  Thunderbolt ブリッジ
192.168.1.1
networksetup -getdnsservers  PPPoE
192.168.1.1
networksetup -getdnsservers  mopera
192.168.1.1
networksetup -getdnsservers  USB 10/100/1000 LAN
192.168.1.1
networksetup -getdnsservers  iPhone USB 3
192.168.1.1

これは残ってますね。これではVPN(Wiregurard)を接続していないと何もできなくなります。というかWiregurardのPeer先をIPでなくホスト名(ドメイン名)で指定していると二度と接続できなくる。

未削除で残存するDNS

マジか。こりゃ大変だ。ローカルDNSを参照したら詰む。

これは wg-quick のバグですね。

設定を削除します。

これでは大変なので、設定を一旦リセットしました。

IFS=$'\n'; for i in $( networksetup  -listallnetworkservices | \grep -v aster);do ;networksetup -setdnsservers $i "Empty" ;done

wg0.conf からDNSの設定を削除します。

原因は、wg-quick の設定でDNSエントリでのネットワーク設定が、妙ちくりんなで、それを使ったためです。

ということは、DNS設定は、マニュアルで PostUp / PostDown で書くしかありません。

wg0.conf

[Interface]
PrivateKey = XXXXXXXYE7mc=
Address = 172.16.0.3
### !ここが今回のエラーの原因。
# DNS= 192.168.1.1

[Peer]
PublicKey = XXXXXXXXXXXjs=
EndPoint= mydns.example.com:12345
PresharedKey= XXXXXXXXXfPvY=
AllowedIPs = 0.0.0.0/0

PostUp/PostDownをDNSの代わりに使います。

networksetup  -listallnetworkservices | \grep -v as  |  xargs -d '\n' -n 1 echo networksetup -setdnsservers $i "Empty" 

私は、GNU Xargsを使っているので、 -d のデリミタオプションで解決している。しかし、BSDPOSIX xargs だともっと大変になるだろう

PostUp   = bash -sc 'networksetup  -listallnetworkservices | \grep -v as  |  /Users/takuya/.bin/xargs -d "\n" -n 1 -I@  networksetup -setdnsservers @ "192.168.1.1"'
PostDown = bash -sc 'networksetup  -listallnetworkservices | \grep -v as  |  /Users/takuya/.bin/xargs -d "\n" -n 1 -I@  networksetup -setdnsservers @ "Empty"'

wireguard のDNS設定は危ういですね。