管理者権限なしで使えるポータブル VPN クライアント:それでも壊れるもの
ポータブル VPN クライアントはインストーラーを省いても、トンネルデバイス、ルート、リゾルバへの書き込みが必要です。信頼する前にこれらの検査を実行してください。
ポータブルという言葉が表すのはインストーラーであり、カーネルではない。クライアントは USB メモリ上の単一の実行ファイルとして届いても、最初のパケットが動く前にトンネルデバイス、ルートテーブルのエントリ、リゾルバへの書き込みを必要とすることがある。対象マシンがこの三つのどれに触らせてくれるかが、そのビルドがそもそもそこで動くかどうかを決める。以下の検査は、クライアントが遭遇する順に問いに答える。
ポータブルは三つの異なる約束を覆い、無料なのは一つだけだ
インストーラーがないとは、ベンダーがサービスを登録せず、アンインストーラーを同梱せず、メニュー項目も追加していないという意味だ。管理者がいないとは、通常のアカウントでクライアントを起動し接続を完了できるという意味だ。ホストを変更しないとは、終了後にマシンが同じに見えるという意味だ。ポータブルと書くダウンロードページは通常そのうち最初の一つだけを約束し、残りの二つが配備の失敗する場所だ。ビルドは狭い意味でも、書き込み禁止のメディアからドットファイルの書き込みなしで動くという意味でポータブルでありうるが、ネットワークスタックについては何も語っていない。
高価な約束は二つ目と三つ目だ。アダプター、ルート、リゾルバへの書き込みを必要とする一つの実行ファイルは、ポータブルというラベルが決して覆わなかった権限をオペレーティングシステムに求めている。
クライアントが呼び出す特権ヘルパーを見つける
ほとんどどの VPN クライアントも自分でパケットを動かさない。Windows ではデータ経路が WFP フィルターと Base Filtering Engine を通り、macOS ではユーザーがシステム設定で承認する NetworkExtension プロバイダーを通り、Linux では tun デバイスとルーティングスタックを通る。コピーしたバイナリはこれらの部品の操作面であり、代替物ではない。クライアントがどの部品を期待するかを尋ね、それがインストールされ、動作し、あなたのアカウントで使えることを確認する。
Linux は、検査がシステムコール一つで済むため、この点を証明する最も簡単な場所だ。/dev/net/tun を開き、カーネルにデバイスを要求するには CAP_NET_ADMIN が必要であり、 カーネルの TUN/TAP ドキュメント は所有権の規則と機能の両方を示している。検査はクライアントを起動するアカウントで実行し、root では実行しない。
ls -l /dev/net/tun
ip tuntap add dev vpntest mode tun
ip link delete vpntest
真ん中の行の権限エラーこそ探していた答えだ:このアカウントはトンネルインターフェースを作れないので、それを必要とするユーザー空間のクライアントはダウンロード時ではなく接続時に失敗する。最後の行はテストデバイスを削除し、うまくいけば何も出力しない。両方の行が成功すれば、ホストには永続的な変更は残らない。
最初の接続の前にルートとリゾルバの変更を試す
分割トンネルは接続をルーティングの判断に変え、完全トンネルはそれをデフォルトルートの置き換えに変える。どちらもホストのネットワークスタックへの書き込みであり、クライアント自体がきれいに起動しても、特権のないアカウントではどちらも失敗する。リゾルバは三つ目の書き込みで、systemd のホストでは通常最後に壊れるものだ。昇格したインストールをどこに費やすかを決めるとき、この順序が重要になる。
ルートの検査には本当に気にかける宛先が必要なので、下のプレースホルダーを自分のプロファイルのサブネットに置き換える。ルートが何かに付くにはデバイス名が存在しなければならない。
ip route add 10.20.0.0/16 dev vpntest
ip route del 10.20.0.0/16
resolvectl query intranet.example.internal
最初の行が RTNETLINK answers: Operation not permitted を返すなら、そのアカウントはプロファイルが要求するプライベートルートをインストールできない。二番目の行は、ルートを追加できても削除できないクライアントが壊れたテーブルを残すという理由で、同じ権利を逆に証明する。その後のリゾルバの問い合わせは、プライベート名がトンネル経由で解決されるのか、ホストがすでに信頼しているリゾルバへ漏れるのかを示す。
テストデバイスがまだ存在するうちに三つとも実行し、その後で削除する。消えたデバイスを指すルートは、接続に失敗した後にノートパソコン が接続を失う最も一般的な理由だ。
セッションを生き延びるべきものを決める
フォルダーを削除することは後片付けの計画ではない。アダプター、ルート、リゾルバの設定、信頼された証明書、保存された資格情報はそれぞれプロセスより長く残りうるし、起動時のサービスが尋ねもせずに一部を復元することがある。最初の切断に失敗した後ではなく、実行する前に、クライアントが何を残してよいかを書き留める。
実用的な原則は、これから変更する三つの面のスナップショットを取り、後で比較することだ。最初の接続の前にインターフェース、メインのルーティングテーブル、リゾルバの状態を記録し、クライアントが終了したら同じ三つの読み取りを繰り返す。
ip -brief addr show
ip route show table main
resolvectl status
二回目の取得にあって一回目にないものには所有者が必要だ。クライアントが終了時に削除するか、作成したのと同じコマンドで自分で削除するかであり、その削除は何が起きたかについての誰かの記憶ではなく、配備のメモに属する。Windows では同等の読み取りは Get-NetAdapter、Get-NetRoute、Get-DnsClientServerAddress で、昇格は不要だが同じ残留物を示す。