はじめに
セキュリティが厳しい企業環境やサーバー環境では、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番以上のエフェメラルポートを使用する。
セキュリティ上の注意
これらの方法は一時的なテストやトラブルシューティングには便利だが、本番環境での使用は推奨されない。特に以下の点に注意する必要がある。
- 認証機能がないため、誰でも接続可能
- 暗号化されていない通信
- エラーハンドリングが不十分
- リソースの適切な解放が保証されない
まとめ
Windows環境で追加ツールをインストールできない場合でも、PowerShellやnetshなどの標準機能を使えば、ポートのリッスンやネットワークのテストが可能だ。ただし、これらは一時的な用途に限定し、本番環境では適切なツールやサービスを使用することが重要である。
状況に応じて適切な方法を選択し、セキュリティリスクを理解した上で使用することが大切だ。