Chuyển tiếp cổng ngược Vagrant?


121

Tôi đang làm việc trên một kiến ​​trúc dịch vụ web. Tôi có một số phần mềm cần chạy trên máy chủ gốc, không phải trong Vagrant. Nhưng tôi muốn chạy một số dịch vụ khách hàng cho khách.

config.vm.forwarded_portTham số 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ủ lưu trữ? (Nó vẫn chuyển tiếp cổng, nhưng theo hướng ngược lại.)


Vì Vagrant đang sử dụng SSH nên về mặt lý thuyết là có thể và viên ngọc thực thi Ruby SSH hỗ trợ điều này nhưng chưa bao giờ thấy bất cứ điều gì như thế này trong tài liệu Vagrant.
cmur2

Câu trả lời:


134

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

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

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

Khi Eero nhận xét đúng, bạn cũng có thể sử dụng lệnh vagrant ssh -- -R 12345:localhost:80, có tác dụng tương tự trong một lệnh ngắn gọn hơn nhiều.


67
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 theo cú pháp tùy chọn ssh -R [bind_address:] port: host: hostport , trong đó số đầu tiên là số cổng để nghe bên trong máy khách và hai số cuối cùng là địa chỉ dịch vụ như hiển thị từ máy chủ.
Eero

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

2
@Alp Tôi tin rằng đó là một cổng có sẵn cho toàn hệ thống, không chỉ dành cho quy trình ssh. Hoạt động tốt cho tôi!
Henrik Heimbuerger

1
Đối với những người sử dụng PuTTY, SSH / Tunnels phần của gui cấu hình cho phép cả hai cổng chuyển tiếp từ xa (do đó -R trong lệnh) hoặc cổng chuyển tiếp địa phương (-L trong dòng lệnh)
Titou

3
Hoặc một cái gì đó chiếm của lang thang có khả năng differente cấu hình nếu bạn có nhiều thiết lập lang thang:vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
ibizaman

100

Trong cuốn sách Vagrant: Up and Running(Pub. Date: 12/6/2013), do tác giả của Vagrant viết, ông đã đề cập rằng máy khách không thể truy cập vào các dịch vụ chạy trên máy chủ.

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

  • Ưu điểm của việc sử dụng Host-Only NetworkshơnForwarded Ports

    1. Máy khách có thể truy cập các dịch vụ 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ụ chạy trên máy khách khác

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

    3. Đảm bảo

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

    4. Ít việc hơn

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


  • Cách cấu hình Host-Only Networks

    config.vm.network :"hostonly", "192.168.0.0" # Phiên bản Vagrant # 1

    config.vm.network :private_network, ip: "192.168.0.0" # Phiên bản Vagrant # 2

    Có dòng này trong ý muốn của bạn Vagrantfilehướng dẫn người lang thang tạo một mạng riêng có địa chỉ IP tĩnh:192.168.0.0

    Địa chỉ IP của máy chủ luôn là địa chỉ IP giống nhau 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.


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

28
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 máy chủ lưu trữ bằng cách truy cập "192.168.50.1" là bit thông tin quan trọng ở đây. Tôi không thể tìm thấy mẩu giấy nhỏ đó ở bất cứ đâu.
Nucleon

1
Tôi thấy việc sử dụng địa chỉ câu trả lời của 192.168.0.0không hoạt động - việc uốn / ping máy chủ dẫn đến kết nối t / o. Sử dụng địa chỉ @ Nucleon (phù hợp với tài liệu của Vagrant về chủ đề này) đã hoạt động như quảng cáo.
markdsievers

8
@Mingyu Không - việc sử dụng dòng cấu hình của bạn config.vm.network :private_network, ip: "192.168.0.0"và bật / ping máy chủ 192.168.0.1đã dẫn đến kết nối hết thời gian. Cấu hình mạng để được 192.168.50.4giải quyết nó tức là có sẵn máy chủ lưu trữ tại 192.168.50.1.
markdsievers

3
"192.168.0.0" không phải là một ví dụ điển hình, xxx0 thường dành cho phát sóng
5

73

Bạn có thể truy cập các cổng trên máy chủ thông qua 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ột máy chủ web chạy trên cổng 8000 trên máy chủ của bạn ...

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(với điều kiện 10.0.2.2là ip của cổng 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 cổng mặc định bên trong hệ điều hành khách, hãy chạy netstat -rn(hoặc ipconfigtrên máy khách Windows) và tìm hàng có IP đích là 0.0.0.0(hoặc trường có 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: Cách kết nối với máy chủ PostgreSQL từ máy ảo ảo vagrant ; Kết nối với máy chủ từ hệ điều hành khách VirtualBox?


Tôi cũng thích giải pháp này vì nó hoạt động mà không dừng phiên ssh lang thang hiện tại của tôi. Cảm ơn!
Rubix

Hoan hô! đây chính xác là những gì tôi đang tìm kiếm
Khan Shahrukh,

Thông minh! ifconfigip addresskhông nhận được cho tôi những gì tôi cần, nhưng netstat -rnđã làm.
geerlingguy

9

Thêm thông tin sau vào của bạn ~/.ssh/configtrê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 một dịch vụ trên cổng máy chủ 52698 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 -lttrên máy ảo ảo và ghi chú những dòng sau:

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

2
+1 Đây là một sự trợ giúp rất lớn đối với tôi. Tôi đã thêm văn bản đã cho thay thế bằng cổng 5037 để cho phép hộp vagrant của tôi có thể nghe trình giả lập android chạy trên hộp máy chủ của tôi.
cướp

2

Tôi có thể truy cập các dịch vụ đang chạy trên máy chủ của mình thông qua địa chỉ IP cục bộ của nó (không phải địa chỉ lặp lại). Tôi đã kiểm tra 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à curlnhập 197.45.0.10:80 và 197.45.0.10:987 (địa chỉ ip thực đã được thay đổi để bảo vệ người vô tội). Nó hoạt động cả hai lần và tôi không có bất kỳ cấu hình nào đặc biệt (không có public_network, không có 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 khai của máy chủ.

Và nếu bạn muốn truy cập (ssh vào) một phiên bản khách lang thang từ một phiên bản khác, bạn có thể bật public_networkcũng như chuyển tiếp từ cổng 22 Vagrantfilenhư sau:

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

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.