バグランスリバースポートフォワーディング?


121

私はWebサービスアーキテクチャに取り組んでいます。Vagrantではなく、ネイティブホストマシンで実行する必要のあるソフトウェアがいくつかあります。しかし、ゲストでいくつかのクライアントサービスを実行したいと思います。

Vagrantのconfig.vm.forwarded_portパラメーターはホストのポートを開き、データをゲストに送信します。しかし、どうすればゲストのポートを開いてデータをホストに送信できますか?(それでもポート転送ですが、逆方向です。)


VagrantはSSHを使用しているため、理論的には可能であり、RubyのSSH実装gemはこれをサポートしていますが、Vagrantのドキュメントでこのようなものを見たことはありません。
cmur2

次も参照してください:stackoverflow.com/q/19933550/1157054
Ajedi32 '2015

回答:


134

を実行するとvagrant ssh、実際には次の基本的なコマンドが使用されます。

ssh -p 2222 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o LogLevel=ERROR -o IdentitiesOnly=yes -i ~/.vagrant.d/insecure_private_key vagrant@127.0.0.1

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 vagrant@127.0.0.1

Eeroが正しくコメントするので、コマンドを使用することもできますvagrant ssh -- -R 12345:localhost:80。これは、より簡潔なコマンドでも同じ効果があります。


67
あなたは、これがより簡単に使用して実行することができますvagrant ssh -- -R 12345:localhost:80 。これは、sshオプションの構文は次の-R ポート:ホスト:ホスト側:[bindするアドレス]最初の数はゲストマシン内で待機するポート番号、および最後の二つである、あるサービスのアドレスをホストマシンから見えるように。
Eero 2013年

1
私が理解している限り、リバース転送は対応するsshシェルでのみ機能します。Dan Fabulichは、vmにsshする必要のないソリューションを望んでいたと思います。
Alp

2
@Alp sshプロセスだけでなく、システム全体で利用できるポートだと思います。私にとってはうまくいきます!
Henrik Heimbuerger 2014年

1
PuTTyを使用するユーザーの場合、構成GUIのSSH /トンネルセクションでは、リモートポート転送(したがって、コマンドの-R)またはローカルポート転送(コマンドラインの-L)の両方が許可されます
Titou

3
または、複数の浮浪者設定がある場合、浮浪者の潜在的に異なる構成を説明するもの:vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
ibizaman

100

Vagrant: Up and RunningVagrantの作成者が書いた本(発行日:2013年6月12日)で、ゲストマシンはホストマシンで実行されているサービスにアクセスできないと述べました。

を使用する代わりに、を使用Forwarded Portsしてプライベートネットワークを設定できますHost-Only Networks

  • 使用しての賛否Host-Only Networksを超えますForwarded Ports

    1. ゲストマシンはホストマシンで実行されているサービスにアクセスできます

      この機能はあなたの問題を解決します。

    2. ゲストマシンは、他のゲストマシンで実行されているサービスにアクセスできます

      この機能は、サービスを複数のマシンに分割して、実稼働環境をより正確に模倣するのに非常に役立ちます。

    3. 安全

      外部マシンには、ゲストマシンで実行されているサービスにアクセスする方法がありません

    4. より少ない作業

      すべてを構成する必要はありません 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含めると、静的IPアドレスを持つプライベートネットワークを作成するようにvagrantに指示します。192.168.0.0

    ホストのIPアドレスは常に同じIPアドレスですが、最後のオクテットは1です。前の例では、ホストマシンはIPアドレスを持っています192.168.0.1


2
同じように(からもVagrant: Up and Running)、ブリッジネットワークをセットアップできます。ブリッジネットワークでは、ローカルネットワーク内の他のマシンが仮想マシンにアクセスでき、その逆も可能です。ただし、IPアドレスはDHCPを介して割り当てifconfigられるため、仮想マシンでIPアドレスを見つける必要があります。

