😽

WSLからAWSへ接続したAWS VPN接続を経由して、WindowsからAWSへVPN接続

2024/07/13に公開

概要

本記事が想定している、より具体的なケースとしては、AWS VPN 接続を含む、複数の VPN 接続を利用している状況で、且つ、Windows から同時に複数 VPN 接続したいが、実現できないケースです。このケースの場合、AWS VPN 接続を、Windows から行うのではなく、WSL から行うことで、同時に複数 VPN 接続を実現できます。

WSL 経由での AWS VPN 接続時の通信経路イメージ
Windows -> WSL の Ubuntu の eth0 -> WSL の Ubuntu の tun0 -> AWS へ

AWS VPN 用 WSL 用意

Ubuntu 版 AWS Client VPNが対応しているUbuntu-20.04を用意する。

PowerShellから実行
# Ubuntu-20.04 ディストリビューション確認
wsl -l --online

# Ubuntu-20.04 インストール
wsl --install Ubuntu-20.04

# インストール済みディストリビューションー覧表示
wsl -l -v

# Ubuntu-20.04 接続
wsl -d Ubuntu-20.04

AWS VPN 接続

  1. Ubuntu 版 AWS Client VPN インストール

    https://aws.amazon.com/jp/vpn/client-vpn-download

    Ubuntu Linux 用 AWS Client VPN (18.04 および 20.04)の手順を実施する。

  2. AWS Client VPN の設定ファイル配置
    AWS マネコン - VPC - クライアント VPN エンドポイント 〜 詳細省略 〜 から クライアント設定をダウンロードできる。
    クライアント設定ファイル:downloaded-client-config.ovpn

    • 配置場所例
      WSL から VPN 接続するため、ファイル名に.fromWSL を含めた。

      C:¥awsvpn¥downloaded-client-config.fromWSL.ovpn
      

      後ほど、下記のように、WSL 側から Windows 側の PATH を指定して参照。

      /mnt/c/awsvpn/downloaded-client-config.fromWSL.ovpn
      
    • cert, key の PATH を追記・変更

      downloaded-client-config.fromWSL.ovpnへ追記・変更。
      下記のように、WSL 側から Windows 側の PATH を指定して参照。

      cert /mnt/c/awsvpn/xxxxx.domain.tld.crt
      key /mnt/c/awsvpn/xxxxx.domain.tld.key
      
  3. AWS VPN 接続開始コマンドを設定

    WSL上から実行
    awsVpnCmd=$(cat << EOS
    function startawsvpn() {
        sudo /opt/awsvpnclient/Service/Resources/openvpn/acvc-openvpn --config /mnt/c/awsvpn/downloaded-client-config.fromWSL.ovpn
    }
    
    EOS
    )
    
    echo "$awsVpnCmd" >> ~/.bashrc
    source ~/.bashrc
    
  4. startawsvpn 関数を実行し、vpn 接続開始。
    vpn 接続成功すると、ip a コマンド結果に、3: tun0: が増える。

    AWS VPN 接続開始することで、下記の通信部分を実現する。
    Windows -> WSL の Ubuntu の eth0 -> WSL の Ubuntu の tun0 -> AWS へ

Ubuntu ルーター化[1]

Ubuntu をルーター化することで、下記の通信部分を実現する。
Windows -> WSL の Ubuntu の eth0 -> WSL の Ubuntu の tun0 -> AWS へ

WSL上から実行
# パケットのフォワード有効化
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# ルーターとしての設定を保存するコマンドをインストール
sudo apt-get install iptables-persistent

# 内側インターフェイス        : eth0
# AWS VPN 側インターフェイス  : tun0

# NAPT(IP マスカレード)の設定(tun0を通過する送信トラフィックの送信元IPアドレスを、tun0のIPアドレスに変換する)
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

# 「WSL -> AWS へ転送する通信」を許可
sudo iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT

# 「WSL -> AWS へ転送する通信」の戻りの通信を許可
sudo iptables -A FORWARD -i tun0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# 設定を永続化
sudo sh -c 'iptables-save > /etc/iptables/rules.v4'
sudo cat /etc/iptables/rules.v4

Windows 側ルーティング設定

Windows 側ルーティング設定することで、下記の通信部分を実現する。
Windows -> WSL の Ubuntu の eth0 -> WSL の Ubuntu の tun0 -> AWS へ

※管理者権限で実行した PowerShell 等から実行すること

PowerShellから実行
#ルーティング設定表示
route print -4

# ルーティング設定追加
# VPN経由での通信先が、192.168.10.0/24の場合
route add 192.168.10.0 mask 255.255.255.0 <Ubuntuのeth0のIPアドレス>

# ルーティング設定削除
route delete 192.168.10.0

通信状況確認

VPN 経由でアクセスして、通信状況を確認する。

PowerShellから実行
# アクセス不可な場合
PS C:¥WINDONS¥system32> netstat -nao | findstr 192.168.10
    TCP     172.20.32.1:52273   192.168.10.88:443   SYN SENT        23168
    TCP     172.20.32.1:52274   192.168.10.88:443   SYN_SENT        23168

# アクセス可能な場合
PS C:¥WINDONS¥system32> netstat -nao | findstr 192.168.10
    TCP     172.20.32.1:52323   192.168.10.88:443   ESTABLISHED     23168

利用方法

日々の利用方法としては、下記のようなスクリプトを用意して、Windows 側から実行し、AWS VPN 接続を開始する。

awsvpn.ps1
# 利用方法
    # 右クリックし、PowerShell で実行

    # ps1実行時に、管理者権限へ昇格
    if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole("Administrators")) { Start-Process powershell.exe "-File `"$PSCommandPath`"" -Verb RunAs; exit }

    # windows 側ルーティング設定
        # WSL 側の IP アドレス取得
        $wslIpAddress = wsl -d Ubuntu-20.04 -e bash -c "ip addr show eth0 | grep 'inet ' | sed -e 's/.*inet //g' | sed -e 's/¥/.*//g'"

        # IPアドレス表示
        Write-Output "WSL IP Address: $wslIpAddress"

        # ルーティング設定削除・追加
        route delete 192.168.10.0
        route add 192.168.10.0 mask 255.255.255.0 $wslIpAddress

    # WSL起動、AWS VPN接続開始
    wsl -d Ubuntu-20.04 -e bash -c "sudo /opt/awsvpnclient/Service/Resources/openvpn/acvc-openvpn --config /mnt/c/awsvpn/downloaded-client-config.fromWSL.ovpn"

以上

脚注
  1. https://qiita.com/nouernet/items/a57f839bc6409c110d3c ↩︎

Discussion