PowerShellのNetTCPIPモジュールをつかってみる

Windowsで疎通チェックによく利用される`Test-NetConnection`コマンドレットが含まれている`NetTCPIP`モジュールですが。

個人的には`Test-NetConnection`以外にもルーティング設定するコマンドレットなども利用するため、普段利用しているコマンドに着目して紹介します。

## 今回試している環境

- Windows 11 23H2
- PowerShell 7.5.0-preview.2

## NetTCPIPモジュールに含まれているコマンドレットを確認してみる。

```powershell
Get-Command -module NetTCPIP
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/91e87581-0563-26d2-b18c-be1944e5e777.png)

提供されるコマンドレットを確認すると下記となっていました。

```text
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Find-NetRoute                                      1.0.0.0    NetTCPIP
Function        Get-NetCompartment                                 1.0.0.0    NetTCPIP
Function        Get-NetIPAddress                                   1.0.0.0    NetTCPIP
Function        Get-NetIPConfiguration                             1.0.0.0    NetTCPIP
Function        Get-NetIPInterface                                 1.0.0.0    NetTCPIP
Function        Get-NetIPv4Protocol                                1.0.0.0    NetTCPIP
Function        Get-NetIPv6Protocol                                1.0.0.0    NetTCPIP
Function        Get-NetNeighbor                                    1.0.0.0    NetTCPIP
Function        Get-NetOffloadGlobalSetting                        1.0.0.0    NetTCPIP
Function        Get-NetPrefixPolicy                                1.0.0.0    NetTCPIP
Function        Get-NetRoute                                       1.0.0.0    NetTCPIP
Function        Get-NetTCPConnection                               1.0.0.0    NetTCPIP
Function        Get-NetTCPSetting                                  1.0.0.0    NetTCPIP
Function        Get-NetTransportFilter                             1.0.0.0    NetTCPIP
Function        Get-NetUDPEndpoint                                 1.0.0.0    NetTCPIP
Function        Get-NetUDPSetting                                  1.0.0.0    NetTCPIP
Function        New-NetIPAddress                                   1.0.0.0    NetTCPIP
Function        New-NetNeighbor                                    1.0.0.0    NetTCPIP
Function        New-NetRoute                                       1.0.0.0    NetTCPIP
Function        New-NetTransportFilter                             1.0.0.0    NetTCPIP
Function        Remove-NetIPAddress                                1.0.0.0    NetTCPIP
Function        Remove-NetNeighbor                                 1.0.0.0    NetTCPIP
Function        Remove-NetRoute                                    1.0.0.0    NetTCPIP
Function        Remove-NetTransportFilter                          1.0.0.0    NetTCPIP
Function        Set-NetIPAddress                                   1.0.0.0    NetTCPIP
Function        Set-NetIPInterface                                 1.0.0.0    NetTCPIP
Function        Set-NetIPv4Protocol                                1.0.0.0    NetTCPIP
Function        Set-NetIPv6Protocol                                1.0.0.0    NetTCPIP
Function        Set-NetNeighbor                                    1.0.0.0    NetTCPIP
Function        Set-NetOffloadGlobalSetting                        1.0.0.0    NetTCPIP
Function        Set-NetRoute                                       1.0.0.0    NetTCPIP
Function        Set-NetTCPSetting                                  1.0.0.0    NetTCPIP
Function        Set-NetUDPSetting                                  1.0.0.0    NetTCPIP
Function        Test-NetConnection                                 1.0.0.0    NetTCPIP
```

この中で個人的に利用する機会が多いコマンドレットを紹介します。

### Test-NetConnection

多分、NetTCPIPモジュールで一番利用されるコマンドレットなのでは？　と個人的に思っていますが。

```powershell
Test-NetConnection -ComputerName microsoft.com -port 443
```

上記のように実行すれば、microsoft.comに対して tcp 443が疎通できるか確認することができます。

他にもオプションを指定しないで実行すると。

```powershell
Test-NetConnection
```

マイクロソフトが提供している `internetbeacon.msedge.net` にpingで疎通できるか確認したり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/0f32c1ad-8643-a56e-2d77-c30e5e78bb08.png)

Portオプションがなければ、ComputerNameに対してpingで疎通できるか確認したり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/56ea68db-e757-fbdd-9bf1-a3401d85aca0.png)

-TraceRouteオプションでTracertしたり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a957ed50-1270-d3e2-3189-d40102fc80fd.png)

ドキュメント読むと色々と機能があります。

## Get-NetRoute

[Get-NetRoute](https://learn.microsoft.com/en-us/powershell/module/nettcpip/get-netroute?view=windowsserver2022-ps)

こちらのコマンドレットでコンピューターのルート情報を取得できます。

```powershell
# ルート情報を取得
Get-NetRoute

# 固定ルートのみ取得
Get-NetRoute -PolicyStore PersistentStore
```

## New-NetRoute

[New-NetRoute](https://learn.microsoft.com/en-us/powershell/module/nettcpip/new-netroute?view=windowsserver2022-ps)

```powershell
# PolicyStoreを指定しないとActiveStoreに登録されるので、コンピューターが再起動すると追加したルーティング情報は消える。
New-NetRoute -DestinationPrefix "192.168.0.0/16" -InterfaceIndex 16 -NextHop 192.168.0.1

# 固定ルートに追加する場合はPolicyStoreでPersistentStoreを指定する

New-NetRoute -DestinationPrefix "192.168.0.0/16" -InterfaceIndex 16 -NextHop 192.168.0.1 -PolicyStore PersistentStore
```

## Remove-NetRoute

[Remove-NetRoute](https://learn.microsoft.com/en-us/powershell/module/nettcpip/remove-netroute?view=windowsserver2022-ps)

こちらのコマンドレットではルートの削除を行います。

```powershell
# 個人的にはGet-NetRouteで削除対象のルートを取得してそれをRemove-NetRouteに渡して削除する方法を利用しています。

Get-NetRoute -DestinationPrefix "192.168.0.0/16" -NextHop 192.168.0.1 -PolicyStore PersistentStore | Remove-NetRoute
```

## Get-NetTCPConnection

[Get-NetTCPConnection](Get-NetTCPConnection)

tcpのコネクション情報を取得できます。
netstatみたいな感じですが、netstatと違い、こちらはTCPだけになります。

```powershell
# TCPのコネクションを取得
Get-NetTCPConnection
```

## Get-NetIPAddress

[Get-NetIPAddress](https://learn.microsoft.com/ja-jp/powershell/module/nettcpip/get-netipaddress?view=windowsserver2022-ps)

ネットワークインターフェースな情報が確認できる

```powershell
Get-NetIPAddress

# AddressFamilyオプションを指定するとIpv4だったりIPv6のみ取得できる。
Get-NetIPAddress -AddressFamily IPv4

Get-NetIPAddress -AddressFamily IPv6
```

## 総評

Test-NetConnectionについても、パラメータの指定方法によっては、pingで疎通確認できたり、tracertみたいな事ができたりします。

またルーティング情報を追加、変更、削除する場合もNetTCPIPモジュールにはコマンドレットが用意されているため便利に利用できます。