デフォルトゲートウェイだけ変更する

メモ:  Category:powershell

デフォルトゲートウェイだけ変更したいというニーズがどのくらいあるのかわかりませんが、現在のプロジェクトで必要になりましたので作成してみました。

スクリプト

# 物理インターフェイスの取得
Get-NetAdapter -Physical | ForEach-Object{
    # 静的IPアドレスの取得(DHCPは対象外)
    $ipAddr = (Get-NetIPAddress -InterfaceIndex $_.ifIndex | Where-Object {($_.AddressFamily -eq "IPv4") -and ($_.PrefixOrigin -eq "Manual")}).IPAddress
    $IfIdx = $_.ifIndex
    # セグメント別でデフォルトゲートウェイを変更
    switch($ipAddr) {
        ({$_ -like "192.168.1.*"}) {
             netsh interface ipv4 set address name=$IfIdx static $IPAddr 255.255.255.0 192.168.1.254
        }
        ({$_ -like "192.168.2.*"}) {
             netsh interface ipv4 set address name=$IfIdx static $IPAddr 255.255.255.0 192.168.2.254
        }
        ({$_ -like "192.168.3.*"}) {
             netsh interface ipv4 set address name=$IfIdx static $IPAddr 255.255.255.0 192.168.3.254
        }
    }
}

上記スクリプトでは、物理インターフェイスのみを対象として静的アドレスが設定されている場合、指定のデフォルトゲートウェイアドレスを設定しています。

ネットワークアダプターの一覧を取得

「Get-NetAdapter」コマンドレットを使うと実行端末のネットワークアラプターのリストが取得できます。

> Get-NetAdapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
VMware Network Adapte...8 VMware Virtual Ethernet Adapter for ...      11 Up           xx-xx-xx-xx-xx-xx       100 Mbps
VMware Network Adapte...1 VMware Virtual Ethernet Adapter for ...      10 Up           xx-xx-xx-xx-xx-xx       100 Mbps
イーサネット              Intel(R) Ethernet Connection (2) I21...       7 Up           xx-xx-xx-xx-xx-xx         1 Gbps

引数に「-Physical」を指定することで、物理ネットワークアダプターのみを取得する事ができます。

> Get-NetAdapter -Physical

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
イーサネット              Intel(R) Ethernet Connection (2) I21...       7 Up           xx-xx-xx-xx-xx-xx         1 Gbps

IP アドレスの取得

「Get-NetIPAddress」コマンドレットを使用すると IP アドレスを取得することができます。

> Get-NetIPAddress -InterfaceIndex [インデックス番号]

IPAddress         : 192.168.1.9
InterfaceIndex    : 7
InterfaceAlias    : イーサネット
AddressFamily     : IPv4
Type              : Unicast
PrefixLength      : 16
PrefixOrigin      : Manual
SuffixOrigin      : Manual
AddressState      : Preferred
ValidLifetime     : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource      : False
PolicyStore       : ActiveStore

インターフェイスインデックス番号を指定し、ネットワークアダプターに設定された IP アドレスを取得します。

今回は、IPv4 の静的 IP アドレスが設定されたネットワークアダプターを対象としていますので、抽出条件として「AddressFamily」と「PrefixOrigin」を指定しています。

ゲートウェイアドレスの設定

「New-NetIPAddress」コマンドレットを使用すると、IP アドレスやサブネットマスク・デフォルトゲートウェイなどが設定できるのですが、静的 IP アドレスが設定されているネットワークアダプターに「New-NetIPaddress」コマンドレットで IP アドレスを設定した場合、同じネットワークアダプターに 2 つ目の IP アドレスが設定されてしまいます。そのため、「Remove-NetIPAddress」コマンドレットを実行した後で「New-NetIPAddress」コマンドレットを実行する必要があるとのこと。

そこで「netsh」コマンドが使えますので、1 コマンドで済ませるため「netsh」を使用しています。

netsh interface ipv4 set address name=[インデックス番号] static $IPAddr 255.255.255.0 192.168.1.254

コマンドレットを使用する場合は、次のようになります。

Remove-NetIPAddress -InterfaceIndex [インデックス番号] -IPAddress [IPアドレス] -PrefixLength [マスク] -DefaultGateway [デフォルトゲートウェイ]
New-NetIPAddress -InterfaceIndex [インデックス番号] -IPAddress [IPアドレス] -PrefixLength [マスク] -DefaultGateway [デフォルトゲートウェイ]

bluenote by BBB