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


121

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

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


Поскольку Vagrant использует SSH, это теоретически возможно, и гем реализации SSH Ruby поддерживает это, но никогда не видел ничего подобного в документе Vagrant.
— cmur2

Ответы:


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, которая дает тот же эффект в гораздо более сжатой команде.


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.


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?


Мне тоже очень нравится это решение, потому что оно просто работало, даже не прерывая мой текущий сеанс бродячего 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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.