Windows7のXPモードにサーバーを立てて別PCからアクセスする

XPモードのほうにちょっとサーバー的なものを立ち上げて、隣にあるMacBookからアクセスしたいって事があって、色々と試行錯誤しました。簡単にやる方法も見つかってたけど、途中から手段が目的になって、色々調べたのでまとめておきます。

前提

XPモードはWindows VirtualPCによる仮想マシンなので、VirtualBoxVMwareなどと同じように、ホスト(Windows7)とゲスト(XPモード)という関係になります。Windows VirtualPCが微妙な事に、ネットワークをNATにした場合に、*1ポートフォワード機能を持ってません。ネットワークアドレスは変換するけど、ポートは見てないわけです。
他の手段として調べてみたけどWindows7でもiptablesのFORWARDみたいな事がしたくってやってみたら出来なくなってた - kanonjiの日記で、ホスト側の転送機能はWindows7から使えなくなっている事が分かりました。

ネットワークをブリッジすればそもそも簡単

一番簡単な方法です。デフォルトでは共有ネットワーク(NAT)になっているネットワークの設定をブリッジに変更するだけです。ホストと同じネットワークに参加し、同じネットワークから普通にアクセス出来ます。

ブロードバンドルーター(ゲートウェイ) 192.168.1.1
ホスト 192.168.1.2
MacBook 192.168.1.3
XPモード 192.168.1.4

まぁこんな感じで、ホストからXPモードも、MacBookからXPモードも、その逆も通信可能です。

なんとかNATのままでやる方法

ブリッジ使うと終わってしまうのだけど、IPアドレスが管理されててブリッジにしてホストと同じネットワークのIPを取得するには許可が必要だとか、ホストがノートPCで、公衆無線LANとか使うからブリッジはしたくないとか、そういう場合になんとかNATのまま、XPモードと通信する方法を調べました。

NATの場合の前提

Interactive shell for nwdiag

VirtualPC NAT Routerと実物のRouterが繋がっちゃってるあたりが、ちょっとおかしいけど*2、概ねこんな感じのネットワークになります。VirtualPC NAT Routerは実際には存在しない仮想のルーターで、Main LANネットワーク側のIPは持ってません。
なので、ホスト側からVirtualPC NAT Routerにアクセスしたり、VirtualPC NAT Routerを介してXPモードにアクセスする経路がありません。あと、RouterからもVirtualPC NAT Routerは検知出来ないので、本当はつなげちゃうとちょっとおかしな事に。ネットワーク図で表せない形でVirtualPCがうまいこと変換してるんだと思います。

XPモード 192.168.131.65
ゲートウェイ 192.168.131.254
DHCP 192.168.131.254
DNS 192.168.1.1

XPモード側のネットワークの設定は、すべてDHCP*3任せとなっていて、こんな設定になります。
ここでおかしいのがDNSで、なぜかMain LANネットワークにあるブロードバンドルーターを指定しています。前述の通り、ネットワーク図的にはつなげられない経路で、実際にXPモードからping 192.168.1.1しても応答ありません。

詳しくは後で補足に書くけど、ブラウザからいろんなところにアクセスする分には、DNS設定がこのままでも何故か問題ありません。が、色々考えてこれはバグなんじゃないかと思っています。

準備

