TCPポートの疎通確認をする（WindowsでTest-NetConnectionがない環境向け）

Windows PowerShell v4以降では`Test-NetConnection`コマンドレットが提供されているため、こちらを利用してTCPポートの疎通確認が簡単に確認できますが。

たまにWindows PowerShell v4より前の環境をさわることがあるため、そんなときに確認する方法をまとめておきます。

## telnetコマンドを利用する

[telnet](https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/telnet)

```cmd
# telent [対象のIPアドレスまたはホスト名] [ポート番号]　で確認できる
telnet 192.0.2.100 3389
```
上記のコマンドで疎通できる場合はブランク画面になります。

ブランク画面から抜けるにはエスケープ文字`CTRL+]`でコマンドモードに戻るのでそこでquitを実行すれば抜けられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/d9af6c65-6747-d991-af31-a99b48052603.png)

なお上記コマンドで疎通失敗する場合は下記のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/f953f447-29df-f35a-5c4d-5607282d14b9.png)

以下、メモ

Windows Server 2003の場合はtelnetコマンドが標準でインストールされているため、デフォルトでtelnetコマンドを利用でき疎通確認を行える。

Windows Server 2008 以降はtelnetコマンドが標準でインストールされなくなったため、Windowsの機能と追加から`telnet クライアント`を追加してからtelnetコマンドを利用する。

ちなみにWindows Server 2008はデフォルトのWindows PowerShellのバージョンが1.0。
Windows Server 2008 R2はデフォルトのWindows PowerShellのバージョンが2.0。

となっており、デフォルトでインストールされているWindows PowerShellではTest-NetConnectionはない。

## PortQryコマンドを利用する

[Download Center - PortQry Command Line Port Scanner Version 2.0](https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/networking/portqry-command-line-port-scanner-v2)

[PortQry コマンド ライン ツールの使用](https://learn.microsoft.com/ja-jp/troubleshoot/windows-server/networking/portqry-command-line-port-scanner-v2)

別途インストールが必要となりますが、マイクロソフトが提供しているツールとしてPortQryを利用してポートの確認ができます。

ダウンロードセンターからPortQryV2.exeをダウンロードして実行すると、ライセンスの確認とファイルの展開がされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/345a15cc-56c1-3d58-0fd1-78d9c939f559.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/3a4dfdee-12c7-9ec8-36f6-20b268284d61.png)

展開先のフォルダにPortQry.exeがあるためこちらを利用して下記のようにポートチェックを実施できます。

```cmd.exe
# portqry -n [対象のIPアドレスまたはホスト名] -e [ポート番号]
PortQry.exe -n 192.0.2.100 -e 3389

#-nオプションでIPアドレスを指定すると、デフォルトでは逆引きを行うのでこれをスキップしたい場合は -nrオプションを指定
PortQry.exe -n 192.0.2.100 -e 3389 -nr

```

`-nr`オプションなしのケース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/405d2453-6da3-5ebd-c211-f610ebc021ac.png)

`-nr`オプションありのケース

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/6c0c0fa3-bed2-1419-4a4d-54714df40fa9.png)

## PsPingコマンドを利用する

Sysinternalsで提供されいてるPsPingを使ってもポートチェックを行う事ができる。

Sysinternalsについて　と　Sysinternals Suiteのインストールについては　以前書いた下記記事参照（Sysinternals SuiteをインストールするとPsPingもインストールされます）

[Sysinternalsについて](https://qiita.com/SAITO_Keita/items/082f668f4565761b5277)

[Sysinternals Suiteをwinget（msstore）からインストールしてみる](https://qiita.com/SAITO_Keita/items/46950bde5953a8011379)

```cmd.exe
# psping [対象のIPアドレスまたはホスト名]:[ポート番号]
psping 192.0.2.100:3389
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/26a7def4-d0b2-8be7-ddc9-64ca9dab63b7.png)

# .Net frameworkのSystem.Net.Sockets.TcpClientを利用する

Windows PowerShell 4.0より前はTest-NetConnectionはありませんが、.Net frameworkのTcpClientクラスを利用してポートのチェックを実施できます。

[.Net framework 2.0 TcpClient クラス](https://learn.microsoft.com/ja-jp/dotnet/api/system.net.sockets.tcpclient?view=netframework-2.0)

上記のようにWindows PowerShell 2.0などで使われる.Net framework 2.0にもTcpClientは用意されているのでこちらを利用します。

```powershell
# ipアドレスとポートを指定
$target = "192.0.2.100"
$port = 3389

# TcpClientインスタンス初期化
$client = New-Object System.Net.Sockets.TcpClient
# TcpClient.Connect メソッドで接続
$client.Connect($target,$port)
# ConnectedがTrueかFalseでリモートホストに接続できたか判断
$client.Connected
# TcpClientインスタンス破棄 
$client.Close()
```

上記コマンドで疎通確認ができます。
実態としては　`$client.Connect($target,$port)` 部分で疎通できなければエラーが発生して接続できない事に気が付きますが、一応Connected　でTrueだったら疎通OK、Falseだったら疎通NGと結果を確認しています。

## 総評

たまにWindowsでTest-NetConnectionがない環境をさわる。　そんなときにどうぞ。