Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

Windowsでポートフォワーディングを設定する方法!netsh portproxyの使い方を徹底解説

Windowsでは、サードパーティ製ツールを使用せずに、すべてのバージョンでネットワークポートのフォワーディング(転送)を構成できます。ポートフォワーディングルールを利用すると、ローカルTCPポートに届いた着信接続(IPv4またはIPv6)を、別のポート番号へ、さらにはリモートコンピューターのポートへもリダイレクトできます。また、Windows上で特定のTCPポートをリッスンするサービスが動作している必要はありません。Windowsのポートフォワーディングは、ファイアウォールを回避したり、内部ホストやサービスを外部ネットワークから隠す(NAT/PAT)目的でよく使われています。

Linuxの世界では、iptablesやfirewalldを使えばポートフォワーディングは比較的簡単に設定できます。Windows Server環境では、通常「ルーティングとリモートアクセスサービス(RRAS)」を使ってポートのリダイレクトを構成します。しかし、実はもっと簡単な方法があり、それはどのWindowsバージョンでも問題なく動作します。本記事ではその方法を詳しく解説します。

netsh portproxyを使ったWindows 10でのポートフォワーディング設定方法

Windowsでポートフォワーディングを設定するには、NetshコマンドのPortproxyモードを使用します。コマンドの構文は以下のとおりです。

netsh interface portproxy add v4tov4 listenaddress=ローカルIP listenport=ローカルポート connectaddress=転送先IP connectport=転送先ポート

各パラメーターの意味は次のとおりです。

  • listenaddress – 着信接続を待ち受けるローカルIPアドレス(複数のNICや、1つのインターフェースに複数のIPアドレスがある場合に便利です);
  • listenport – 待ち受けるローカルTCPポート番号;
  • connectaddress – 接続をリダイレクトするローカルまたはリモートのIPアドレス(DNS名も指定可能);
  • connectportlistenportからの接続を転送するTCPポート。

また、v4tov6v6tov4v6tov6オプションを使えば、IPv4とIPv6アドレス間のポートフォワーディングルールを作成することもできます。

具体例:RDPを非標準ポートで応答させる

ここでは、RDPサービスが非標準ポート(例:3340)で応答するように設定する例を紹介します(RDPのポート自体はリモートデスクトップの設定で変更可能ですが、ここではポートフォワーディングの仕組みを分かりやすく示すためにRDPを使用します)。この場合、TCPポート3340宛ての着信トラフィックを、ローカルの別ポートである3389(RDPのデフォルトポート)へリダイレクトします。

なお、listenportに指定するローカルポート番号が、他のサービスやプロセスによって使用されていないことを確認してください。以下のコマンドで確認できます。

netstat -na|find "3340"

PowerShellのTest-NetConnectionコマンドレットを使って、ポートがローカルでリッスンされていないことを確認することもできます。

Test-NetConnection -ComputerName localhost -Port 3340

ポートフォワーディングルールを作成するには、管理者としてコマンドプロンプトを起動し、次のコマンドを実行します。

netsh interface portproxy add v4tov4 listenport=3340 listenaddress=10.1.1.110 connectport=3389 connectaddress=10.1.1.110

ここで「10.1.1.110」は、このコンピューターの現在のIPアドレスです。

次に、netstatツールを使って、Windowsがローカルポート3340でリッスンしていることを確認しましょう。

netstat -ano | findstr :3340

注意:このコマンドが何も返さず、netsh interface portproxyによるポートフォワーディングが機能しない場合は、コンピューター上でiphlpsvc(IP Helper)サービスが実行されているかどうかを確認してください。

また、ポートフォワーディングルールを作成するネットワークインターフェースで、IPv6サポートが有効になっている必要があります。

これらはポートフォワーディングが正しく動作するための前提条件です。IP Helperサービスが動作しておらず、IPv6サポートが有効になっていない場合、ポートのリダイレクトは機能しません。

Windows Server 2003/XPでポートフォワーディングを機能させるには、さらにレジストリキー HKLM\SYSTEM\ControlSet001\Services\Tcpip\Parameters の IPEnableRouter パラメーターを 1 に設定する必要があります。

リモートコンピューターからの接続テスト

