Чарівне зворотне переадресація порту?


121

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

config.vm.forwarded_portПараметр Vagrant відкриє порт хоста і надсилає дані гостям. Але як я можу відкрити порт для гостя і надіслати дані хосту? (Це все-таки переадресація порту, але у зворотному напрямку.)


Оскільки Vagrant використовує SSH, це теоретично можливо, і дорогоцінний камінь реалізації Ruby SSH підтримує це, але ніколи подібного не бачив у документі 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

Як Eero правильно коментує, ви також можете використовувати команду vagrant ssh -- -R 12345:localhost:80, яка має той самий ефект у набагато більш стислій команді.


67
і ви можете запустити це простіше, використовуючи vagrant ssh -- -R 12345:localhost:80 Це слід за синтаксисом параметра ssh -R [bind_address:] port: host: hostport , де перший номер - номер порту, який потрібно слухати всередині гостьової машини, а останні два - адреса служби як видно з хост-машини.
Ееро

1
Наскільки я розумію, зворотне переадресація працює лише у відповідній оболонці ssh. Я думаю, що Дан Фабуліч хотів рішення без необхідності вторгнутись у vm.
Альп

2
@Alp Я вважаю, що це порт, доступний для всієї системи, а не просто доступний для процесу ssh. Добре працює для мене!
Генрік Хаймбургер

1
Для тих, хто використовує PuTTy, розділ SSH / Tunnels у конфігураційному інтерфейсі дозволяє як віддалене переадресація порту (отже, команда -R у команді), так і переадресація локального порту (-L у командному рядку)
Titou

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-адресу.
ядерніт

28
Те, що під час налаштування config.vm.network: private_network, ip: "192.168.50.4" означає, що гість отримає доступ до хоста, перейшовши на "192.168.50.1", тут є ключовим бітом інформації. Я ніде не можу знайти цього маленького примхливого документа.
Нуклеон

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 зазвичай використовується для трансляції
номер 5

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 (або ipconfigв гості Windows) і знайдіть рядок із цільовим 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 з бродячої віртуальної машини ; Підключитися до хост-машини з гостьової ОС VirtualBox?


Мені дуже подобається це рішення, тому що воно просто спрацювало, навіть не зупиняючи мого поточного бродячого сеансу ssh. Дякую!
Рубікс

Браво! це саме те, що я шукав
Хан Шахрух

Відмінно! ifconfigі я ip addressне отримував мені те, що мені потрібно, але netstat -rnробив.
ґерлінггуй

9

Додайте наступні дані до свого ~/.ssh/configхост-машини:

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698

Це дозволяє вам отримати доступ до послуги на порту 52698 хост-машини від Vagrant до тих пір, поки ви ввійшли через vagrant ssh.

Ви можете підтвердити, що це працює, запустивши netstat -ltбродячий VM та зробивши примітку в наступних рядках:

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

2
+1 Це було для мене величезною допомогою. Я додав даний текст замінюючи порт 5037, щоб мій бродячий ящик міг слухати андроїд-емулятор, що працює на моєму вікні хоста.
грабувати

2

Я можу отримати доступ до служб, що працюють на моєму хост-машині, через локальну IP-адресу (а не його петлеву адресу). Я перевірив, створивши 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

Тоді, поки цей порт відкритий (тобто зробити ще кілька переадресацій портів у вашому конфігурації маршрутизатора), ви можете отримати доступ до цієї машини з будь-якого місця, навіть із зовнішнього світу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.