NF

地方で働くプログラマ

ほげほげ

あとで消す

Windows PowerShell(管理者)で UDP portproxy を設定
powershell

netsh interface portproxy add v4tov4 `
listenport=5000 listenaddress=0.0.0.0 `
connectport=5000 connectaddress=172.24.112.1 protocol=udp

終わったら

戻す
netsh interface portproxy delete v4tov4 listenport=5000 listenaddress=0.0.0.0 protocol=udp

確認
netsh interface portproxy show all

外部サーバ → Windows:5000 → WSL2:5000

Windows ファイアウォールを開ける
powershell

New-NetFirewallRule -DisplayName "WSL UDP 5000" `
-Direction Inbound -Protocol UDP -LocalPort 5000 -Action Allow

または

  • UDP ポートを開ける手順(GUI

Windows Defender ファイアウォールを開く
左側の 「詳細設定」 をクリック
左のメニューから 「受信の規則」 を選択
右側の 「新しい規則…」 をクリック
種類は 「ポート」 を選択
UDP を選択
開けたいポート番号(例:5000)を入力
「接続を許可する」
プロファイル(通常はすべて)
名前をつけて完了

WSL2 側で UDP サーバを起動
WSL2 内で:
nc -u -l 5000

外部サーバから送信してテスト
外部 サーバで:
echo "hello" | nc -u <あなたのWindowsグローバルIP> 5000

外への確認
echo -n "test" | nc -u -w1 resolver1.opendns.com 53 | hexdump -C

あとで

🛠️ 1. WSL2 → Windowsping を通す方法
Windows 側で ICMP を許可する必要があります。

方法 A:PowerShell(管理者)で許可
powershell
netsh advfirewall firewall add rule name="ICMPv4 Echo Allow" protocol=icmpv4:8,any dir=in action=allow
方法 B:GUI で許可
Windows Defender ファイアウォール
「詳細設定」
「受信の規則」
「ファイルとプリンターの共有(エコー要求 - ICMPv4)」を有効化
これで WSL2 → Windowsping が通るようになります。

2. WSL2 からインターネットに出られない場合のチェック
WSL2 は Windows の NAT を経由してインターネットに出ます。
以下を順に確認すると原因が切り分けられます。

🔍 (1) Windows 側の vEthernet (WSL) が正常か確認
PowerShell で確認:

powershell
Get-NetAdapter
vEthernet (WSL) が Up になっているか確認。

🔍 (2) WSL2 内の IP とゲートウェイ確認
Ubuntu で:

bash
ip addr
ip route
通常はこうなります:

WSL2 の IP: 172.27.x.x

デフォルトゲートウェイ: 172.27.0.1(Windows 側)

🔍 (3) DNS が壊れていないか確認
WSL2 の DNS が壊れるとネットに出られません。

DNS のテスト
bash
ping 8.8.8.8
これが通る → DNS だけ壊れている

これも通らない → NAT/ルーティングの問題

DNS 修復(よく効く)
/etc/wsl.conf を作成:

bash
sudo nano /etc/wsl.conf
内容:

コード
[network]
generateResolvConf = false
次に /etc/resolv.conf を作成:

bash
sudo rm /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
WSL を再起動:

powershell
wsl --shutdown
🛠️ 3. Windows 側の NAT が壊れている場合の修復
Windows の WSL ネットワークをリセット:

powershell
netsh winsock reset
netsh int ip reset all
再起動後:

powershell
wsl --shutdown

ステップ1:Windows 側の WSL 仮想 NIC を再生成する
まず、Windows 側の仮想 NIC が壊れている可能性が高い。

PowerShell(管理者)で次を実行:

powershell
Get-NetAdapter | Where-Object {$_.Name -like "*WSL*"}
もし vEthernet (WSL) が出てこない、または 状態が Down なら壊れている。

👉 修復コマンド
powershell
wsl --shutdown
netsh interface set interface "vEthernet (WSL)" admin=disable
netsh interface set interface "vEthernet (WSL)" admin=enable
もし「インターフェイスが存在しません」と出たら、次のステップへ。

ステップ2:WSL のネットワークを完全リセット
PowerShell(管理者)で:

powershell
wsl --shutdown
netsh winsock reset
netsh int ip reset all
その後 Windows を再起動。

再起動後に:

powershell
wsl --shutdown
wsl
Ubuntu を起動して、次を確認:

bash
ip route
通常はこう出る:

コード
default via 172.27.0.1 dev eth0
これが出ない場合、次のステップへ。

ステップ3:WSL のネットワーク構成ファイルを強制再生成
WSL のネットワーク設定が壊れている可能性がある。

PowerShell(管理者)で:

powershell
wsl --shutdown
del C:\Users\%USERNAME%\.wslconfig
(もし .wslconfig が存在しないならスキップ)

次に Windows の WSL ネットワークを再生成:

powershell
Remove-Item -Recurse -Force "C:\Users\%USERNAME%\AppData\Local\Packages\MicrosoftCorporationII.WindowsSubsystemForLinux_*"
※ これは WSL のネットワークキャッシュを削除するだけで、Ubuntu 本体は消えない。

その後:

powershell
wsl --shutdown
wsl

🔍 1. Hyper-V の仮想スイッチが存在するか確認
PowerShell(管理者)で:

powershell
Get-VMSwitch
WSL という名前のスイッチが無い

または存在するけど状態が怪しい(Type が Internal 以外)

→ 企業ポリシーでブロックされている可能性が高い。

🔍 2. NAT が存在するか確認
powershell
Get-NetNat
通常は WSL という NAT が自動生成される。

これが無い

またはエラーが出る

→ NAT が作れない=WSL2 が外に出られない。

🔍 3. vEthernet (WSL) の状態確認
powershell
Get-NetAdapter | Where-Object {$_.Name -like "*WSL*"}
状態が Up でない

そもそも存在しない

→ 仮想 NIC が作れない状態。