指定されたポートでリッスンしているプロセスは、PID(この例では636)を使って特定できます。

tasklist | findstr 636

それでは、リモートコンピューターから任意のRDPクライアントでこのポートに接続してみましょう。RDPポート番号として3340を指定します。ポート番号は、RDPサーバーアドレスの後にコロンを付けて指定します。例:10.10.1.110:3340

これでRDP接続が正常に確立されるはずです。

リモートコンピューターへの転送

着信TCP接続をリモートコンピューターへ転送したい場合は、次のコマンドを使用します。

netsh interface portproxy add v4tov4 listenport=3389 listenaddress=0.0.0.0 connectport=3389 connectaddress=192.168.100.101

このルールにより、このコンピューターのローカルTCPポート3389に届くすべてのRDPトラフィックが、IPアドレス192.168.100.101のリモートホストへ転送されます。

なお、ローカルポートをリモートサーバーへ転送する方法としては、WindowsのSSHトンネルを利用する手段もあります。

Windowsでのポートフォワーディングルールの管理

重要:ファイアウォール(Microsoft Windows Defenderファイアウォール、またはウイルス対策ソフトに同梱されていることが多いサードパーティ製ファイアウォール)が、新しいポートへの着信接続を許可していることを確認してください。Windows Defenderファイアウォールに新しい許可ルールを追加するには、次のコマンドを使用します。

netsh advfirewall firewall add rule name="forwarded_RDPport_3340" protocol=TCP dir=in localip=10.1.1.110 localport=3340 action=allow

PowerShellのNew-NetFirewallRuleコマンドレットを使うこともできます。

New-NetFirewallRule -DisplayName "forwarder_RDP_3340" -Direction Inbound -Protocol TCP -LocalPort 3340 -Action Allow

Windows Defenderファイアウォールのグラフィカルインターフェースでポート3340の着信ルールを作成する場合、プログラムとの関連付けは不要です。このポートはネットワークドライバーによってのみリッスンされるためです。

Windowsのポートフォワーディングルールはいくつでも作成できます。netsh interface portproxyのすべてのルールは永続化されており、Windowsを再起動してもシステムに保持されます。

ただし、Windows Server 2012 R2でサーバー再起動後にポートフォワーディングルールがリセットされた事例もあります。その場合は、ネットワークインターフェースが定期的に切断されていないか、OS起動時にIPアドレスが変わっていないかを確認してください(動的DHCPではなく静的IPを使用するのが望ましいです)。回避策として、起動時にnetsh interface portproxyルールを実行するバッチスクリプトをタスクスケジューラに登録する方法があります。

アクティブなルールの一覧表示

Windowsで有効なTCPポートフォワーディングルールの一覧を表示するには、次のコマンドを実行します。

netsh interface portproxy show all

この例では、ローカルポート3340から3389への転送ルールが1件だけ登録されています。

Listen on ipv4:             Connect to ipv4:
Address         Port        Address         Port
--------------- ----------  --------------- ----------
10.1.1.110      3340        10.1.1.110      3389

ヒント:portproxyの設定を一覧表示するには、次のコマンドも使えます。

netsh interface portproxy dump

#========================
# Port Proxy configuration
#========================
pushd interface portproxy
reset
add v4tov4 listenport=3340 connectaddress=10.1.1.110 connectport=3389
popd
# End of Port Proxy configuration

ルールの削除

特定のポートフォワーディングルールを削除するには:

netsh interface portproxy delete v4tov4 listenport=3340 listenaddress=10.1.1.110

既存のすべてのマッピングルールを削除し、ポートフォワーディングテーブルを完全にクリアするには:

netsh interface portproxy reset

重要:この転送方式はTCPポート専用です。UDPポートはこの方法では転送できません。また、connectaddressにループバックインターフェース127.0.0.1を使用することはできません。

UDPトラフィックのポートフォワーディングを設定したい場合は、RRASとNATロールがインストールされたWindows Serverを使用してください。サーバーインターフェース間のポートフォワーディングは、グラフィカルスナップイン(rrasmgmt.msc)または次のコマンドで構成できます。

netsh routing ip nat add portmapping Ethernet1 udp 0.0.0.0 53 192.168.100.100 53

