2013-04-26 32 views
98

Tôi đang làm việc trên kiến ​​trúc dịch vụ web. Tôi có một số phần mềm mà tôi cần để chạy trên máy chủ bản địa, không phải trong Vagrant. Nhưng tôi muốn chạy một số dịch vụ khách hàng trên máy khách.Chuyển tiếp cổng âm đạo ngược?

Thông số config.vm.forwarded_port của Vagrant sẽ mở một cổng trên máy chủ và gửi dữ liệu cho khách. Nhưng làm thế nào tôi có thể mở một cổng trên máy khách và gửi dữ liệu đến máy chủ? (. Nó vẫn cổng chuyển tiếp, nhưng theo hướng ngược lại)

+0

Vì Vagrant đang sử dụng SSH, về mặt lý thuyết có thể và [gem SSH thực hiện Ruby SSH] (https://github.com/net-ssh/net-ssh) hỗ trợ điều này nhưng không bao giờ thấy bất cứ điều gì như thế này trong Vagrant docu. – cmur2

+0

Xem thêm: http://stackoverflow.com/q/19933550/1157054 – Ajedi32

Trả lời

106

Khi bạn chạy vagrant ssh, nó thực sự sử dụng lệnh cơ bản này:

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 hỗ trợ chuyển tiếp cổng theo hướng bạn muốn với -R guestport:host:hostport Tùy chọn. Vì vậy, nếu bạn muốn kết nối với cổng 12345 trên của khách và có nó chuyển tiếp đến localhost:80, bạn sẽ sử dụng lệnh này:

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]

Như Eero bình luận một cách chính xác, bạn cũng có thể sử dụng lệnh vagrant ssh -- -R 12345:localhost:80, trong đó có cùng một hiệu ứng trong một lệnh ngắn gọn hơn nhiều.

+52

và bạn có thể chạy điều này đơn giản hơn bằng cách sử dụng 'vagrant ssh - -R 12345: localhost: 80' Điều này tuân theo cú pháp tùy chọn ssh ** - R * * _ [bind_address:] port: host: hostport_, trong đó số đầu tiên là số cổng để lắng nghe bên trong máy khách và hai số cuối cùng là địa chỉ dịch vụ hiển thị từ máy chủ. – Eero

+1

Theo tôi hiểu rằng chuyển tiếp đảo ngược chỉ hoạt động trong vỏ ssh tương ứng. Tôi nghĩ Dan Fabulich muốn một giải pháp mà không cần phải nhảy vào vm. – Alp

+1

@Alp Tôi tin rằng đó là một cổng có sẵn cho toàn bộ hệ thống, không chỉ có sẵn cho quy trình ssh. Làm việc tốt cho tôi! –

92

Trong sách Vagrant: Up and Running (Pub. Date: June 12, 2013), được viết bởi tác giả Vagrant, ông đã đề cập rằng máy khách không thể truy cập các dịch vụ đang chạy trên máy chủ.

Thay vì sử dụng Forwarded Ports, bạn có thể thiết lập mạng riêng sử dụng Host-Only Networks.

  • Ưu điểm của việc sử dụng Host-Only Networks qua Forwarded Ports

    1. máy Khách có thể truy cập các dịch vụ đang chạy trên máy chủ

      Tính năng này sẽ giải quyết vấn đề của bạn.

    2. máy Khách có thể truy cập các dịch vụ đang chạy trên máy khách khác

      Tính năng này rất hữu ích với các dịch vụ chia vào nhiều máy tính để bắt chước chính xác hơn một môi trường sản xuất.

    3. an toàn

      máy bên ngoài không có cách để truy cập các dịch vụ chạy trên các máy khách

    4. Ít việc

      Không cần phải cấu hình tất cả các đơn Forwarded Port


  • Làm thế nào để cấu hình 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

    Có dòng này trong Vagrantfile sẽ hướng dẫn lang thang của bạn để tạo ra một mạng riêng có địa chỉ IP tĩnh: 192.168.0.0

    Địa chỉ IP của máy chủ là al theo cùng một địa chỉ IP nhưng với octet cuối cùng là 1. Trong ví dụ trước, máy chủ sẽ có địa chỉ IP 192.168.0.1.

+1

