私はWebサービスアーキテクチャに取り組んでいます。 Vagrantではなく、ネイティブホストマシンで実行する必要のあるソフトウェアがあります。しかし、ゲストでいくつかのクライアントサービスを実行したいと思います。
Vagrantのconfig.vm.forwarded_port
パラメーターは、ホストのポートを開き、データをゲストに送信します。しかし、ゲストのポートを開いてホストにデータを送信するにはどうすればよいですか? (まだポート転送ですが、逆方向です。)
vagrant ssh
を実行すると、実際には次の基本コマンドが使用されます。
ssh -p 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR -o IdentitiesOnly=yes -i ~/.vagrant.d/insecure_private_key [email protected]
SSHは、-R guestport:Host:hostport
オプションを使用して、必要な方向のポートの転送をサポートします。したがって、ゲストのポート12345
に接続し、localhost:80
に転送する場合は、次のコマンドを使用します。
ssh -p 2222 -R 12345:localhost:80 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR -o IdentitiesOnly=yes -i ~/.vagrant.d/insecure_private_key [email protected]
Eeroが正しくコメントするので、コマンドvagrant ssh -- -R 12345:localhost:80
を使用することもできます。これは、より簡潔なコマンドで同じ効果があります。
Vagrantの作成者が書いた本Vagrant: Up and Running
(公開日:2013年6月12日)で、彼はゲストマシンがホストマシンで実行されているサービスにアクセスできないと述べました。
Forwarded Ports
を使用する代わりに、Host-Only Networks
を使用してプライベートネットワークをセットアップできます。
Host-Only Networks
をForwarded Ports
で使用することの長所
ゲストマシンは、ホストマシンで実行されているサービスにアクセスできます。
この機能はあなたの問題を解決します。
ゲストマシンは、他のゲストマシンで実行されているサービスにアクセスできます。
この機能は、サービスを複数のマシンに分離して、実稼働環境をより正確に模倣するのに非常に役立ちます。
安全な
外部マシンには、ゲストマシンで実行されているサービスにアクセスする方法がありません
より少ない作業
すべてのForwarded Port
を設定する必要はありません
Host-Only Networks
の構成方法
config.vm.network :"hostonly", "192.168.0.0"
#Vagrantバージョン#1
config.vm.network :private_network, ip: "192.168.0.0"
#Vagrantバージョン#2
Vagrantfile
にこの行があると、vagrantは静的IPアドレスを持つプライベートネットワークを作成するよう指示されます:192.168.0.0
ホストのIPアドレスは常に同じIPアドレスですが、最後のオクテットは1です。上記の例では、ホストマシンのIPアドレスは192.168.0.1
です。
ゲストOS内のデフォルトゲートウェイを介してホストマシンのポートにアクセスできます。 (通常、IPアドレスは10.0.2.2
です。)
たとえば、ホストマシンのポート8000で実行されているWebサーバーがある場合...
echo 'Hello, guest!' > hello
python -m SimpleHTTPServer 8000
Vagrant VMから10.0.2.2:8000
にアクセスできます(10.0.2.2
はゲストのデフォルトゲートウェイのIPです):
vagrant ssh
curl http://10.0.2.2:8000/hello # Outputs: Hello, guest!
ゲストOS内のデフォルトゲートウェイのIPを見つけるには、netstat -rn
(またはWindowsゲストでipconfig
)を実行し、0.0.0.0
(またはフィールド)の宛先IPを持つ行を探しますWindowsの「デフォルトゲートウェイ」というラベルが付いています):
$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 10.0.2.2 0.0.0.0 UG 0 0 0 eth0
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.33.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
このIPは、netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2
を使用してプログラムで抽出できます。
ソース: vagrant virtualboxマシンからHost PostgreSQLに接続する方法 ; VirtualBoxゲストOSからホストマシンに接続しますか?
ホストマシンの~/.ssh/config
に以下を追加します。
Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698
vagrant ssh
経由でログインしている限り、Vagrantからホストマシンポート52698のサービスにアクセスできます。
Vagrant VMでnetstat -lt
を実行し、次の行に注意することで、それが機能することを確認できます。
tcp 0 0 localhost:52698 *:* LISTEN
tcp6 0 0 ip6-localhost:52698 [::]:* LISTEN
ホストマシンで実行されているサービスに、ループバックアドレスではなくローカルIPアドレスを介してアクセスできます。ポート80(およびポート987)でhttpサーバーを作成し、curl
ing 197.45.0.10:80および197.45.0.10:987(実際のIPアドレスを変更して無実の人を保護)をテストしました。両方の時間で機能し、特別な浮浪者の設定はありません(public_network、forwarded_portはありません)。また、PuTTYを介して転送されるポートはありますが、ポート80と987は転送されません。したがって、ホストマシンのローカルまたはパブリックIPアドレスを使用してみてください。
また、別のゲストVagrantインスタンスにアクセス(ssh)する場合は、public_network
を有効にし、次のようにVagrantfile
のポート22から転送できます。
config.vm.network "public_network"
config.vm.network "forwarded_port", guest: 22, Host: 2200
その後、そのポートが開いている限り(つまり、ルーター構成でさらにポート転送を行う)、どこからでも、外の世界からでもそのマシンにアクセスできます。