応用:リモートサービスをローカルで動作しているように見せる

portproxyのもうひとつの便利な機能は、任意のリモートネットワークサービスがローカルで動作しているように見せかけられることです。

たとえば、ローカルポート5555への接続を、IPアドレス157.166.226.25のリモートHTTPサーバー(CNNのWebサイト)へリダイレクトしてみましょう。

netsh interface portproxy add v4tov4 listenport=5555 connectport=80 connectaddress=157.166.226.25 protocol=tcp

この状態でブラウザーから https://localhost:5555/ にアクセスすると、CNNのトップページが表示されます。ブラウザーはローカルコンピューターにアクセスしているにもかかわらず、外部Webサーバーのページが開くというわけです。

ポートフォワーディングルールは、物理NICの外部IPアドレスのポートを、同じホスト上で動作する仮想マシンのポートへ転送する用途にも使えます。Hyper-Vの場合は、仮想スイッチレベルでポートフォワーディングを構成できます(後述)。

なお、WindowsはTCPポートの範囲指定転送には対応していません。複数のポートを転送する必要がある場合は、portproxyルールを手動で複数作成しなければなりません。最も簡単な方法は、メモ帳などで異なるポート番号を指定した netsh interface portproxy add コマンドのリストを生成し、それをコマンドプロンプトに貼り付けて実行することです。

Hyper-Vサーバーでのポートフォワーディング

コンピューターでHyper-Vロールを使用している場合(Windows 10およびWindows Serverにインストールできるほか、無償のHyper-V Serverとしても利用可能)、PowerShellを使ってDNATポートフォワーディングルールを構成できます。ここでは、Hyper-Vホストが受信したすべてのHTTPSトラフィックを、ホスト上で動作する仮想マシンのIPアドレスへリダイレクトする例を紹介します。この操作には、Hyper-VのStaticMappingコマンドを使用します。

まず、NAT対応の仮想スイッチを作成します。

New-VMSwitch -Name "HTTPS-NAT" -SwitchType NAT -NATSubnetAddress 192.168.100.0/24

次に、対象の仮想マシンをこの仮想スイッチに接続し、このHyper-V仮想スイッチ経由で接続されるすべての仮想マシンに対してアドレス変換ルールを有効にします。

New-NetNat -Name HTTPS-NAT -InternalIPInterfaceAddressPrefix 192.168.100.0/24
Add-NetNatStaticMapping -ExternalIPAddress "0.0.0.0/24" -ExternalPort 443 -Protocol TCP -InternalIPAddress "192.168.100.77" -InternalPort 443 -NatName HTTPS-NAT

これらのPowerShellコマンドを実行すると、Hyper-Vホストのポート443に届くすべてのHTTPSトラフィックが、仮想マシンのプライベートIPアドレスへ転送されるようになります。

  1. Windows 10 でリモートデスクトップのポート番号(RDP)を変更する方法

    Windows 10 の「リモートデスクトップ」機能をご存じの方は多いでしょう。職場や自宅の別のコンピューターに離れた場所からアクセスするために、この機能を活用している方も少なくありません。例えば、急ぎで会社のPCに保存したファイルが必要になったとき、リモートデスクトップはまさに救世主となります。このように、遠隔地から自分のPCへアクセスしたい場面はさまざまあります。 通常、リモートデスクトップを使うには、ルーターでポート転送(ポートフォワーディング)の設定を行うだけで簡単に利用できます。しかし、ルーターを経由せずインターネットに接続している環境では、リモートデスクトップ機能を使用するためにポ

  2. Windows 10でポート転送(ポートフォワーディング)を設定する方法

    Windows 10には、ポート転送(ポートフォワーディング)機能が標準で搭載されています。ただし、この機能は「設定」アプリの画面には表示されておらず、コマンド操作でのみ利用可能です。ポート転送を活用すれば、ネットワーク上のリソースをまるでローカルマシン上で動作しているかのようにアクセスできるため、LAN(ローカルエリアネットワーク)環境での作業やWebサーバー開発の際に非常に便利です。 本記事では、実際にポート転送ルールを追加する手順を詳しく解説します。例として、「https://127.0.0.1:9000」へのアクセスを「https://192.168.0.10:80」へ転送するルールを