Błędne przekierowanie portu wstecznego?

121

Pracuję nad architekturą usług internetowych. Mam oprogramowanie, które muszę uruchomić na komputerze macierzystym, a nie w Vagrant. Ale chciałbym uruchomić niektóre usługi klienta na gościu.

config.vm.forwarded_portParametr Vagranta otworzy port na hoście i wyśle ​​dane do gościa. Ale jak mogę otworzyć port gościa i wysłać dane do hosta? (Nadal jest to przekazywanie portów, ale w odwrotnym kierunku).

Dan Fabulich
źródło
Ponieważ Vagrant używa SSH, jest to teoretycznie możliwe, a gem implementacji Ruby SSH obsługuje to, ale nigdy nie widziałem czegoś takiego w dokumencie Vagrant.
cmur2
Zobacz też: stackoverflow.com/q/19933550/1157054
Ajedi32,

Odpowiedzi:

134

Kiedy uruchamiasz vagrant ssh, faktycznie używa tego podstawowego polecenia:

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 obsługuje przekazywanie portów w wybranym kierunku z -R guestport:host:hostportopcją. Tak więc, jeśli chcesz połączyć się z portem 12345gościa i przekazać go do localhost:80, użyj tego polecenia:

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]

Jak słusznie komentuje Eero, możesz również użyć polecenia vagrant ssh -- -R 12345:localhost:80, które ma ten sam efekt w znacznie bardziej zwięzłym poleceniu.

wlritchi
źródło
67
i możesz to uruchomić w prostszyvagrant ssh -- -R 12345:localhost:80 sposób, używając To jest zgodne ze składnią opcji ssh -R [adres_powiązania:] port: host: hostport , gdzie pierwsza liczba to numer portu do nasłuchiwania na komputerze gościa, a ostatnie dwa to adres usługi widoczne z komputera hosta.
Eero
1
O ile rozumiem, przekazywanie wstecz działa tylko w odpowiedniej powłoce ssh. Myślę, że Dan Fabulich chciał rozwiązania bez konieczności dołączania ssh do maszyny wirtualnej.
Alp
2
@Alp Uważam, że jest to port dostępny dla całego systemu, a nie tylko dla procesu ssh. U mnie działa dobrze!
Henrik Heimbuerger
1
Dla tych, którzy używają PuTTy, sekcja SSH / Tunnels w konfiguracyjnym gui umożliwia zarówno zdalne przekierowanie portu (stąd -R w poleceniu), jak i lokalne przekierowanie portu (-L w wierszu poleceń)
Titou
3
Lub coś odpowiadającego za potencjalnie inną konfigurację włóczęgi, jeśli masz wiele konfiguracji włóczęgów:vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
ibizaman
100

W książce Vagrant: Up and Running (data publikacji: 12 czerwca 2013 r.), Napisanej przez twórcę Vagranta, wspomniał, że maszyna gościa nie może uzyskać dostępu do usług działających na maszynie hosta.

Zamiast używać Forwarded Ports , możesz skonfigurować prywatną sieć za pomocą Host-Only Networks.

  • Zalety używania Host-Only Networks ponadForwarded Ports

    1. Maszyny-gości mogą uzyskiwać dostęp do usług działających na komputerze-hoście

      Ta funkcja rozwiąże Twój problem.

    2. Maszyny-gości mogą uzyskiwać dostęp do usług działających na innym komputerze-gościu

      Ta funkcja jest bardzo przydatna do rozdzielania usług na wiele maszyn, aby dokładniej naśladować środowisko produkcyjne.

    3. Bezpieczne

      Komputery zewnętrzne nie mają możliwości uzyskania dostępu do usług działających na komputerach-gościach

    4. Mniej pracy

      Nie ma potrzeby konfigurowania wszystkich Forwarded Port


  • Jak skonfigurować 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

    Posiadanie tej linii w Vagrantfiletestamencie poinstruuje włóczęgę, aby utworzyć prywatną sieć, która ma statyczny adres IP:192.168.0.0

    Adres IP hosta jest zawsze tym samym adresem IP, ale z ostatnim oktetem jako 1. W poprzednim przykładzie komputer hosta miałby adres IP 192.168.0.1.

