我正在开发一个Web服务架构 . 我有一些软件需要在本机主机上运行,而不是在Vagrant中运行 . 但我想在访客上运行一些客户服务 .
Vagrant的 config.vm.forwarded_port 参数将打开主机上的端口并将数据发送给guest虚拟机 . 但是如何在guest虚拟机上打开端口并将数据发送给主机? (它仍然是端口转发,但反方向 . )
config.vm.forwarded_port
当你运行 vagrant ssh 时,它实际上正在使用这个底层命令:
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 选项按所需方向转发端口 . 因此,如果要连接到guest虚拟机上的端口 12345 并将其转发到 localhost:80 ,则可以使用以下命令:
-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 ssh -- -R 12345:localhost:80
在由Vagrant的创建者撰写的书 Vagrant: Up and Running (Pub . date:June 12,2013)中,他提到客户机无法访问在主机上运行的服务 .
Vagrant: Up and Running
您可以使用 Host-Only Networks 设置专用网络,而不是使用 Forwarded Ports .
Host-Only Networks
Forwarded Ports
在 Forwarded Ports 上使用 Host-Only Networks 的优点
来宾计算机可以访问主机上运行的服务
此功能可以解决您的问题 .
此功能对于将服务分离到多台计算机上以更准确地模拟 生产环境 环境非常有用 .
外部计算机无法访问客户机上运行的服务
无需配置每一个 Forwarded Port
Forwarded Port
config.vm.network :"hostonly", "192.168.0.0" #Vagrant版本#1
config.vm.network :"hostonly", "192.168.0.0"
config.vm.network :private_network, ip: "192.168.0.0" #Vagrant Version#2
config.vm.network :private_network, ip: "192.168.0.0"
在 Vagrantfile 中包含此行将指示vagrant创建具有静态IP地址的专用网络: 192.168.0.0
Vagrantfile
192.168.0.0
主机的IP地址始终是相同的IP地址,但最终的八位字节为1.在前面的示例中,主机的IP地址为 192.168.0.1 .
192.168.0.1
您可以通过来宾操作系统内的默认网关访问主机上的端口 . (其IP通常为 10.0.2.2 . )
10.0.2.2
例如,如果您的主机上有端口8000运行的Web服务器...
echo 'Hello, guest!' > hello python -m SimpleHTTPServer 8000
您可以在 10.0.2.2:8000 从Vagrant VM内部访问它(提供 10.0.2.2 是访客默认网关的IP):
10.0.2.2:8000
vagrant ssh curl http://10.0.2.2:8000/hello # Outputs: Hello, guest!
要在guest虚拟机操作系统中查找默认网关的IP,请在Windows guest虚拟机上运行 netstat -rn (或 ipconfig )并查找目标IP为 0.0.0.0 的行(或Windows上标记为"Default Gateway"的字段):
netstat -rn
ipconfig
0.0.0.0
$ 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
您可以使用 netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2 以编程方式提取此IP .
netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2
来源:如何从vagrant virtualbox机器连接主机PostgreSQL;从VirtualBox来宾操作系统连接到主机?
将以下内容添加到主机上的 ~/.ssh/config :
~/.ssh/config
Host 127.0.0.1 RemoteForward 52698 127.0.0.1:52698
只要您通过 vagrant ssh 登录,它就允许您从Vagrant访问主机端口52698上的服务 .
您可以通过在vagrant VM上运行 netstat -lt 并在以下行中记录来确认它是否有效:
netstat -lt
tcp 0 0 localhost:52698 *:* LISTEN tcp6 0 0 ip6-localhost:52698 [::]:* LISTEN
我可以通过本地IP地址(而不是其环回地址)访问在我的主机上运行的服务 . 我通过在端口80(然后在端口987上)和 curl ing 197.45.0.10:80和197.45.0.10:987(更改实际IP地址以保护无辜)创建了一个http服务器进行了测试 . 它有效,但我没有转发端口80和987 . 因此,可以尝试使用主机的本地或公共IP地址 .
curl
如果你想从另一个访问(ssh into)一个来宾流浪者实例,你可以启用 public_network 以及从 Vagrantfile 中的端口22转发,如下所示:
public_network
config.vm.network "public_network" config.vm.network "forwarded_port", guest: 22, host: 2200
然后只要该端口打开(即在路由器配置中执行更多端口转发),您就可以从任何地方,甚至外部世界访问该机器 .
5 回答
当你运行
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
选项按所需方向转发端口 . 因此,如果要连接到guest虚拟机上的端口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的创建者撰写的书
Vagrant: Up and Running
(Pub . date:June 12,2013)中,他提到客户机无法访问在主机上运行的服务 .您可以使用
Host-Only Networks
设置专用网络,而不是使用Forwarded Ports
.在
Forwarded Ports
上使用Host-Only Networks
的优点来宾计算机可以访问主机上运行的服务
此功能可以解决您的问题 .
此功能对于将服务分离到多台计算机上以更准确地模拟 生产环境 环境非常有用 .
外部计算机无法访问客户机上运行的服务
无需配置每一个
Forwarded Port
Host-Only Networks
config.vm.network :"hostonly", "192.168.0.0"
#Vagrant版本#1config.vm.network :private_network, ip: "192.168.0.0"
#Vagrant Version#2在
Vagrantfile
中包含此行将指示vagrant创建具有静态IP地址的专用网络:192.168.0.0
主机的IP地址始终是相同的IP地址,但最终的八位字节为1.在前面的示例中,主机的IP地址为
192.168.0.1
.您可以通过来宾操作系统内的默认网关访问主机上的端口 . (其IP通常为
10.0.2.2
. )例如,如果您的主机上有端口8000运行的Web服务器...
您可以在
10.0.2.2:8000
从Vagrant VM内部访问它(提供10.0.2.2
是访客默认网关的IP):要在guest虚拟机操作系统中查找默认网关的IP,请在Windows guest虚拟机上运行
netstat -rn
(或ipconfig
)并查找目标IP为0.0.0.0
的行(或Windows上标记为"Default Gateway"的字段):您可以使用
netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2
以编程方式提取此IP .来源:如何从vagrant virtualbox机器连接主机PostgreSQL;从VirtualBox来宾操作系统连接到主机?
将以下内容添加到主机上的
~/.ssh/config
:只要您通过
vagrant ssh
登录,它就允许您从Vagrant访问主机端口52698上的服务 .您可以通过在vagrant VM上运行
netstat -lt
并在以下行中记录来确认它是否有效:我可以通过本地IP地址(而不是其环回地址)访问在我的主机上运行的服务 . 我通过在端口80(然后在端口987上)和
curl
ing 197.45.0.10:80和197.45.0.10:987(更改实际IP地址以保护无辜)创建了一个http服务器进行了测试 . 它有效,但我没有转发端口80和987 . 因此,可以尝试使用主机的本地或公共IP地址 .如果你想从另一个访问(ssh into)一个来宾流浪者实例,你可以启用
public_network
以及从Vagrantfile
中的端口22转发,如下所示:然后只要该端口打开(即在路由器配置中执行更多端口转发),您就可以从任何地方,甚至外部世界访问该机器 .