Бродячая обратная переадресация портов?

121

Я работаю над архитектурой веб-сервисов. У меня есть какое-то программное обеспечение, которое мне нужно запустить на собственном хост-компьютере, а не в Vagrant. Но я бы хотел запустить некоторые клиентские службы на гостевой машине.

config.vm.forwarded_portПараметр Vagrant откроет порт на хосте и отправит данные гостю. Но как я могу открыть порт на гостевой машине и отправить данные на хост? (Это все еще переадресация портов, но в обратном направлении.)

Дэн Фабулич
источник
Поскольку Vagrant использует SSH, это теоретически возможно, и гем реализации SSH Ruby поддерживает это, но никогда не видел ничего подобного в документе Vagrant.
cmur2
См. Также: stackoverflow.com/q/19933550/1157054
Ajedi32

Ответы:

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

Как правильно комментирует Ээро, вы также можете использовать команду vagrant ssh -- -R 12345:localhost:80, которая дает тот же эффект в гораздо более сжатой команде.

wlritchi
источник
67
и вы можете запустить это более просто, используя vagrant ssh -- -R 12345:localhost:80 Синтаксис опции ssh -R [bind_address:] порт: host: hostport , где первое число - это номер порта для прослушивания на гостевой машине, а последние два - адрес службы как видно с главной машины.
Ээро
1
Насколько я понимаю, обратная переадресация работает только в соответствующей оболочке ssh. Я думаю, что Дэн Фабулич хотел решение без необходимости использовать ssh в виртуальной машине.
Alp
2
@Alp Я считаю, что это порт, доступный для всей системы, а не только для процесса ssh. У меня отлично работает!
Henrik Heimbuerger
1
Для тех, кто использует PuTTy, раздел SSH / Tunnels в интерфейсе конфигурации позволяет как перенаправление удаленного порта (отсюда -R в команде), так и перенаправление локального порта (-L в командной строке)
Титу
3
Или что-то, что учитывает потенциально отличную конфигурацию бродяги, если у вас есть несколько настроек бродяг:vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
ibizaman
100

В книге Vagrant: Up and Running(дата публикации: 12 июня 2013 г.), написанной создателем Vagrant, он упомянул, что гостевая машина не может получить доступ к службам, работающим на хост-машине.

Вместо использования 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" # Бродячая версия # 1

    config.vm.network :private_network, ip: "192.168.0.0" # Бродячая версия # 2

    Если вы укажете эту строку Vagrantfile, бродяга создаст частную сеть со статическим IP-адресом:192.168.0.0

    IP-адрес хоста всегда один и тот же IP-адрес, но с последним октетом как 1. В предыдущем примере хост-машина будет иметь IP-адрес 192.168.0.1.

Mingyu
источник
2
В том же духе (также от Vagrant: Up and Running) вы можете настроить мостовую сеть. В сети с мостовым подключением другие машины в вашей локальной сети могут получить доступ к вашей виртуальной машине, и наоборот. Но поскольку IP-адрес назначается через DHCP, вам нужно будет ifconfigнайти его IP-адрес на виртуальной машине.
Nucleartide
28
Тот факт, что при настройке config.vm.network: private_network, ip: «192.168.50.4» означает, что гость будет обращаться к хосту, перейдя к «192.168.50.1», является ключевым битом информации здесь. Я нигде не могу найти этот маленький лакомый кусочек, задокументированный.
Nucleon
1
Я обнаружил, что использование адреса ответов 192.168.0.0не работает - скручивание / пинг на хост-машине приводило к подключению t / o. Использование адреса @ Nucleon (в соответствии с документами Vagrant по теме) сработало, как рекламируется.
markdsievers
8
@Mingyu Нет - использование вашей строки конфигурации config.vm.network :private_network, ip: "192.168.0.0"и скручивание / пинг хоста 192.168.0.1приводило к тайм-аутам соединения. Настройка сети, которая будет 192.168.50.4разрешена, т.е. хост, доступный по адресу 192.168.50.1.
markdsievers
3
«192.168.0.0» не является хорошим примером, xxx0 обычно используется для широковещательной передачи
number5
73

Вы можете получить доступ к портам на хост-машине через шлюз по умолчанию в гостевой ОС. (Обычно IP-адрес 10.0.2.2.)

Например, если у вас есть веб-сервер, работающий на порту 8000 на вашем хост-компьютере ...

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

Вы можете получить к нему доступ изнутри Vagrant VM по адресу 10.0.2.2:8000(предоставляется 10.0.2.2IP-адрес гостевого шлюза по умолчанию):

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

Чтобы найти 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.

Источники: Как подключиться к хосту PostgreSQL с машины vagrant virtualbox ; Подключиться к хост-машине из гостевой ОС VirtualBox?

Ajedi32
источник
Мне тоже очень нравится это решение, потому что оно просто работало, даже не прерывая мой текущий сеанс бродячего ssh. Спасибо!
Rubix
Браво! это именно то, что я искал
Хан Шахрукх
Превосходно! ifconfigи ip addressне получали то, что мне было нужно, но получали netstat -rn.
geerlingguy
9

Добавьте ~/.ssh/configна хост-машину следующее:

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698

Он позволяет вам получить доступ к службе на порту 52698 хост-машины из Vagrant, если вы вошли в систему через vagrant ssh.

Вы можете подтвердить, что это работает, запустив netstat -ltбродячую виртуальную машину и отметив следующие строки:

tcp      0    0 localhost:52698         *:*                 LISTEN
tcp6     0    0 ip6-localhost:52698     [::]:*              LISTEN
укладчик-Бак
источник
2
+1 Это мне очень помогло. Я добавил данный текст, заменив его на порт 5037, чтобы мой бродячий ящик мог прослушивать эмулятор Android, работающий на моем хост-компьютере.
ограбить
2

Я могу получить доступ к службам, работающим на моем хост-компьютере, через его локальный IP-адрес (а не его адрес обратной связи). Я протестировал, создав http-сервер на 80-м порту (а затем на 987-м) и на curl197.45.0.10:80 и 197.45.0.10:987 (фактический IP-адрес изменен для защиты невиновных). Это сработало оба раза, и у меня нет специальной конфигурации бродяг (нет public_network, нет forwarded_port), и хотя у меня есть перенаправленные порты через PuTTY, у меня нет перенаправленных портов 80 и 987. Так что, возможно, попробуйте использовать локальный или общедоступный IP-адрес хост-машины.

И если вы хотите получить доступ (ssh into) к одному гостевому экземпляру бродяги из другого, вы можете включить, public_networkа также переадресацию с порта 22 Vagrantfileследующим образом:

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

Затем, пока этот порт открыт (т.е. сделайте еще несколько переадресации портов в конфигурации вашего маршрутизатора), вы можете получить доступ к этой машине из любого места, даже из внешнего мира.

BT
источник