Mingyu
źródło
2
W tym samym duchu (również z Vagrant: Up and Running) można skonfigurować sieć mostkową. W sieci z mostem inne maszyny w sieci lokalnej mogą uzyskać dostęp do maszyny wirtualnej i odwrotnie. Ale ponieważ adres IP jest przypisywany przez DHCP, musisz ifconfigznaleźć jego adres IP na maszynie wirtualnej.
nukleartyd
28
Fakt, że podczas konfiguracji config.vm.network: private_network, ip: "192.168.50.4" oznacza, że ​​gość uzyska dostęp do hosta, przechodząc do "192.168.50.1", jest tutaj kluczową informacją. Nigdzie nie mogę znaleźć udokumentowanej tej małej ciekawostki.
Nucleon
1
Zauważyłem, że używanie adresu odpowiedzi 192.168.0.0nie działa - zwijanie / pingowanie komputera hosta powodowało problemy z połączeniem. Korzystanie z adresu @ Nucleon (zgodne z dokumentami Vagrant na ten temat) działało zgodnie z reklamą.
markdsievers
8
@Mingyu Nie - używanie linii konfiguracyjnej config.vm.network :private_network, ip: "192.168.0.0"i zawijanie / pingowanie hosta 192.168.0.1powodowało przekroczenie limitu czasu połączenia. Konfiguracja sieci do 192.168.50.4rozwiązania problemu, tj. Host dostępny pod adresem 192.168.50.1.
markdsievers
3
„192.168.0.0” nie jest dobrym przykładem, xxx0 zwykle służy do nadawania
numer5
73

Dostęp do portów na komputerze hosta można uzyskać za pośrednictwem bramy domyślnej w systemie-gościu. (Który zwykle ma adres IP 10.0.2.2.)

Na przykład, jeśli masz serwer WWW działający na porcie 8000 na komputerze głównym ...

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

Możesz uzyskać do niego dostęp z wnętrza maszyny wirtualnej Vagrant pod adresem 10.0.2.2:8000(podany 10.0.2.2jest adres IP domyślnej bramy gościa):

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

Aby znaleźć adres IP bramy domyślnej w systemie gościa, uruchom netstat -rn(lub ipconfigna komputerze gościa systemu Windows) i poszukaj wiersza z docelowym adresem IP 0.0.0.0(lub pola oznaczonego „Brama domyślna” w systemie 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

Możesz wyodrębnić ten adres IP programowo za pomocą netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2.

Źródła: Jak połączyć się z hostem PostgreSQL z wirtualnej maszyny wirtualnej ; Połączyć się z hostem z systemu gościa VirtualBox?

Ajedi32
źródło
To rozwiązanie też bardzo mi się podoba, ponieważ działało bez zatrzymywania mojej bieżącej sesji ssh włóczęgi. Dzięki!
Rubix,
Brawo! to jest dokładnie to, czego szukałem
Khan Shahrukh
Doskonały! ifconfigi ip addressnie dostałem tego, czego potrzebowałem, ale netstat -rnzrobiłem.
geerlingguy
9

Dodaj następujące elementy do swojego ~/.ssh/configna komputerze hosta:

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698

Umożliwia dostęp do usługi na porcie 52698 hosta firmy Vagrant, o ile jesteś zalogowany przez vagrant ssh.

Możesz potwierdzić, że działa, uruchamiając netstat -ltna vagrant VM i notując w następujących wierszach:

tcp      0    0 localhost:52698         *:*                 LISTEN
tcp6     0    0 ip6-localhost:52698     [::]:*              LISTEN
stacker-baka
źródło
2
+1 To była dla mnie ogromna pomoc. Dodałem podany tekst zastępując port 5037, aby moje urządzenie włóczęgi mogło nasłuchiwać emulatora Androida działającego na moim hoście.
okraść
2

Mogę uzyskać dostęp do usług działających na moim komputerze głównym za pośrednictwem lokalnego adresu IP (nie adresu sprzężenia zwrotnego). Testowałem, tworząc serwer http na porcie 80 (a następnie na porcie 987) i curl197.45.0.10:80 i 197.45.0.10:987 (rzeczywisty adres IP został zmieniony, aby chronić niewinnych). To działało za każdym razem i nie mam żadnej specjalnej konfiguracji włóczęgi (brak public_network, brak forwarded_port) i chociaż mam kilka portów przekierowanych przez PuTTY, nie mam przekierowanych portów 80 i 987. Więc może spróbuj użyć lokalnego lub publicznego adresu IP komputera hosta.

A jeśli chcesz uzyskać dostęp (ssh do) jednej instancji wędrowca gościa z innej, możesz włączyć, public_networka także przekierować z portu 22 w Vagrantfilenastępujący sposób:

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

Dopóki ten port jest otwarty (tj. Przekierowuj więcej portów w konfiguracji routera), możesz uzyskać dostęp do tej maszyny z dowolnego miejsca, nawet ze świata zewnętrznego.

BT
źródło