[vagrant] Vagrant 역방향 포트 포워딩?

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

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



답변

을 실행하면 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훨씬 더 간결한 명령에서 동일한 효과를 갖는 명령을 사용할 수도 있습니다 .


답변

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.


답변

게스트 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/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


답변

루프백 주소가 아닌 로컬 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

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


답변