Windowsの標準機能だけでポートをリッスンする方法

Windowsの標準機能だけでポートをリッスンする方法

はじめに

セキュリティが厳しい企業環境やサーバー環境では、ncやnmapなどの便利なツールをインストールできないことがある。しかし、Windowsの標準機能だけを使って、ポートのリッスンやネットワークのテストを行うことは可能だ。本記事では、PowerShellの標準ツールを使ったワンライナーでポートをリッスンする方法を紹介する。

PowerShellを使った方法

基本的なTCPリスナー

PowerShellのSystem.Net.Socketsを使って、簡単にTCPポートをリッスンできる。

powershell
# ポート8080でリッスン(ワンライナー)
$l=New-Object System.Net.Sockets.TcpListener(8080);$l.Start();Write-Host 'Listening on port 8080...';$c=$l.AcceptTcpClient();$s=$c.GetStream();$r=New-Object System.IO.StreamReader($s);while($d=$r.ReadLine()){Write-Host $d};$c.Close();$l.Stop()

設定反映確認(LISTENしているポートを確認)

netstat -an | findstr :8080

実行結果

PS C:\Users\Administrator> netstat -an | findstr :8080
  TCP         0.0.0.0:8080           0.0.0.0:0              LISTENING

対向サーバーから接続確認(Linux)

# nc -vz <対向サーバIPアドレス> 8080

対向サーバーから実行結果確認(Linux)

[root@localhost ~]# nc -vz 192.168.12.2 8080
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.12.2:8080.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

リスナーを停止する場合はctrl+cかタスクマネージャからPowershellプロセスを強制終了する。

より実用的なHTTPリスナー

簡易的なHTTPサーバーとして動作させることも可能だ。

powershell
# HTTP応答を返すリスナー(ポート8080)
$l=[System.Net.HttpListener]::new();$l.Prefixes.Add('http://+:8080/');$l.Start();Write-Host 'HTTP Server on port 8080...';while($l.IsListening){$c=$l.GetContext();$r=$c.Response;$b=[System.Text.Encoding]::UTF8.GetBytes('Hello from Windows');$r.ContentLength64=$b.Length;$r.OutputStream.Write($b,0,$b.Length);$r.Close()}

設定反映確認(LISTENしているポートを確認)

netstat -an | findstr :8080

実行結果

PS C:\Users\Administrator> netstat -an | findstr :8080
  TCP         0.0.0.0:8080           0.0.0.0:0              LISTENING
  TCP         [::]:8080              [::]:0                 LISTENING

対向サーバーから接続確認(Linux)

# curl -v http://<対向サーバIPアドレス>:8080

対向サーバーから実行結果確認(Linux)

[root@localhost ~]# curl -v http://192.168.12.2:8080
*   Trying 192.168.12.2:8080...
* Connected to 192.168.12.2 (192.168.12.2) port 8080 (#0)
> GET / HTTP/1.1
> Host: 192.168.12.2:8080
> User-Agent: curl/7.76.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Content-Length: 18
< Server: Microsoft-HTTPAPI/2.0
< Date: Sat, 05 Jul 2025 04:07:14 GMT
<
* Connection #0 to host 192.168.12.2 left intact
Hello from Windows

UDPリスナー

UDPポートをリッスンする場合は以下のようにする。

powershell
# UDPポート9999でリッスン
$u=New-Object System.Net.Sockets.UdpClient(9999);Write-Host 'UDP Listening on port 9999...';$e=New-Object System.Net.IPEndPoint([System.Net.IPAddress]::Any,0);while($true){$d=$u.Receive([ref]$e);Write-Host ('Received: '+[System.Text.Encoding]::UTF8.GetString($d)+' from '+$e.ToString())}

設定反映確認(LISTENしているポートを確認)

netstat -an | findstr :9999                    

実行結果

PS C:\Users\Administrator> netstat -an | findstr :9999
  UDP         0.0.0.0:9999           *:*                                    

対向サーバーから接続確認(Linux)

# nc -uvz <対向サーバIPアドレス> 9999

対向サーバーから実行結果確認(Linux)

[root@localhost ~]# nc -uvz 192.168.12.2 9999
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.12.2:9999.
Ncat: UDP packet sent successfully
Ncat: 1 bytes sent, 0 bytes received in 2.01 seconds.

ウェルノウンポート(0-1023)の使用

ウェルノウンポートは管理者権限があれば使用可能だ。ただし、既に使用されているポートには注意が必要。

管理者権限でポート80をリッスン

80番ポートの空き状況を確認
netstat -an | findstr LISTENING

実行結果

PS C:\Users\Administrator> netstat -an | findstr LISTENING
  TCP         0.0.0.0:135            0.0.0.0:0              LISTENING
  TCP         0.0.0.0:445            0.0.0.0:0              LISTENING

<中略>

  TCP         [::]:49669             [::]:0                 LISTENING
  TCP         [::]:49677             [::]:0                 LISTENING
  TCP         [::]:49678             [::]:0                 LISTENING

  TCP         [::]:49678             [::]:0                 LISTENING

powershell

# 管理者権限のPowerShellで実行(HTTPリスナー)
$l=[System.Net.HttpListener]::new();$l.Prefixes.Add('http://+:80/');try{$l.Start();Write-Host 'HTTP Server on port 80...';$c=$l.GetContext();$r=$c.Response;$b=[System.Text.Encoding]::UTF8.GetBytes('Hello');$r.OutputStream.Write($b,0,$b.Length);$r.Close()}catch{Write-Host 'Error: Run as Administrator or port in use'}

設定反映確認(LISTENしているポートを確認)

netstat -an | findstr :80

実行結果

PS C:\Users\Administrator> netstat -an | findstr 80
  TCP         0.0.0.0:80             0.0.0.0:0              LISTENING
  TCP         [::]:80                [::]:0                 LISTENING

対向サーバーから接続確認(Linux)

# nc -vz <対向サーバIPアドレス> 80

対向サーバーから実行結果確認(Linux)

[root@localhost ~]# nc -vz 192.168.12.2 80
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connected to 192.168.12.2:80.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds

ファイアウォールの考慮事項

ポートをリッスンする際は、Windowsファイアウォールで該当ポートを開放する必要がある。

powershell
# ポート8080を開放(管理者権限必要)
New-NetFirewallRule -DisplayName "Allow Port 8080" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow

ルールの削除

powershell
Remove-NetFirewallRule -DisplayName "Allow Port 8080"

トラブルシューティング

アクセス拒否エラーが出る場合

管理者権限でPowerShellを実行するか、1024番以上のエフェメラルポートを使用する。

セキュリティ上の注意

これらの方法は一時的なテストやトラブルシューティングには便利だが、本番環境での使用は推奨されない。特に以下の点に注意する必要がある。

  1. 認証機能がないため、誰でも接続可能
  2. 暗号化されていない通信
  3. エラーハンドリングが不十分
  4. リソースの適切な解放が保証されない

まとめ

Windows環境で追加ツールをインストールできない場合でも、PowerShellやnetshなどの標準機能を使えば、ポートのリッスンやネットワークのテストが可能だ。ただし、これらは一時的な用途に限定し、本番環境では適切なツールやサービスを使用することが重要である。

状況に応じて適切な方法を選択し、セキュリティリスクを理解した上で使用することが大切だ。

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *