NetworkManager-dispatcherでVPN接続中のresolv.confを書き換える

公開 | 更新 

VPN 接続時にDNSを指定しても、結局ローカルDNSとの併用になってしまうのを嫌い、VPN 接続時に NetworkManager – dispatcher で resolv.conf を直接 書き換え る方法を試してみました。

VPN接続中もDNSはローカルのまま

仕事場のUbuntu 18.04デスクトップをOpenConnectで自宅OpenWRTルータとVPNで繋ぎ、外向きを含むすべてのトラフィックはVPNトンネルを通すようにしていたはずでした。

ところが、VPN接続中はトンネルの向こうにあるDNSを指定しており、そのDNSサーバには広告ブロックを導入しているにも関わらず、ブロックされない広告が目に付くようになりました。

そこで /etc/resolv.conf を確認すると、既存のDNSにVPN接続プロファイルに設定したDNSが追加される形になっていて、その順序は接続毎にランダムに入れ替わります。

VPN接続中は既存のローカルDNSを削除して、VPN接続プロファイルに設定したDNSのみにするのが今回の命題です。

 

Ubuntuのresolv.confを巡る考察

レガシーな時代とは異なり、近年のLinuxでは /etc/resolve.conf はシステムが適宜書き換えてしまうので、直接編集は意味がない、というところまでは理解していました。

通常 resolve.conf は、実際には次のようなシンボリックリンクになっています。

その中に記述されている見慣れない 127.0.0.53 は、 systemd-resolved サービスのローカルDNSスタブリスナーと呼ばれるものらしく、それはさらに /run/systemd/resolve/resolv.conf を参照しており、ここに実際のDNSアドレスが定義されていました。

と、ここまでの流れをまとめると、次のようになっているということでしょう。

 

但しこのPCでは以前、 .local の名前解決ができないことから、このローカルDNSスタブリスナーを使わないよう、手を加えたことがありました。

具体的には、 /etc/resolv.conf のリンク先を直接 /run/systemd/resolve/resolv.conf にしてしまうもので、この状態でも systemd-resolved によってダイナミックに書き換わることに違いはありません。

詳しくはこちらの記事が参考になります。

ということで、今回編集するファイルは、 /run/systemd/resolve/resolv.conf ということになります。

 

NetworkManager Dispatcherサービス

ネットワークインターフェイスに関するイベントに応じて何かスクリプトを実行する手段としては、NetworkManager Dispatcherと言うサービスが用意されているそうです。

このサービスは常時稼働するのではなく、普段は待機状態にあります。

まずはリンク先のフォーラム回答に沿って、簡単なスクリプトを置いて変数や動作を確認してみます。

この状態で実際VPNを繋いだり切断したりすると、ログエントリが挙がりました。

図1.nm-dispatcherによるログエントリ

図1.nm-dispatcherによるログエントリ

これでインターフェイス名とイベント名が判明したので、VPN接続時にローカルDNSエントリを削除するスクリプトを書いてみます。

 

スクリプトの作成

NetworkManager Dispatcherのスクリプトは少し特徴的で、最初にまずスクリプトを実行させたい条件以外を全て振り落とします。

今回の場合、

  • イベントが up 以外は何もせず終了
  • インターフェイスが vpn* 以外は何もせず終了

でふるいにかけ、残った条件( vpn*up )に対して、

  • /etc/resolv.conf のリンク先パスを取得
  • sed でその中にあるローカルDNSエントリ行を削除

を実行する流れになります。

 

出来上がったスクリプトがこちら。

 

早速VPNを繋いでみると、期待通りVPNプロファイルに指定したDNSのみになりました。

VPN切断後は systemd-resolved が元に戻してくれるので、特に何もする必要はありませんでした。

 

なお、接続中どうしても現在の設定が常に気になってしまう場合、以下の要領で定期的にネームサーバの参照先をモニタリングすることができます。

 

created by Rinker
¥1,861 (2024/04/29 06:33:45時点 Amazon調べ-詳細)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA