Переадресация обратного порта?

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

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

Ответ 1

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

Ответ 2

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

Вместо использования Forwarded Ports вы можете настроить частную сеть с помощью Host-Only Networks.

  • Плюсы использования Host-Only Networks over Forwarded Ports

    • Гостевые машины могут обращаться к службам, запущенным на главной машине

      Эта функция решит вашу проблему.

    • Гостевые машины могут обращаться к службам, запущенным на другой гостевой машине.

      Эта функция очень полезна для разделения сервисов на нескольких машинах, чтобы более точно имитировать производственную среду.

    • Безопасность

      Внешние машины не имеют способов доступа к службам, запущенным на гостевых машинах.

    • Меньшая работа

      Не нужно настраивать каждый Forwarded Port


  • Как настроить Host-Only Networks

    config.vm.network :"hostonly", "192.168.0.0" # Vagrant Version # 1

    config.vm.network :private_network, ip: "192.168.0.0" # Vagrant Version # 2

    После того, как эта строка в Vagrantfile предложит vagrant создать частную сеть со статическим IP-адресом: 192.168.0.0

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

Ответ 3

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

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

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!

Чтобы найти IP-адрес шлюза по умолчанию в гостевой ОС, запустите netstat -rn (или ipconfig у гостя Windows) и найдите строку с IP-адресом назначения 0.0.0.0 (или поле с пометкой "По умолчанию" Gateway "в 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?

Ответ 4

Добавьте на свой ~/.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

Ответ 5

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

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

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

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