web-dev-qa-db-ja.com

浮浪者の逆ポート転送?

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

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

115
Dan Fabulich

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を使用することもできます。これは、より簡潔なコマンドで同じ効果があります。

126
wlritchi

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

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

  • Host-Only NetworksForwarded 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にこの行があると、vagrantは静的IPアドレスを持つプライベートネットワークを作成するよう指示されます:192.168.0.0

    ホストのIPアドレスは常に同じIPアドレスですが、最後のオクテットは1です。上記の例では、ホストマシンのIPアドレスは192.168.0.1です。

97
Mingyu

ゲスト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からホストマシンに接続しますか?

63
Ajedi32

ホストマシンの~/.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
7
stacker-baka

ホストマシンで実行されているサービスに、ループバックアドレスではなくローカルIPアドレスを介してアクセスできます。ポート80(およびポート987)でhttpサーバーを作成し、curling 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

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

2
B T