Windows7でもiptablesのFORWARDみたいな事がしたくってやってみたら出来なくなってた

Windows7内のXPモードであるWindowsXPで、TCPでポートを待ち受けるサーバー的なものを動かしたくて、どうにかしてポートフォワード*1をしようとしてます。sshポートフォワードとか色々方法を考えているとき、Linuxならiptablesフォワードがあったよなぁと思い出し、Windowsでも何かないかと調べてみたら、見つけました。
そして、Windows7だと出来ないことがわかったので、残念だけどそこまでをメモしておきます。


Windows7のXPモードにサーバーを立てて別PCからアクセスする - kanonjiの日記
ちなみにやりたかったのはこれです。結局iptables的なFORWARDは無理だったけど、学習も兼ねて、sshポートフォワード、stone、ルーティングテーブル書き換えの3つの方法でやってみました。

出来るはずだった方法

Remote Accsess and Routingサービス*2というものがあり、これを有効にするとWindowsでもiptablesっぽい事が出来るようになる。

Remote Accsess and Routingサービスを起動
>ipconfig /all

Windows IP 構成

   ホスト名 . . . . . . . . . . . . : mypc
   プライマリ DNS サフィックス . . . . . . . :
   ノード タイプ . . . . . . . . . . . . : ハイブリッド
   IP ルーティング有効 . . . . . . . . : はい
   WINS プロキシ有効 . . . . . . . . : いいえ

イーサネット アダプター ローカル エリア接続:
[snip]

Remote Accsess and Routingサービスが起動すると、このIP ルーティング有効はいになります。

もしくはレジストリで有効化

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters の IPEnableRouter のdwordを1にすればルーティング自体は許可になります。 その後適当にルートを追加。

https://twitter.com/pankazuda/status/228117970163990528

Twitterで教えてもらった話ではレジストリを変更しても、IP ルーティング有効はいになるとの事。結局ポートフォワードが出来なかったので、Remote Accsess and Routingサービスを使う場合と機能的な違いがあるのかどうか、わかりませんでした。

netshコマンドで設定
>netsh [コンテキスト((Linuxのサブコマンド?))] [サブコンテキスト]...

netshというコマンドで色々と設定できるようです。コンテキストと呼ぶサブコマンド的なものが沢山あります。正直ありすぎてよくわからない。

routing ip nat add/delete portmapping

IP routing commands | Microsoft Docs

検索したところ、ポートフォワードはroutingコンテキストのipサブコンテキストのnat*3addコマンドなどを書くという使い方になるらしい。

add portmapping name="Local Area Connection" tcp 0.0.0.0 80 10.0.0.1 80

http://technet.microsoft.com/ja-jp/library/cc754535(v=WS.10).aspx#BKMK_96

サブコンテキストまでが省略されてるけど、こんな使い方になるっぽい。

後述する理由によって、結局出来なかったからこれ以上はわからないけど、このコマンドで設定すれば普通にポートフォワードが出来そうな雰囲気ではあります。

出来ない理由

WindowsXPではRemote Accsess and Routingとnetsh natコマンドを使ってRouter化すればよかったけど、Windows7ではRRASを動かしただけでは、routingできている様子はないし、netshコマンドにNATの項目無いしなんでー?っておもってた。海外のフォーラムを漁ってみるとこんな情報が。

How to enable NAT on Windows 7...
I am not able to use netsh routing commands on WIndows 7. These commands work on Windows XP. Upon research I found that Windows 7 does not support routing commands. On Vista there was workaround by using "netsh add helper ipmontr.dll" and "netsh add helper ippromon.dll" but these commands does not work on Windows 7.

http://d.hatena.ne.jp/mad-capone/20110628/1309259276

なんとWindowsXPでは出来たことがWindows7で出来なくなってるんだとか。引用元ではnetsh natと書いてるが、こっちの環境でもnetsh routingが無いことを確認しました。routingコンテキストが無くちゃ、ポートフォワードは設定できません。

マイクロソフトめ・・・

余談

>netsh ?

使用法: netsh [-a エイリアス ファイル名] [-c コンテキスト] [-r リモート コンピュ
ーター名] [-u [ドメイン名\]ユーザー名] [-p パスワード | *]
              [コマンド | -f スクリプト ファイル名]

使用できるコマンドは次のとおりです:

このコンテキストのコマンド:
?              - コマンドの一覧を表示します。
add            - エントリの一覧に構成エントリを追加します。
advfirewall    - 'netsh advfirewall' コンテキストに変更します。
branchcache    - 'netsh branchcache' コンテキストに変更します。
bridge         - 'netsh bridge' コンテキストに変更します。
delete         - エントリの一覧から構成エントリを削除します。
dhcpclient     - 'netsh dhcpclient' コンテキストに変更します。
dnsclient      - 'netsh dnsclient' コンテキストに変更します。
dump           - 構成スクリプトを表示します。
exec           - スクリプト ファイルを実行します。
firewall       - 'netsh firewall' コンテキストに変更します。
help           - コマンドの一覧を表示します。
http           - 'netsh http' コンテキストに変更します。
interface      - 'netsh interface' コンテキストに変更します。
ipsec          - 'netsh ipsec' コンテキストに変更します。
lan            - 'netsh lan' コンテキストに変更します。
mbn            - 'netsh mbn' コンテキストに変更します。
namespace      - 'netsh namespace' コンテキストに変更します。
nap            - 'netsh nap' コンテキストに変更します。
netio          - 'netsh netio' コンテキストに変更します。
p2p            - 'netsh p2p' コンテキストに変更します。
ras            - 'netsh ras' コンテキストに変更します。
rpc            - 'netsh rpc' コンテキストに変更します。
set            - 構成の設定を更新します。
show           - 情報を表示します。
trace          - 'netsh trace' コンテキストに変更します。
wcn            - 'netsh wcn' コンテキストに変更します。
wfp            - 'netsh wfp' コンテキストに変更します。
winhttp        - 'netsh winhttp' コンテキストに変更します。
winsock        - 'netsh winsock' コンテキストに変更します。
wlan           - 'netsh wlan' コンテキストに変更します。

利用できるサブコンテキストは次のとおりです:
 advfirewall branchcache bridge dhcpclient dnsclient firewall http interface ips
ec lan mbn namespace nap netio p2p ras rpc trace wcn wfp winhttp winsock wlan

コマンドのヘルプを表示するには、コマンドの後にスペースを入れ、
 ? と入力してください。

netshのコンテキストの一覧です。各コンテキストの説明が意味をなしてないのも苛立ちを覚える*4んですが、firewalladvfirewallの似たコンテキスト、どうやら以前はfirewallコンテキストで設定した事がadvfirewallに移動してたりするらしいです。そういう変更を気軽に放り込んでくるのも、マイクロソフトのいやなところのひとつ。netshの情報源はあまり多くないので、ネットの情報が使えなくなってしまうよ・・・

routingコンテキストが別名になってたり、別のコンテキストで出来そうなのないかなと思ったけど、説明が書いてないのでよくわからない。

環境

OS Windows7 Professional 64bit

*1:XPモードはVirtual PCで動く普通の仮想マシンだけど、Virtual BoxやVMwareと違い、ホスト-ゲスト間をNATで繋ぐ事は出来ても、なんとポートフォワードの設定が出来ない中途半端な仮想化環境でした

*2:サービスの設定画面での説明は「企業ユーザーのために、ローカル エリア ネットワークとワイド エリア ネットワーク環境でのルーティング サービスを提供します。」

*3:サブサブコンテキスト、でいいのか?

*4:横幅固定のcmd.exeとかにもね