我正在研究 Web 服务架构。我有一些软件需要在本机主机上运行,而不是在 Vagrant 中。但我想在来宾上运行一些客户端服务。
Vagrant 的config.vm.forwarded_port
参数将在主机上打开一个端口并将数据发送给客人。但是我怎样才能在来宾上打开一个端口并将数据发送到主机呢?(它仍然是端口转发,但方向相反。)
我正在研究 Web 服务架构。我有一些软件需要在本机主机上运行,而不是在 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
-R guestport:host:hostport
SSH 支持通过该选项沿您想要的方向转发端口。因此,如果您想连接到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 正确评论的那样,您也可以使用 command vagrant ssh -- -R 12345:localhost:80
,它在更简洁的命令中具有相同的效果。
在 Vagrant 的创建者所写的书Vagrant: Up and Running
(出版日期:2013 年 6 月 12 日)中,他提到客户机无法访问宿主机上运行的服务。
Forwarded Ports
您可以使用 来设置专用网络,而不是使用Host-Only Networks
。
Host-Only Networks
过度使用的优点Forwarded Ports
来宾机器可以访问主机上运行的服务
此功能将解决您的问题。
来宾机器可以访问在其他来宾机器上运行的服务
此功能对于将服务分离到多台机器上以更准确地模拟生产环境非常有用。
安全的
外部机器无法访问来宾机器上运行的服务
减少工作
无需配置每一个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
会指示 vagrant 创建一个具有静态 IP 地址的专用网络:192.168.0.0
主机的 IP 地址始终是相同的 IP 地址,但最后一个八位字节为 1。在前面的示例中,主机将具有 IP 地址192.168.0.1
。
您可以通过来宾操作系统内的默认网关访问主机上的端口。(通常的 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!
要在来宾操作系统中查找默认网关的 IP,请运行netstat -rn
(或ipconfig
在 Windows 来宾上)并查找目标 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 来宾操作系统连接到主机?
~/.ssh/config
在主机上添加以下内容:
Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698
只要您通过vagrant ssh
.
您可以通过netstat -lt
在 vagrant VM 上运行并记下以下几行来确认它是否有效:
tcp 0 0 localhost:52698 *:* LISTEN
tcp6 0 0 ip6-localhost:52698 [::]:* LISTEN
我可以通过其本地 IP 地址(而不是其环回地址)访问在我的主机上运行的服务。我通过在端口 80(然后在端口 987)上创建一个 http 服务器并curl
197.45.0.10:80 和 197.45.0.10:987(实际 IP 地址更改以保护无辜者)进行测试。它两次都有效,而且我没有任何特殊的流浪配置(没有 public_network,没有 forwarded_port),虽然我确实有一些通过 PuTTY 转发的端口,但我没有转发端口 80 和 987。所以也许尝试使用主机的本地或公共 IP 地址。
如果您想从另一个访客 vagrant 实例访问(ssh 到)一个访客 vagrant 实例,您可以启用public_network
以及从端口 22 转发,Vagrantfile
如下所示:
config.vm.network "public_network"
config.vm.network "forwarded_port", guest: 22, host: 2200
然后只要该端口打开(即在您的路由器配置中进行更多端口转发),您就可以从任何地方访问该机器,甚至是外部世界。