Windows VirtualPCのNATだと、ポートフォワード機能がないどころか、どうやらホストからはアクセス出来ないネットワークになっている様子。VirtualPCの場合、どうやらブリッジにしないとホストとゲスト間の通信が出来ないようで、とはいえ前述の通りそのままブリッジを使うのは避けるのが目的です。
そこでMicrosoft Loopback Adapterを使います。Windows7Microsoft Loopback Adapterを追加し、VirtualPCの設定でXPモードにNICを追加して、NATとMicrosoft Loopback Adapterのブリッジの2つのNICを設定することで、ゲストからインターネットへはNAT、ホストとゲスト間はMicrosoft Loopback Adapterブリッジで通信する方法です。

  1. [スタート] ボタンをクリックし、[設定] をポイントします。次に [コントロール パネル] をクリックし、[ハードウェアの追加と削除] をダブルクリックします。
  2. [デバイスの追加/トラブルシューティング] をクリックし、[次へ] をクリックします。
  3. [新しいデバイスの追加] をクリックし、[次へ] をクリックします。
  4. [いいえ、一覧からハードウェアを選択します] をクリックし、[次へ] をクリックします。
  5. [ネットワーク アダプタ] をクリックし、[次へ] をクリックします。
  6. [製造元] ボックスの一覧で、[Microsoft] をクリックします。
  7. [ネットワーク アダプタ] ボックスの一覧で、[Microsoft Loopback Adapter] をクリックし、[次へ] をクリックします。
  8. [完了] をクリックします。

Microsoft Loopback Adapterのインストールはこんな手順。

  1. XPモードの設定のネットワークで、ネットワークアダプタの数を2に設定。
  2. アダプター1は「共有ネットワーク(NAT)」のまま。
  3. アダプター2に「Microsoft Loopback Adapter」を選択*4
IP 192.168.200.1
サブネットマスク 255.255.255.0
ゲートウェイ 192.168.200.2

ホスト側でMicrosoft Loopback AdapterにIPアドレスを静的に設定。

IP 192.168.200.2
サブネットマスク 255.255.255.0
ゲートウェイ 設定するとインターネットへ出る通信がNATではなく、このブリッジの方を通ってしまう可能性がある

ゲスト側にもMicrosoft Loopback AdapterにIPアドレスを静的に設定。
これでホスト/ゲスト間の通信経路は確保できて準備完了です。

Interactive shell for nwdiag

Microsoft Loopback Adapterを使ってブリッジを組むと、ネットワーク図はこんな感じなります。これでホストや図でMain LANとなっている同じネットワーク上のPCからの経路が出来ました。

方法1) sshポートフォワード

Linuxであればよく使う手段でsshポートフォワードがあります。ただ、Windowsだとsshクライアントはいくつか選択肢があるけど、sshdに関しては正直微妙。オープンソースではないfreeSSHdか、cygwin.dllを同梱したOpenSSH for Windows、あとはCygwinを入れるくらい。

$ ssh -L 14444:192.168.200.2(XP-mode):4444 192.168.1.2(Win7)

ローカルフォワード。MacBookからWindows7sshコネクションを張り、MacBookのポート14444をWindows7を介してXPモードのポート4444に転送します。

$ ssh -R 14444:192.168.200.2(XP-mode):4444 192.168.1.3(MacBook)

Windowssshdを立てるのが割りと面倒なので、逆にリモートフォワードという手があります。上記と同じようにMacBookのポート14444をXPモードの4444に転送する目的は同じだけど、sshコネクションはWindows7からMacBook上のsshdに張ります。別PCもWindowsだと、どちらにせよsshdを立てないとだけど、Macならsshdは組み込まれてるので簡単です。

方法2) stone

アプリケーションレベルのTCP/UDPリピーターのstoneを使う方法です。stoneは存在は知ってたけど今まで使う機会も無かったので、試しに使ってみることにしました。

C:\path\to\stone.exe 192.168.200.2:4444 14444
Aug 26 12:09:19.075000 7076 start (2.3e) [4368]
Aug 26 12:09:24.208000 7076 stone 124: 192.168.200.2:4444 <- 0.0.0.0:14444

ホストであるWindows7でstoneを起動すると、ホストの1444ポートへの通信をXPモードの4444ポートに転送できます。ホスト側で何か用意するなら、stoneはコンパクトでシンプルなのでsshdを立てるよりもstoneの方が気軽かも。udpだけとかsslとか、起動オプションの指定次第で色々出来る。

方法3) ルーティングテーブル書き換え

