Created
February 12, 2021 03:40
-
-
Save tsukumijima/aefef9706db4b511ad99349fa1e8a233 to your computer and use it in GitHub Desktop.
Windows から WSL へポートフォワーディングを設定
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Windows から WSL へポートフォワーディングを設定 | |
function Set-WslPortForwarding { | |
# WSL のディストリビューション | |
$wsl_distribution = 'Ubuntu'; | |
# WSL に割り当てられたローカルドメイン | |
$wsl_domain = 'ubuntu.wsl'; | |
# 管理者権限で実行するために一時的に作成する PowerShell スクリプトのパス | |
$temp_ps1 = "${env:LOCALAPPDATA}\WslPortForwarding.ps1"; | |
echo '' > $temp_ps1; # ファイルを作成 | |
# WSL が以前リッスンしていたポート番号を取得 | |
$wsl_ports_txt = "${env:LOCALAPPDATA}\WslPortForwarding.txt"; # ポート情報を保存するファイルのパス | |
if (Test-Path $wsl_ports_txt) { | |
$wsl_ports = cat $wsl_ports_txt; | |
} else { | |
$wsl_ports = @(); | |
} | |
# WSL が現在リッスンしているポート番号を取得 | |
$wsl_listen_ports = wsl -d $wsl_distribution -- ss -nltu `| grep -Eo ":[0-9]+" `| sed "s/://g" `| sort -V `| uniq; | |
$wsl_listen_ports[[Array]::IndexOf($wsl_listen_ports, 53)] = $null; # ポート 53 は DNS 関連でバッティングしそうなので削除 | |
$wsl_listen_ports[[Array]::IndexOf($wsl_listen_ports, 3306)] = $null; # ポート 3306 は Windows 側の MySQL クライアントからエラーで接続できなくなるので削除 | |
$wsl_listen_ports[[Array]::IndexOf($wsl_listen_ports, 33060)] = $null; # ポート 33060 は Windows 側の MySQL クライアントからエラーで接続できなくなるので削除 | |
$wsl_listen_ports = $wsl_listen_ports -ne $null; # 配列のインデックスを詰める | |
echo $wsl_listen_ports > $wsl_ports_txt; # ポート情報を保存 | |
# 古いファイアウォール・ポートフォワーディングの設定を削除 | |
foreach ($wsl_port in $wsl_ports) { | |
$register_name = "WSL PortForwarding ${wsl_port}"; # 登録する名前 | |
# ファイアウォールの設定を削除 | |
echo "echo `"Remove Port: ${wsl_port}`"" >> $temp_ps1; | |
echo "netsh advfirewall firewall delete rule name=`"${register_name}`" protocol=TCP" >> $temp_ps1; | |
echo "netsh advfirewall firewall delete rule name=`"${register_name}`" protocol=UDP" >> $temp_ps1; | |
# ポートフォワーディングの設定を削除 | |
echo "netsh interface portproxy delete v4tov4 listenport=${wsl_port}" >> $temp_ps1; | |
echo "" >> $temp_ps1; # 空白行 | |
} | |
# 新しいファイアウォール・ポートフォワーディングの設定を追加 | |
foreach ($wsl_listen_port in $wsl_listen_ports) { | |
$register_name = "WSL PortForwarding ${wsl_listen_port}"; # 登録する名前 | |
$register_profile = 'private,public'; # 登録するプロファイルの種類 | |
# ファイアウォールの設定を削除・追加 | |
echo "echo `"Set Port: ${wsl_listen_port}`"" >> $temp_ps1; | |
echo "netsh advfirewall firewall delete rule name=`"${register_name}`" protocol=TCP" >> $temp_ps1; | |
echo "netsh advfirewall firewall delete rule name=`"${register_name}`" protocol=UDP" >> $temp_ps1; | |
echo "netsh advfirewall firewall add rule name=`"${register_name}`" dir=in action=allow profile=${register_profile} protocol=TCP localport=${wsl_listen_port}" >> $temp_ps1; | |
echo "netsh advfirewall firewall add rule name=`"${register_name}`" dir=in action=allow profile=${register_profile} protocol=UDP localport=${wsl_listen_port}" >> $temp_ps1; | |
# ポートフォワーディングの設定を削除・追加 | |
echo "netsh interface portproxy delete v4tov4 listenport=${wsl_listen_port}" >> $temp_ps1; | |
echo "netsh interface portproxy add v4tov4 listenport=${wsl_listen_port} connectaddress=${wsl_domain}" >> $temp_ps1; | |
echo "" >> $temp_ps1; # 空白行 | |
} | |
# ポートフォワーディングサービスの有効化 | |
echo "echo `"Enable PortForwarding...`"" >> $temp_ps1; | |
echo 'sc config iphlpsvc start=auto' >> $temp_ps1; | |
echo 'net stop iphlpsvc' >> $temp_ps1; | |
echo 'net start iphlpsvc' >> $temp_ps1; | |
# 作成した PowerShell スクリプトを管理者として実行 | |
Start-Process pwsh.exe -ArgumentList "-NoProfile -ExecutionPolicy unrestricted ${temp_ps1}" -Wait -Verb runas | |
rm $temp_ps1; # 作成した PowerShell スクリプトを削除 | |
# ポートフォワーディング設定を表示して終了 | |
netsh interface portproxy show v4tov4 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment