LoginSignup
5
5

More than 1 year has passed since last update.

Windows側で接続したVPN先のサーバーにWSL2からも接続できるようにする

Last updated at Posted at 2021-12-03

Windows側で接続したVPN先のサーバーにWSL2からはどうやっても接続できなかったので回避方法を考えた。

  • 「WindowsでVPNを貼るとWSL2が インターネットに出られない 」という症状は各所でむっちゃいっぱい報告されているが、 今回問題なのは接続したVPNの先にあるイントラサーバーに接続できない 、というもの。自分の場合はWSL2もインターネットには出られたので、ただのapt installなどは普通に動いた。
    • 当該serverにpingしたりするとIPアドレスは取れているので、名前解決の問題ではない。tracerouteは途中で帰ってこない。
  • WSL2直下だとVPN先に接続できないが、Docker Desktop for Windowsを使っていたときは作ったコンテナの中からなら到達できた。 Windows側から何かしらネットワークに関してケアが入っていると思われるが、詳しくは分かっていない。今回はDocker Desktop for Windowsへの依存をやめようと思ったのがきっかけ。

うまく行った方法

windowsをプロキシとして使う。opensshサーバーを立ててProxyCommandで多段sshする。

windows側作業

  • opwnsshのserverをインストールする
  • windowsのopensshを公開鍵認証にしてパスワード不要にする
    • https://qiita.com/syoyo/items/780c3a2206c99a7568ac
    • 当該ディレクトリにExplorerからファイルを書き込めなかったので、適当なフォルダで同名のファイルを作ってから移動して設置
    • ちなみに単にssh-copy-idするだけではうまく行かなかった (多分ファイルのパーミッションのせいだが、コンソールが文字化けしてエラー内容がわからず)
  • 多段sshにするconfigを書く: ProxyCommandを使って最終的な接続先へのsshコマンドの際に中継のWindowsを自動で通すようにする

    • 方法1 windowsマシンのIPアドレスをハードコードして2つエントリーを書く。シンプルだが、WSL2から見たときにWindowsホストのipアドレスが再起動のたびに変わるので、~/.ssh/configを都度書き換えるような必要が発生する。
    Host windows
        HostName 172.12.34.1 # 再起動のたびに変わる
        User username_on_windows
    
    Host target-server
        HostName your.target.server.co.jp
        User username_on_target
        Port 22
        ProxyCommand ssh -W %h:%p windows
    
    • 方法2 WSLからWindows機のIPアドレスを調べる方法 (その1, その2) を用いて一行で書く。
    Host target-server
        HostName your.target.server.co.jp
        User username_on_target
        Port 22
        # WSL直ならこちらでもOK
        # ProxyCommand ssh -W %h:%p username_on_windows@$(ip route | grep 'default via' | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
        # WSL直でも、さらにdockerコンテナの中に入っても使えた↓
        ProxyCommand ssh -W %h:%p username_on_windows@$(cat /etc/resolv.conf | grep 'nameserver' | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')
    

http/httpsも通せるようにする

たまたま自分は不要だったので試してないが、以下のどちらかの方法で到達できると思われる。

  • ssh -Lを用いた静的ポートフォワーディング。接続先が数個だけで、URLが変わっても特に困らないケースなら
  • windowsにsquidもインストールし、各ツールからhttps_proxy等の環境変数を設定して使う。

以下、うまく行かなかった方法

WSLが直接VPN接続する

  • 使っていたVPNクライアントはpulse secureだったので、同じ方式に対応しているlinuxクライアントがあればWSL2側が自力でVPN接続できるのでは?と思ったがうまくいかなかった

多段sshの代わりにsocksプロキシを使う

  • 多段sshやsquidの代わりにssh -D 1080 windowstsocksによってsocksプロキシ経由でVPN先につなげればどのプロトコルも1つの方法で接続できて便利と思ったが、うまく行かなかった。tsocks curlやtsocks wgetを試しても通常と変化がなかった。
  • tsocksではなくcurlのオプションで動かすのも試すべきだったがやってない: https://gihyo.jp/admin/serial/01/ubuntu-recipe/0617?page=2
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5