ここまでくると、やってみたいからという手段が目的化してるんだけど、ルーティングテーブルの書き換えもやってみました。MacBookは持ち歩いて使うから、この設定は常用しないけど。

$ sudo route add -net 192.168.200.0/24 192.168.1.11
add net 192.168.200.0: gateway 192.168.1.11

MacBookのルーティングテーブルに、XPモードが居るブリッジネットワークへ、Windows7を経由する経路を設定。

C:\Documents and Settings\XPMUser>route add 192.168.1.0 mask 255.255.255.0 192.168.200.1

逆にXPモードからMacBookに応答するための経路も、同様にWindows7を経由する経路を設定。

$ traceroute -I 192.168.200.2
traceroute to 192.168.200.2 (192.168.200.2), 64 hops max, 60 byte packets
 1  192.168.1.11 (192.168.1.11)  1.887 ms *  0.413 ms
 2  192.168.200.2 (192.168.200.2)  1.387 ms  1.009 ms  0.731 ms

これだけで、MacBookからXPモードに、転送的なこと無しで通信出来るようになります。-IオプションはICMPを使うようにするオプション。どうやらデフォルトだとtracerouteはUDPを使うようで、どっかのファイアウォールUDPが止まってて、tracerouteで経路が確認出来なかったので。

$ netstat -rn -f inet

MacIPv4に限定してルーティングテーブルを確認するコマンド。

>route PRINT

WindowsXPでルーティングテーブルを確認するコマンド。

補足

VirtualPCとXPモードのデフォルト設定は不可解
C:\Documents and Settings\XPMUser>nslookup www.google.co.jp
DNS request timed out.
    timeout was 2 seconds.
*** Can't find server name for address 192.168.1.1: Timed out
*** Default servers are not available
Server:  UnKnown
Address:  192.168.1.1

DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
*** Request to UnKnown timed-out

デフォルト設定だと、ゲートウェイDHCPVirtualPCの仮想ルーターなのに、DNSだけ実ルーターに設定されます。そこは通信出来ないはずで、その通りnslookupでルックアップ出来ません。

C:\Documents and Settings\XPMUser>ping www.google.co.jp

Pinging www-cctld.l.google.com [74.125.235.151] with 32 bytes of data:

Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 74.125.235.151:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),

なのに、pingコマンドにドメイン渡すとIPが引けて、ブラウザからドメイン入力しても普通にアクセスできます。

C:\Documents and Settings\XPMUser>nslookup www.google.co.jp
DNS request timed out.
    timeout was 2 seconds.
*** Can't find server name for address 192.168.131.254: Timed out
*** Default servers are not available
Server:  UnKnown
Address:  192.168.131.254

Non-authoritative answer:
Name:    www-cctld.l.google.com
Addresses:  74.125.235.183, 74.125.235.191, 74.125.235.184
Aliases:  www.google.co.jp

ゲートウェイ/DHCPが192.168.131.254なんだから、ほんとはDNSも192.168.131.254なんじゃないかと思って設定してみたけどダメでした。ただ、別のサーバーが応答してくれたようです。仕組みは謎。あと、ブラウザで2秒のルックアップのタイムアウトを感じなかった。

C:\Documents and Settings\XPMUser>nslookup www.google.co.jp
Server:  google-public-dns-a.google.com
Address:  8.8.8.8

Non-authoritative answer:
Name:    www-cctld.l.google.com
Addresses:  74.125.235.95, 74.125.235.87, 74.125.235.88
Aliases:  www.google.co.jp

よく分からないので、とりあずGoogle Public DNSを設定してお茶を濁してみました。

環境

OS Windows7 Professional 64bit

書いた日

2012-08-11
例によって下書きのまま放置してた

*1:VirtualBoxなどの他の仮想化は当たり前に出来る

*2:こうとしか書きようが無いし

*3:VirtualPC NAT Router

*4:VirtualPCでは、ブリッジとは書いてなく、NICを選択するとそのNICを使ったブリッジになる。