WSLからAWSへ接続したAWS VPN接続を経由して、WindowsからAWSへVPN接続
概要
本記事が想定している、より具体的なケースとしては、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
を用意する。
# 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 接続
-
Ubuntu 版 AWS Client VPN インストール
https://aws.amazon.com/jp/vpn/client-vpn-download
Ubuntu Linux 用 AWS Client VPN (18.04 および 20.04)
の手順を実施する。 -
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
-
-
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
-
startawsvpn 関数を実行し、vpn 接続開始。
vpn 接続成功すると、ip a
コマンド結果に、3: tun0:
が増える。AWS VPN 接続開始することで、下記の通信部分を実現する。
Windows -> WSL の Ubuntu の eth0 ->WSL の Ubuntu の tun0 -> AWS へ
[1]
Ubuntu ルーター化Ubuntu をルーター化することで、下記の通信部分を実現する。
Windows -> WSL の Ubuntu の eth0 -> WSL の Ubuntu の tun0
-> AWS へ
# パケットのフォワード有効化
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 等から実行すること
#ルーティング設定表示
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 経由でアクセスして、通信状況を確認する。
# アクセス不可な場合
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 接続を開始する。
# 利用方法
# 右クリックし、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"
以上
Discussion