読者です 読者をやめる 読者になる 読者になる

VMware Fusion4以降 のポートフォワーディングまわり のまとめ

結構昔に書いたブログから自分の中で情報をアップデートできたので、まとめる。

説明内容にインフラ的に正しくない説明が混ざるかもしれないが、ご容赦をm( )m 説明は、ホスト:Mac仮想マシンLinux、の前提。

at your own risk でお願いします。

2014/04/18 間違いを修正しました。

例で設定する内容のイメージ

項目 設定値/状態
MacIPアドレス 203.0.113.99
仮想マシンの名前 sample
仮想マシンMACアドレス 00:11:22:33:AA:BB
仮想マシンIPアドレス 192.168.78.131
203.0.113.99:80 仮想マシンsampleの80番ポートに転送
203.0.113.99:443 仮想マシンsampleの443番ポートに転送

設定ファイル

以下のディレクトリに格納されている。

/Library/Preferences/VMware\ Fusion

ディレクトリ内の主なファイルを書き出すと、、、

/Library/Preferences/VMware\ Fusion/networking : サブネットマスクなどの設定が書かれているファイル

/Library/Preferences/VMware\ Fusion/vmnet8/dhcpd.conf : vmnet8で使うIPアドレスの帯域と、DHCPIPアドレスの割当)を設定する。

/Library/Preferences/VMware\ Fusion/vmnet8/nat.conf : vmnet8向けのNATの設定。ネットワークをNATで使用する場合、このファイルでポートフォワーディングの設定ができる。

DHCPの設定

使用するファイルは、dhcpd.conf

ポートフォワーディングをする場合、転送先のIPアドレスがころころ変わるとめんどくさいので、IPアドレスを割り当てて固定しておく。

仮にvmnet8のsubnetの設定が以下のように書かれていたとする。(ここの設定は変えだすと大変。)

subnet 192.168.78.0 netmask 255.255.255.0 {
  range 192.168.78.128 192.168.78.254;
  option broadcast-address 192.168.78.255;
  option domain-name-servers 192.168.78.2;
  option domain-name localdomain;
  default-lease-time 1800;                # default is 30 minutes
  max-lease-time 7200;                    # default is 2 hours
  option netbios-name-servers 192.168.78.2;
  option routers 192.168.78.2;
}

仮想マシン側に割り当て可能なIPアドレスは、192.168.78.128 から 192.168.78.254 ということになる。

例えば、sampleという名前の仮想マシン(この名前はなんでも良い)にIPアドレス192.168.78.131で割り当てるとする。 まずは、sample仮想マシン側のMACアドレスを把握する。

% ifconfig
eth0      Link encap:Ethernet  HWaddr 00:11:22:33:AA:BB
          inet addr:192.168.78.131  (後略)

上記のeth0に表示されたHWaddrの値00:11:22:33:AA:BBが、それ。

eth0を使っているかどうかは、仮想マシン内の設定に依存するので例として。

Macアドレスを把握できたら、あとは、dhcpd.confに設定を書く。最小限以下の内容が必要。

(デフォルトだと、dhcpd.confの内部にEnd of "DO NOT MODIFY SECTION"みたく書かれているので、その行よりも下に)

host sample {
  hardware ethernet 00:11:22:33:AA:BB;
  fixed-address 192.168.78.131;
}

この設定は、仮想マシン分、追加していくことが可能。

ポートフォワーディングの設定

使用するファイルは、nat.conf

例えば、80番ポート(httpのデフォルト)、443番ポート(httpsのデフォルト)を仮想マシンに転送するように設定する。

nat.conf[incomingtcp]セクションに、以下のように追記する。

80 = 192.168.78.131:80
443 = 192.168.78.131:443

結果nat.conf[incomingtcp]セクションは、以下の様に書かれている状態になる。

[incomingtcp]

# Use these with care - anyone can enter into your VM through these...
# The format and example are as follows:
#<external port number> = <VM's IP address>:<VM's port number>
#8080 = 172.16.3.128:80

80 = 192.168.78.131:80
443 = 192.168.78.131:443

この設定も仮想マシン分、設定を追加していくことが可能だが、転送する元(Mac側)のポートの重複は許可されない。

VMware Fusionのネットワーク設定の反映

sudoにて、以下のコマンドを実行することで、VMware Fusionのネットワーク周りをコントロールできる。

/Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli

