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
のデリミタオプションで解決している。しかし、BSDな POSIX 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設定は危ういですね。