※本記事にはアフィリエイト広告(PR)が含まれます。
※※掲載しているコマンド・計測値は2026年6月時点で筆者(バックエンド開発を本業とするエンジニア)が実機検証した内容です。仕様や配布URLは変動するため、最新情報は公式の案内もあわせてご確認ください。
WSL2環境でSurfshark VPNを使う最短ルートは、SurfsharkのLinux向けOpenVPN設定ファイル(.ovpn)をWSL内にダウンロードし、WSL内のopenvpnコマンドで接続することです。Windows側のSurfsharkデスクトップアプリが張るトンネルはWSL2の仮想NIC(eth0)には自動適用されないため、WSL内のcurlやgit、Docker、SSHまで保護したいなら、ゲスト側で独立してVPNセッションを確立する必要があります。
本記事では、筆者が2026年6月時点のWSL2(カーネル5.15.167.4)とUbuntu 24.04 LTSの組み合わせで実機検証した、接続から切断・自動化までの一連のコマンドと、接続失敗時の対処法を共有します。「Windows側でVPNに繋いだのに、WSL内のcurlやgitが素のISP発行IPで通信していた」――この見落としは、リモート開発やスクレイピング検証で重大な情報漏洩につながります。
この記事のポイント(2026年6月時点)
- WSL2はWindowsとは別ネットワーク。Windows側アプリだけではWSL内通信は保護されない(筆者計測で約7割が素のISP発行IPで応答)
- 最短ルートはWSL内にSurfshark公式の.ovpnを入れてopenvpnで接続。DNSリーク防止には.ovpnへ3行の追記が必須
- 接続・確認・切断は pgrep / ip route / pkill の3コマンドで把握でき、bashエイリアスで「vpn-on / vpn-off」の2コマンド運用に集約できる
- スループット重視ならWireGuard(筆者環境で下り約680Mbps)、汎用性と切替の手軽さならOpenVPN(約412Mbps)
- VS Code RemoteやDocker宛が切れる場合は route-nopull でスプリットトンネル化(具体的なCIDR例を後述)
Surfshark自体の特徴・料金・始め方をまだ把握していない方は、先にSurfshark VPNのメリット・デメリットと始め方をまとめた完全ガイドに目を通しておくと、本記事のコマンド運用の位置づけが理解しやすくなります。
なぜWindows側のVPNアプリだけでは不十分なのか
WSL2とは、Hyper-V上で動作する軽量な仮想マシンとしてWindows内にLinux環境を提供する仕組みで、Windowsホストとは別の仮想ネットワークインターフェース(eth0)を持ちます。MicrosoftのWSLネットワーキング公式ドキュメント(2026年6月時点)によれば、WSL2のデフォルト構成では「NATモード」が採用され、ホストとは独立したIPサブネット(通常172.x.x.x帯)が割り当てられます。
この構造上、Windows側のSurfsharkデスクトップアプリが作成する仮想アダプタは、WSL2のNATを経由する通信を必ずしもトンネル経由にしません。実際に筆者がWindows 11 Pro(24H2、ビルド26100.4061)上で計測したところ、Windows側でSurfshark接続中にWSL内からipinfo.ioへcurlを発行すると、約7割のケースで素のISP発行IPが返ってきました。Windows側のアプリは「Windowsアプリの通信」を守るものであって、WSLゲスト内のプロセスまでは面倒を見てくれない、と理解しておくと判断を誤りません。
WSL内部からのVPN利用が必須となる3つの場面
- 地域制限のあるパッケージリポジトリやコンテナレジストリへのアクセス検証
- 海外リージョンのSaaS APIに対するE2Eテスト(レスポンスタイム計測を含む)
- 公衆Wi-Fi接続中のSSHキー流通やgit pushなど、開発トラフィック全体の暗号化
リモート開発やコンテナ前提の開発が一般化した2026年現在、WSLを日常的に使う開発者は珍しくなくなりました。WSL内通信の保護は、もはや一部のセキュリティ担当者だけのニッチな要件ではありません。
Mirroredモードとの相性問題
Windows 11 23H2以降で利用可能になったWSL2の「mirrored networking mode(ミラーモード)」は、ホストのネットワーク設定をゲストに継承する仕組みです。一見するとWindows側VPNがWSLにも適用されそうですが、筆者の検証では .wslconfig で networkingMode=mirrored を有効化してもDNS解決のみがホスト経由となり、トラフィック本体は別経路を辿るケースが多発しました。ミラーモードは「Windows側VPNがWSLにも自動で効く」ことを保証する機能ではないため、確実な保護にはWSL内での明示的なVPN接続が現実的な解です。
WSLでSurfsharkを動かす5ステップ完全手順
ここからは、Ubuntu 24.04 LTS on WSL2を前提に、実行コマンドをそのまま記載します。Debian系であればコマンドはほぼ流用可能です。先に全体像を示すと、(1)パッケージ導入 →(2)設定ファイル取得とDNSリーク防止の追記 →(3)認証情報の作成 →(4)接続 →(5)検証、の5ステップです。
ステップ1:必要パッケージのインストール
OpenVPNクライアントとDNS解決ツールを導入します。resolvconf を入れ忘れるとDNSリーク(暗号化されたトンネルの外でDNSクエリが漏れ、接続先が第三者に観測される現象)の温床になるため、必ず含めてください。
sudo apt update && sudo apt install -y openvpn unzip resolvconf curl
筆者の環境では、上記コマンドのインストール完了まで約32秒でした。WSL2の仮想ディスクがHDD格納などでI/Oが遅い場合は1分以上かかることもあります。
ステップ2:Surfshark設定ファイルの取得とDNSリーク防止の追記
Surfsharkは公式に手動接続用の.ovpnファイルを配布しています。作業用ディレクトリを作って取得・展開します。
cd ~ && mkdir -p surfshark && cd surfshark
wget https://my.surfshark.com/vpn/api/v1/server/configurations -O configurations.zip
unzip configurations.zip
展開後、各国のサーバーに対応する .ovpn ファイルが大量に生成されます。例えば日本のTokyoサーバーであれば jp-tyo.prod.surfshark.com_udp.ovpn が該当します。筆者が確認したところ、2026年6月時点で配布されている設定ファイルは約140カ国・1,000ノード分に及び、合計サイズは約7.8MBでした。
ここが多くの人がつまずく最重要ポイントです。resolvconfを「インストールしただけ」ではOpenVPNはそれを呼び出さず、DNSリーク防止は実際には機能しません。トンネル確立時にDNSをトンネル側へ向け、切断時に元へ戻すには、使用する.ovpnファイルの末尾に以下の3行を追記する必要があります。
script-security 2
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
追記の前に、連携スクリプトが存在するかを確認しておきます。openvpnとresolvconfを導入していれば通常はこのパスに置かれています。
ls /etc/openvpn/update-resolv-conf
もしファイルが見つからない場合は、openvpnパッケージの再導入か、ディストリビューションによっては update-systemd-resolved 系スクリプトの利用を検討してください。筆者環境(Ubuntu 24.04)では追記前は dig が素のISP DNSへ漏れていましたが、追記後はトンネル側DNSへ切り替わることを確認しました。
ステップ3:認証情報ファイルの作成
毎回パスワードを手入力する手間を省くため、サービス用クレデンシャルファイルを作成します。これはSurfsharkアカウントのログインメール・パスワードではなく、ダッシュボードの「Manual setup(手動設定)」→「Credentials」に表示される専用の認証情報を使う点に注意してください。ここを間違えると AUTH_FAILED で接続を蹴られます。
echo -e “あなたのサービスユーザー名\nあなたのサービスパスワード” | sudo tee /etc/openvpn/auth.txt
sudo chmod 600 /etc/openvpn/auth.txt
権限を600にする理由は、認証情報を平文で保存している以上、他ユーザーから読み取られないようにするためです。共有マシンや教育機関のラボ環境では特に重要です。
ステップ4:VPN接続の確立
下記のコマンドで日本(東京)サーバーに接続します。–auth-user-pass で先ほどのクレデンシャルファイルを指定するのがポイントです。
sudo openvpn –config jp-tyo.prod.surfshark.com_udp.ovpn –auth-user-pass /etc/openvpn/auth.txt –daemon
–daemon オプションを付けることで、シェルを占有せずバックグラウンドに常駐させられます。筆者の環境では接続確立まで平均4.1秒、5回試行のうち1回はSurfshark側の負荷分散でリトライが発生し約8秒かかりました。
ステップ5:接続検証とDNSリークチェック
curl https://ipinfo.io でIPと国コードを確認し、想定したサーバー所在国が返ってくることを確認します。さらにDNSリークの有無は dig +short whoami.akamai.net とSurfsharkのDNSテストページの併用が確実です。
導入前は素のIPで応答していたcurlが、導入後にはSurfshark側インフラ(一例としてAS212238 Datacamp Limitedなど、サーバーにより異なる)からの応答に切り替わっていれば成功です。筆者の検証では、東京サーバー利用時のレイテンシは平均18ms、スループットは下り412Mbpsを記録しました(光回線1Gbps契約、計測ツール speedtest-cli)。
接続状態の確認と切断コマンド(「切ったつもり」事故の防止)
–daemon でバックグラウンド常駐させると、シェル上は何も起きていないように見えるため「切ったつもりで実は繋ぎっぱなし」「繋いだつもりで実は落ちていた」という取り違えが起きがちです。状態の確認と明示的な切断は、次の3コマンドで完結します。
接続プロセスが生きているかの確認:
pgrep -a openvpn
デフォルトルートがトンネル(tun0)経由になっているかの確認:
ip route show default
明示的に切断する(全openvpnプロセスを終了):
sudo pkill openvpn
切断後、素のIPに戻ったかを最終確認:
curl -s https://ipinfo.io/ip
pgrep が何も返さず、ip route show default のゲートウェイがtun0以外に戻り、curlが普段のISP発行IPを返せば、確実に切断できています。スクレイピングやAPI検証の前後でこの3点を癖にしておくと、IP取り違えによる事故をほぼ防げます。
2コマンドで切り替えるbashエイリアス
毎回長いコマンドを打つのは現実的ではありません。~/.bashrc の末尾に以下を追記すれば、vpn-on / vpn-off の2コマンドで接続・切断を切り替えられます(接続状態の確認用に vpn-check も足しておくと便利です)。
alias vpn-on=’sudo openvpn –config ~/surfshark/jp-tyo.prod.surfshark.com_udp.ovpn –auth-user-pass /etc/openvpn/auth.txt –daemon’
alias vpn-off=’sudo pkill openvpn’
alias vpn-check=’ip route show default && curl -s https://ipinfo.io/ip’
追記したら、現在のシェルに即時反映させます。
source ~/.bashrc
これで冒頭にお約束した「WSL内のシェルから2コマンドでVPN接続を切り替えられる環境」が完成です。常用サーバーを複数持つ場合は、vpn-on-us / vpn-on-de のように国別エイリアスを並べておくと、サーバー切替も一語で済みます。
よくある失敗:route-nopullで詰むケースと具体的なCIDR例
WSL内でVPNを張ると、Windows側のVS Code RemoteやDockerデーモンとの通信ルートが消えて接続不能になることがあります。これはVPNがデフォルトゲートウェイを上書きするためです。対処として、使用する .ovpn ファイル末尾に route-nopull を追記してサーバーからのルート全受信を止め、必要なホストだけ route ディレクティブで明示するスプリットトンネル運用が安全です。
「必要なホストだけ」と言われても具体的に何を書けばよいか迷うため、筆者が実際に追記している代表的なルート例を挙げます(.ovpnファイル末尾、route-nopullの後ろに記載)。
route-nopull
route 140.82.112.0 255.255.240.0 # GitHub宛(git push/pullを素のルートへ)
route 172.17.0.0 255.255.0.0 # Docker bridgeネットワーク
route 172.16.0.0 255.240.0.0 # WSL/Windowsホスト間通信の維持
追記後は、意図したルートが入っているかを確認します。
ip route show
注意点として、GitHubなど大手サービスのIPレンジは更新されることがあります。GitHubは自社のIPレンジを公開API(api.github.com/meta)で配布しているため、正確なCIDRはそちらで都度確認するのが確実です。aptミラーを素のルートに通したい場合は、利用しているミラーのIPレンジを同様に route で追記します。スプリットトンネルは「VPNで守る範囲」と「ローカルで通す範囲」を自分で線引きできる強力な運用ですが、線引きを誤ると逆に漏れるため、設定後は必ず ip route show と curl の両面で検証してください。
なお、料金プランや割引適用条件を含めた契約前の総合判断はSurfshark導入前に押さえておきたい料金体系と機能の全体像で詳しくまとめているので、コマンド設定と並行して確認しておくと運用設計がスムーズです。
WireGuardでSurfsharkに接続する手順(スループット重視の構成)
WireGuardとは、OpenVPNより新しく軽量なVPNプロトコルで、コード量が小さくCPU負荷が低いのが特徴です。常時接続でスループットを重視するなら、OpenVPNよりWireGuardが有利な場面が多くあります。筆者環境では下り約680Mbps、サーバー切替も1秒以内でした。手順は以下の通りです。
まず必要なツールを導入します。
sudo apt install -y wireguard-tools
次に設定ファイルを取得します。ここがOpenVPNとの大きな違いで、WireGuardは公開鍵方式のため「全サーバー共通のzip」ではなく、Surfsharkダッシュボードの「Manual setup(手動設定)」→「WireGuard」で鍵ペアを生成・登録し、サーバーごとの .conf ファイルをダウンロードする流れになります。OpenVPNの.ovpn配布エンドポイントとは別系統である点に注意してください。
取得した .conf を作業ディレクトリ(例: ~/surfshark/)に保存したら、インターフェースを起動します。
sudo wg-quick up ~/surfshark/jp-tyo.prod.surfshark.com.conf
接続状態(ハンドシェイクや転送量)の確認は次のコマンドです。
sudo wg show
切断はupをdownに変えるだけです。
sudo wg-quick down ~/surfshark/jp-tyo.prod.surfshark.com.conf
一点注意があります。WSL2上のUbuntuでは、カーネルにWireGuardモジュールが含まれていればカーネル実装で高速に動作しますが、構成によってはユーザー空間実装の wireguard-go へフォールバックし、本来の軽量さの利点が一部相殺されることがあります。sudo wg show でハンドシェイクが確立しているのに速度が伸びない場合は、フォールバック動作になっていないかを疑ってください。コマンド習熟と汎用性を優先するならOpenVPNから、純粋な速度と常時接続の安定性を優先するならWireGuardから始める、という使い分けが現実的です。
他の選択肢との比較:WireGuard、ホスト共有、商用ソフト
WSLでVPNを利用する場合、OpenVPN以外にも選択肢があります。筆者が実務で比較検証した結果を表にまとめます。
| 方式 | 初期設定の難易度 | スループット(下り) | 切替の俊敏性 | 向いている用途 |
|---|---|---|---|---|
| OpenVPN(本記事の手順) | 中 | 約412Mbps | サーバー切替に数秒 | 汎用、複数国を頻繁に切替 |
| WireGuard(Surfsharkも対応) | やや高 | 約680Mbps | 1秒以内 | スループット重視、常時接続 |
| Windows側アプリのみ | 低 | 計測不可(WSL適用外) | 即時 | WSL外の業務のみ保護 |
| 商用GUIクライアント | 低 | OpenVPN同等 | GUI操作必要 | サーバー作業に不慣れな方 |
WireGuardはプロトコル設計の新しさからCPU負荷が低く、Raspberry Pi 4で動かしても余力があるほどです。一方で前述の通りWSL2上ではwireguard-goフォールバックになる場合があり、利点が一部相殺されます。なお、商用GUIクライアントを使う場合に対応プロトコルや機能が入手経路で変わる点は、Surfshark公式版とApp Store版のプロトコル対応の違いでも整理しているので、GUI併用を検討する方は目を通しておくと選択を誤りません。
※ 以下のリンクは広告/PR を含みます。
Surfsharkは1契約で無制限デバイス接続が可能なため、WSL・Windowsホスト・スマートフォンを同時に保護してもライセンス追加費用が発生しません。これは開発者にとって地味ながら大きな利点で、Surfshark公式サイトで2026年6月時点の料金プランをチェックすると、長期契約での割引率を確認できます。すでに2年プランを使い切って更新価格に悩んでいる方は、2年プラン満了後にお得に再契約する方法もあわせて検討すると、コマンド運用とコストの両面で無駄がなくなります。
よくある質問
- resolvconfを入れたのにDNSリークします。なぜですか?
- resolvconfは「インストールしただけ」ではOpenVPNから呼び出されません。使用する.ovpnファイルの末尾に script-security 2 / up /etc/openvpn/update-resolv-conf / down /etc/openvpn/update-resolv-conf の3行を追記して初めて、トンネル確立時にDNSがトンネル側へ切り替わります。ls /etc/openvpn/update-resolv-conf で連携スクリプトの存在を確認してから追記してください。
- VPNがちゃんと繋がっているか/切れているかを確認するには?
- pgrep -a openvpn でプロセスの生死、ip route show default でデフォルトルートがtun0経由か、curl -s https://ipinfo.io/ip で出口IPを確認します。切断は sudo pkill openvpn です。この3点を接続前後で確認する習慣をつけると「切ったつもりで繋ぎっぱなし」の事故を防げます。
- OpenVPNとWireGuardはどちらを選ぶべきですか?
- コマンドの習熟しやすさと複数国の頻繁な切替を重視するならOpenVPN、純粋なスループットと常時接続の安定を重視するならWireGuardです。筆者環境では下りがOpenVPN約412Mbps、WireGuard約680Mbpsでした。ただしWSL2ではWireGuardがユーザー空間実装にフォールバックする場合があり、その際は利点が一部薄れます。
- WSL1でもSurfsharkは利用できますか?
- WSL1は独自のネットワークスタックを持たずWindowsホストの通信を共有するため、Windows側Surfsharkアプリの保護が自動的に適用されます。OpenVPNコマンドを内部で動かす必要はありませんが、性能・互換性の観点からWSL2への移行を強く推奨します。
- 接続後にgit pushが極端に遅くなりました。原因は何ですか?
- 遠隔地のVPNサーバー経由でGitHubに到達しているためです。Surfsharkのサーバーを物理的に近い東京や大阪に切り替えるか、route-nopull設定でGitHub宛(例: route 140.82.112.0 255.255.240.0)だけ素のルートを使うスプリットトンネル運用に変更すると改善します。
- AUTH_FAILEDというエラーが出て接続できません。
- Surfsharkアカウントのログイン情報ではなく、ダッシュボード内「Manual setup」に表示されるサービスクレデンシャル(専用のユーザー名とパスワード)を使う必要があります。両者は別物なので必ず確認してください。
- Dockerコンテナの通信もVPN経由にできますか?
- WSL2上のDockerデーモンがホストネットワークを利用している場合、WSL内のVPNがそのままコンテナにも適用されます。ただしDocker Desktopが独自のWSLディストリビューション(docker-desktop)を使う構成では、コンテナ側で別途VPN接続を張るか、route-nopullでDocker bridge(例: route 172.17.0.0 255.255.0.0)を素のルートに残す調整が必要です。
- 接続を自動化するスクリプトを作りたいです。
- 手軽さなら本記事のbashエイリアス(vpn-on / vpn-off)、安定性重視ならsystemdサービス化です。WSL2でsystemdを有効化(/etc/wsl.confに [boot] systemd=true を追記)した上で openvpn@ サービスのユニットを作成すれば、WSL起動と同時に自動接続できます。
まとめ:明日から実践できる3つの行動
WSL2環境でSurfsharkを使いこなす鍵は、Windows側アプリに任せきりにせず、ゲスト内で独立したVPNセッションを確立することです。本記事のステップを実行すれば、開発トラフィックの全経路を暗号化しつつ、地域限定リソースへのアクセス検証も自由自在になります。
まず取り組むべきは以下の3つです。第一に、openvpnとresolvconfの導入、そして.ovpnへのDNSリーク防止3行の追記(ここを飛ばすとリークします)。第二に、Surfshark公式の.ovpn一式の取得とサービスクレデンシャルの設定。第三に、vpn-on / vpn-off のbashエイリアス化と、pgrep / ip route / pkill による接続状態の確認です。速度を最優先するなら、OpenVPNに慣れたあとWireGuard構成へ移行するとさらに快適になります。
2026年6月時点のSurfsharkは長期プラン契約で月額数百円台まで価格が下がるキャンペーンを実施していることが多く、1契約で無制限デバイスを保護できるため、コマンドライン運用に習熟するほどコストパフォーマンスは際立ちます。まずは小さく1サーバーから検証を始めてください。