必須の実行時オプションは以下のとおり。

  • --start : ネットワークプログラムの起動(nat, dhcp含む)
  • --stop : ネットワークプログラムの停止(nat, dhcp含む)
  • --status : 起動状況の確認
  • --configure: ネットワークプログラムの設定の初期化

configureの挙動は、、、

  • vmnet8/nat.conf : 既存の設定をバックアップし、初期化される
  • vmnet8/dhcpd.conf : 既存の設定がある場合、何もしない。既存の設定がなければ、新しく設定される。
  • networking : 既存の設定がある場合、何もしない。既存の設定がなければ、新しく設定される。

なので、設定ファイルを更新した後は、、、

/Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --stop
/Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --start

してあげれば良い。

ちなみに、VMware Fusionのネットワークの設定は、VMware Fusion自体が起動中のみ有効で、起動時に設定を読み込むようになっている。

そのため、VMware Fusion自体(アプリケーション自体)を終了→起動してあげても、設定は反映される。

トラブルシューティング

  • nat.confにポートフォワーディングの設定を追加しても、うまく転送されない。
  • 仮想マシンから、ネットワークに接続できなくなる。

こんな症状の場合は、以下のケースで疑う。

まずは原因調査。vmnet-cliの出力を確認する。

% sudo /Applications/VMware\ Fusion.app/Contents/Library/vmnet-cli --start
Enabled hostonly virtual adapter on vmnet1
Started DHCP service on vmnet1
Failed to start NAT service on vmnet8
Enabled hostonly virtual adapter on vmnet8
Started DHCP service on vmnet8
Failed to start some/all services

ここでは、NATが失敗している場合の話に限定して進めていく。他の失敗は、ぐぐって。

追加でさらに、VMware Fusionが起動されている状態で、VMware Fusionnatdを実行してみる。 (sudoで。)

/Applications/VMware\ Fusion.app/Contents/Library/vmnet-natd -s 7 -m /Library/Preferences/VMware\ Fusion/vmnet8/nat.mac -c /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf

Could not ...みたいに出ている場合、

  • 既にポートが使用中。(Macapacheが有力。)
    • ごにょごにょする。
  • MacのFirewallで引っかかっている(?)
    • Firewallの設定をシステム環境設定から確認、変更する。

書式がおかしいみたいに出ている場合 - 本当に書式がおかしい。 - nat.confの書き方を確認、修正する。

すでにポートが使用中の場合

MacがデフォルトでApacheを立ち上げてしまっていて、そのポートに干渉するパターンが多い気がしている。

対応としては、apacheの設定ファイルを書き換え、apacheを再起動する。

/etc/apache2/httpd.conf

上記のファイルを修正する。

(前略)
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 80

Listenに指定されたポート番号を変えてあげる。MacのSitesフォルダへアクセスするURLが変わることに注意。

例えば、、、

Listen 8080

そして、Apacheを再起動する。(sudoで)

/usr/sbin/apachectl restart

再度、vmnet-cli --startしてみて、うまく行けばOK。いかなかったら、、、他に立ち上がっているウェブサーバーをチェックしてみる。

追記:VMware Fusionのアップデート後

VMware Fusionがソフトウェアアップデートされた場合、nat.confがリセットされている可能性がある。

正確には、ソフトウェアアップデート後、ネットワーク関連の設定ファイルを見てみると、

  • networking は、そのまま。
  • dhcpd.conf は、バックアップが作成されている。(リセットされる可能性もあるのかもしれない。)
  • nat.conf は、バックアップが作成され、設定がリセットされている。

ちなみにこの挙動は、VMware Fusion のソフトウェアップデートがメジャーアップデートかマイナーアップデートかには依存しない(気がする)。

ソフトウェアップデート後は、以下の対応を。

  • 設定ファイルを確認。( networkingdhcpd.confnat.conf
  • 変更されているファイルを設定し直す。( networkingdhcpd.confnat.conf
  • VMware Fusion のネットワークをリスタートする。( vmnet-cli --stop & vmnet-cli --start

付録

subnetを変更する場合

以下のMac側のファイルが修正対象

/Library/Preferences/VMware Fusion/networking
/Library/Preferences/VMware Fusion/vmnet8/nat.conf

さらに、仮想マシン側の以下のファイル(例)も修正する必要がある。

/etc/resolv.conf
/etc/sysconfig/network
/etc/sysconfig/network-scripts/ifcfg-eth0