Skip to content

Instantly share code, notes, and snippets.

@tsukumijima
Created February 12, 2021 03:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tsukumijima/aefef9706db4b511ad99349fa1e8a233 to your computer and use it in GitHub Desktop.
Save tsukumijima/aefef9706db4b511ad99349fa1e8a233 to your computer and use it in GitHub Desktop.
Windows から WSL へポートフォワーディングを設定
# 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