Vagrant 역방향 포트 포워딩?


121

저는 웹 서비스 아키텍처를 연구하고 있습니다. Vagrant가 아닌 기본 호스트 컴퓨터에서 실행해야하는 소프트웨어가 있습니다. 하지만 게스트에서 일부 클라이언트 서비스를 실행하고 싶습니다.

Vagrant의 config.vm.forwarded_port매개 변수는 호스트의 포트를 열고 게스트에게 데이터를 보냅니다. 하지만 게스트에서 포트를 열고 데이터를 호스트로 보내려면 어떻게해야합니까? (여전히 포트 포워딩이지만 반대 방향입니다.)


Vagrant가 SSH를 사용하고 있기 때문에 이론적으로 가능하며 Ruby SSH 구현 젬 이이를 지원하지만 Vagrant 문서에서 이와 같은 것을 본 적이 없습니다.
cmur2 2013

답변:


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를 따릅니다 . 여기서 첫 번째 번호는 게스트 시스템 내부에서 수신 할 포트 번호이고 마지막 두 개는 서비스 주소입니다. 호스트 컴퓨터에서 볼 수 있습니다.
Eero 2013 년

1
역방향 전달은 해당 ssh 셸에서만 작동한다는 것을 이해하는 한. Dan Fabulich는 vm에 ssh 할 필요가없는 솔루션을 원했습니다.
Alp 2013

2
@Alp ssh 프로세스에서만 사용할 수있는 것이 아니라 전체 시스템에서 사용할 수있는 포트라고 생각합니다. 나를 위해 잘 작동합니다!
Henrik Heimbuerger 2014 년

1
PuTTy를 사용하는 사용자를 위해 구성 GUI의 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 RunningVagrant의 작성자가 쓴 책 (Pub. date : 2013 년 6 월 12 일)에서 그는 게스트 컴퓨터가 호스트 컴퓨터에서 실행되는 서비스에 액세스 할 수 없다고 언급했습니다.

을 사용 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 2013-08-05

28
config.vm.network : private_network, ip : "192.168.50.4"를 설정할 때 게스트가 "192.168.50.1"로 이동하여 호스트에 액세스한다는 사실이 여기에서 중요한 정보입니다. 나는 어디에도 기록 된 작은 음식을 찾을 수 없습니다.
Nucleon 2013-08-26

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

게스트 OS 내부의 기본 게이트웨이를 통해 호스트 시스템의 포트에 액세스 할 수 있습니다. (일반적으로 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!

게스트 OS 내에서 기본 게이트웨이의 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.

출처 : vagrant virtualbox 머신에서 호스트 PostgreSQL에 연결하는 방법 ; VirtualBox 게스트 OS에서 호스트 시스템에 연결 하시겠습니까?


현재 방랑 ssh 세션을 중지하지 않고도 작동했기 때문에이 솔루션을 많이 좋아합니다. 감사!
Rubix

브라보! 이것이 바로 제가 찾던 것입니다
Khan Shahrukh

우수한! ifconfig그리고 ip address내가 필요,하지만 나를 점점되지 않았다 netstat -rn않았다.
geerlingguy

9

~/.ssh/config호스트 시스템에서 다음을 추가하십시오 .

Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698

을 통해 로그인 한 경우 Vagrant에서 호스트 컴퓨터 포트 52698의 서비스에 액세스 할 수 있습니다 vagrant ssh.

netstat -ltvagrant VM에서 실행 하고 다음 줄에 메모하여 작동하는지 확인할 수 있습니다 .

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

2
+1 이것은 저에게 큰 도움이되었습니다. 내 방랑자 상자가 호스트 상자에서 실행되는 안드로이드 에뮬레이터를들을 수 있도록 포트 5037로 대체 된 주어진 텍스트를 추가했습니다.
rob

2

루프백 주소가 아닌 로컬 IP 주소를 통해 호스트 컴퓨터에서 실행중인 서비스에 액세스 할 수 있습니다. 포트 80 (다음 포트 987)에 http 서버를 만들고 curl197.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

그런 다음 해당 포트가 열려있는 한 (예 : 라우터 구성에서 더 많은 포트 포워딩을 수행) 어디에서나 외부 세계에서도 해당 컴퓨터에 액세스 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.