28
config.vm.network:private_network、ip: "192.168.50.4"をセットアップするときに、ゲストが "192.168.50.1"にアクセスしてホストにアクセスするということは、ここで重要な情報です。私はどこにも文書化された小さな一口を見つけることができません。
Nucleon 2013

1
回答アドレスを使用192.168.0.0しても機能しないことがわかりました。ホストマシンをカーリングまたはpingすると、接続に失敗しました。@Nucleonのアドレス(トピックのVagrantドキュメントと一致)を使用すると、宣伝どおりに機能しました。
markdsievers 2013年

8
@Mingyuいいえ-構成行を使用config.vm.network :private_network, ip: "192.168.0.0"し、ホストをカーリング/ pingすると、192.168.0.1接続がタイムアウトしました。192.168.50.4解決されるようにネットワークを構成します192.168.50.1。つまり、で利用可能なホストです。
markdsievers 2013年

3
「192.168.0.0」は良い例ではありません。xxx0は通常、ブロードキャスト用です
数値5

73

ゲストOS内のデフォルトゲートウェイを介してホストマシンのポートにアクセスできます。(通常、IPは10.0.2.2です。)

たとえば、ホストマシンのポート8000​​でWebサーバーを実行している場合...

echo 'Hello, guest!' > hello
python -m SimpleHTTPServer 8000

Vagrant VM内から10.0.2.2:800010.0.2.2ゲストのデフォルトゲートウェイのIPが提供されている場合)にアクセスできます。

vagrant ssh
curl http://10.0.2.2:8000/hello # Outputs: Hello, guest!

ゲストOS内のデフォルトゲートウェイのIPを見つけるには、netstat -rn(またはipconfigWindowsゲストで)を実行し、宛先IP 0.0.0.0(または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マシンからホストPostgreSQLに接続する方法VirtualBoxゲストOSからホストマシンに接続しますか?


このソリューションは、現在のvagrant sshセッションを停止することなく機能するため、とても気に入っています。ありがとう!
Rubix 2017年

ブラボー!これはまさに私が探していたものです
Khan Shahrukh

優れた!ifconfigそしてip address、私は必要ですが、どのような私を取得していなかったnetstat -rnでした。
geerlingguy

9

~/.ssh/configホストマシンのに以下を追加します。

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698

経由でログインしてvagrant sshいる限り、Vagrantからホストマシンポート52698のサービスにアクセスできます。

netstat -ltvagrant VMで実行し、次の行をメモすることで、動作することを確認できます。

tcp      0    0 localhost:52698         *:*                 LISTEN
tcp6     0    0 ip6-localhost:52698     [::]:*              LISTEN

2
+1これは私にとって大きな助けとなりました。与えられたテキストをポート5037に置き換えて追加し、ホストボックスで実行されているAndroidエミュレーターを迷惑なボックスがリッスンできるようにしました。
rob

2

ホストマシンで実行されているサービスに、ループバックアドレスではなくローカルIPアドレスを介してアクセスできます。私は、ポート80(次にポート987)にhttpサーバーを作成し、curl197.45.0.10:80および197.45.0.10:987(無実を保護するために実際のIPアドレスを変更)を使用してテストしました。それは両方の時間で動作し、特別なvagrant構成(public_network、no forwarded_portはありません)はありません。また、PuTTY経由で転送されるポートはいくつかありますが、ポート80および987は転送されません。したがって、ホストマシンのローカルまたはパブリックIPアドレスを使用してみてください。

また、別のゲストヴァグラントインスタンスにアクセス(sshでアクセス)したい場合public_networkは、次のVagrantfileようにポート22からの転送と同様に有効にすることができます。

config.vm.network "public_network"
config.vm.network "forwarded_port", guest: 22, host: 2200

その後、そのポートが開いている限り(つまり、ルーター構成でさらにポート転送を行う)、そのマシンにどこからでも、外の世界からでもアクセスできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.