treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

PowerShellのTest-NetConnectionコマンドを試す

以前、PowerShellのコマンドレットで「Get-NetNeighbor」を使うことがありました<PowerShellのGet-NetNeighborコマンドを試す - treedown’s Report>が、今回は「Test-NetConnection」を使いましたのでご報告です。
使い方は簡単なのですが、けっこう昔に"これ欲しかった"機能でした。

通信の確認=ping

通信ができるかどうかの疎通確認にはpingを用いることが多いと思います。

pingコマンド基礎の基礎の使い方
https://blog.treedown.net/entry/2018/11/28/010000

ping疎通確認は通信確認の第一歩、これは間違いないのですが、pingで通信できるけど○○が通信できないというエラーを出す場合、どのように確認すればいいのか、という次のステップに応えてくれるコマンドレットがPowerShellに用意されています。これが「Test-NetConnection」です。

Test-NetConnection

コマンドレット「Test-NetConnection」は、通信先の相手にポート指定をして接続確認を実施することができる機能があります。

※参考:MicrosoftIgnite:Test-NetConnection
https://learn.microsoft.com/en-us/powershell/module/nettcpip/test-netconnection?view=windowsserver2022-ps

オプションなしで実行するとpingの疎通確認と同じ接続確認を実施し処理を完了させます。
が、「Test-NetConnection」の真価は「-Port」オプションを付加したときに発揮できます。

オプション「-Port」

コマンドレット「Test-NetConnection」にオプション「-Port」を付加することで、"そのポートへの通信が成功するかどうか"を確認することができます。これはpingにない疎通確認で、通信の応答以外にサービスの応答/サービスへの接続(正確にはサービスが待ち受けているポートへの接続)を疎通確認することができるという点が有用だとおもいました。

書式

Test-NetConnection %接続先% -Port %ポート番号%

「%接続先%」にはIPアドレスやホスト名(コンピュータ名)などを指定することができます。

例えば、192.168.0.1 というIPアドレスとか、TestServer とか testserver.hoge.com といったコンピュータ名です。ホスト名を指定する際にはDNSなどで名前解決ができることが前提となります。

「%ポート番号%」には、サービスで使われる通信の出入り口となる番号を指定することになります。
LAN内でよく使われる番号としては、Windowsファイル共有(SMB)で「445番」とか、DNSサーバの「53番」、FTPクライアントが指定する「21番」とかSSH接続で使われる「22番」、HTTP(Webサイト)への接続で「80番」などが使われていることが多いです。

ポート番号445番向けに実行してみる

それぞれポートを指定して実行してみました。

Windowsファイル共有(SMB)で「445番」をWindows10相手に実行してみた結果です。

なお、画面中の「ComputerName/RemoteAddress」が検査対象となる接続先、「RemotePort」がコマンドレットで指定したポート番号、「SourceAddress」がコマンドレットを実行した送信元、「InterfaceAlias」はSourceAddressで使われたNIC名、「TcpTestSucceeded」が、重要な実行結果を意味します。

--------------------------------------------------------------

PS C:\Users\testuser> Test-NetConnection 192.168.0.1 -Port 445
ComputerName     : 192.168.0.1
RemoteAddress    : 192.168.0.1
RemotePort       : 445
InterfaceAlias   : イーサネット
SourceAddress    : 192.168.0.102
TcpTestSucceeded : True

--------------------------------------------------------------

上記では、"TcpTestSucceeded : True"となっているので通信が成功した記録となっています。通信が失敗した場合には"TcpTestSucceeded : False"と表示されます。

ポート:445はWindowsでダイレクトホストSMB(Direct host SMB over TCP/IP)と呼ばれる通信で、Windowsファイル共有/プリンタ共有といった共有資源の提供と利用に使われるポートです。Windowsであれば概ね待ち受け状態になっていることが多いです。
Windows同士で、共有フォルダのような共有資源に接続できない、という場合に、上記のポート:445指定でTest-NetConnectionコマンドレットを実行してみるとトラブルの原因が掴めるかもしれません。

ポート番号80番向けに実行してみる

以下は、ポート80番のイントラネット上にあるWebサーバを対象に確認した実行例です。

--------------------------------------------------------------

PS C:\Users\testuser> Test-NetConnection 192.168.0.1 -Port 80
警告: TCP connect to (192.168.0.1 : 80) failed


ComputerName           : 192.168.0.1
RemoteAddress          : 192.168.0.1
RemotePort             : 80
InterfaceAlias         : イーサネット
SourceAddress          : 192.168.0.102
PingSucceeded          : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded       : False

PS C:\Users\testuser> Test-NetConnection 192.168.0.3 -Port 80

ComputerName           : 192.168.0.3
RemoteAddress          : 192.168.0.3
RemotePort             : 80
InterfaceAlias         : イーサネット
SourceAddress          : 192.168.0.102
TcpTestSucceeded : True

--------------------------------------------------------------

192.168.0.1に向けたポート80番への通信確認は"TcpTestSucceeded : False"で失敗しているのが分かります。一方192.168.0.3宛ての通信確認は"TcpTestSucceeded : True"で成功しています。
なお、HTTPS(https://で始まるURLのWebサイト)ホストへの通信は、ポート80番ではなく、ポート番号443番への通信確認となります。(一般的にWebサイトはSSLサーバ証明書でHTTPS化しています。)

ポート番号21番や22番へ向けて実行してみる

SFTPホストとして稼働しているLinuxホストに向けた通信をWindows11のPowerShellコマンドレットで確認してみました。

--------------------------------------------------------------

PS C:\Users\testuser> Test-NetConnection 192.168.0.1 -Port 22

ComputerName     : 192.168.0.1
RemoteAddress    : 192.168.0.1
RemotePort       : 22
InterfaceAlias   : イーサネット
SourceAddress    : 192.168.0.102
TcpTestSucceeded : True


PS C:\Users\testuser> Test-NetConnection 192.168.0.1 -Port 21
 警告: TCP connect to (192.168.0.1 : 21) failed
 
ComputerName           : 192.168.0.1
RemoteAddress          : 192.168.0.1
RemotePort             : 21   
InterfaceAlias         : イーサネット
SourceAddress          : 192.168.0.102
PingSucceeded          : True
PingReplyDetails (RTT) : 0 ms
TcpTestSucceeded       : False

--------------------------------------------------------------

平文で通信するFTPが有効ではないため、ポート番号21番の通信は"TcpTestSucceeded : False"と失敗してしまいました。よく考えたら、このホストではSCPしか使っていないため、SSHポートである22番ポートしか使っていませんでした。SSHもSCP(ないしsftp)もポート番号22番しか使わないため、上記のように22番が"TcpTestSucceeded : True"となっていればやりたい通信はできてしまいます。

ポート別に疎通確認ができるのは便利

IISでエラーが出たときとか、通信できるのにサービスに接続できない、という動きを調査する時に、従来のpingでは「通信できるかどうか」という可否は確認できたものの、そこからさらにサービスに絞って動作を確認することはできませんでした。コマンドレット「Test-NetConnection」を使うと、そのサービスの入り口である「ポート」に絞った通信確認ができるため、pingで疎通確認した後の通信確認としては良い感じに絞り込めている=切り分けできそう、な感じがします。

そもそも通信相手のサービスが最初から分かっているのであれば、pingで疎通確認を飛ばしていきなりポート指定で疎通確認をしてもいいかもしれません。スクリプトでサービス監視としても使えそうな感じがしました。