Trong cùng một tĩnh mạch (cũng từ 'Vagrant: Up and Running'), bạn có thể thiết lập một mạng cầu nối. Trên mạng cầu nối, các máy khác trong mạng cục bộ của bạn có thể truy cập máy ảo của bạn và ngược lại. Nhưng vì địa chỉ IP được gán thông qua DHCP, bạn phải 'ifconfig' trong máy ảo để tìm địa chỉ IP của nó. –

+26

Thực tế là khi bạn thiết lập config.vm.network: private_network, ip: "192.168.50.4" có nghĩa là khách sẽ truy cập vào máy chủ bằng cách đi đến "192.168.50.1" là bit chính của thông tin ở đây. Tôi không thể tìm thấy miếng ngon chút nào được ghi lại ở bất cứ đâu. – Nucleon

+1

Tôi tìm thấy bằng cách sử dụng địa chỉ trả lời của '192.168.0.0' không hoạt động - quăn/ping máy chủ đã dẫn đến kết nối t/o. Sử dụng địa chỉ của @ Nucleon (phù hợp với [Vagrant docs] (http://docs.vagrantup.com/v2/networking/private_network.html) về chủ đề) làm việc như được quảng cáo. – markdsievers

2

Tôi có thể truy cập các dịch vụ chạy trên máy chủ thông qua địa chỉ IP cục bộ của nó (không phải địa chỉ vòng lặp). Tôi đã thử nghiệm bằng cách tạo một máy chủ http trên cổng 80 (và sau đó trên cổng 987) và curl ing 197.45.0.10:80 và 197.45.0.10:987 (địa chỉ IP thực tế được thay đổi để bảo vệ người vô tội). Nó làm việc cả hai lần, và tôi không có bất kỳ cấu hình đặc biệt nào (không có public_network, no forwarded_port) và trong khi tôi có một số cổng được chuyển tiếp qua PuTTY, tôi không có cổng 80 và 987 được chuyển tiếp. Vì vậy, có thể thử sử dụng địa chỉ IP cục bộ hoặc công cộng của máy chủ.

Và nếu bạn muốn truy cập (ssh vào) một khách lang thang dụ từ khác, bạn có thể bật public_network cũng như chuyển tiếp từ cổng 22 trong Vagrantfile như thế này:

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

Sau đó, chừng nào mà cổng đang mở (tức là thực hiện thêm một số cổng chuyển tiếp trong cấu hình bộ định tuyến), bạn có thể truy cập máy đó từ mọi nơi, ngay cả thế giới bên ngoài.

5

Add sau để ~/.ssh/config của bạn trên máy chủ:

Host 127.0.0.1 
RemoteForward 52698 127.0.0.1:52698 

Nó cho phép bạn truy cập vào một dịch vụ trên máy chủ 52.698 cổng máy từ Vagrant, miễn là bạn đăng nhập qua vagrant ssh.

Bạn có thể xác nhận nó hoạt động bằng cách chạy netstat -lt trên lang thang VM và tham gia một ghi chú trên dòng sau:

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

Bạn có thể truy cập vào cổng trên máy chủ thông qua các cổng mặc định bên trong hệ điều hành khách. (Thường có IP là 10.0.2.2.)

Ví dụ: nếu bạn có máy chủ web chạy trên cổng 8000 trên máy chủ của mình ...

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

Bạn có thể truy cập nó từ bên trong Vagrant VM tại 10.0.2.2:8000 (được cung cấp 10.0.2.2 là IP của gateway mặc định của khách):

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

Để tìm IP của gateway mặc định bên trong hệ điều hành khách , chạy netstat -rn (hoặc ipconfig trên máy khách Windows) và tìm hàng có IP đích là 0.0.0.0 (hoặc trường có gắn nhãn "Cổng mặc định" trên 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 

Bạn có thể trích xuất IP này theo lập trình với netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2.

Nguồn: How to connect with host PostgreSQL from vagrant virtualbox machine; Connect to the host machine from a VirtualBox guest OS?

+0

Cảm ơn, điều này đã giải quyết được vấn đề của tôi! – oskarth

+0

Tôi thích giải pháp này rất nhiều bởi vì nó chỉ làm việc mà không cần dừng phiên ssh hiện tại của tôi. Cảm ơn! – Rubix

+0

Bravo! điều này thật đúng với gì mà tôi đã tìm kiếm –

Các vấn đề liên quan