我正在开发一个Web服务架构。我有一些软件需要在本机主机上运行,而不是在Vagrant中运行。但我想在客人身上运行一些客户服务。
Vagrant的config.vm.forwarded_port
参数将打开主机上的端口并将数据发送给访客。但是如何在guest虚拟机上打开端口并将数据发送给主机? (它仍然是端口转发,但反方向。)
答案 0 :(得分:125)
当您运行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
,它在更简洁的命令中具有相同的效果。
答案 1 :(得分:97)
在由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"
#Vagrant Version#1
config.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
。
答案 2 :(得分:62)
您可以通过来宾操作系统内的默认网关访问主机上的端口。 (通常IP为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):
vagrant ssh
curl http://10.0.2.2:8000/hello # Outputs: Hello, guest!
要在来宾操作系统中查找默认网关的IP,请在Windows来宾上运行netstat -rn
(或ipconfig
)并查找目标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
您可以使用netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2
以编程方式提取此IP。
来源:How to connect with host PostgreSQL from vagrant virtualbox machine; Connect to the host machine from a VirtualBox guest OS? 子>
答案 3 :(得分:7)
将以下内容添加到主机上的~/.ssh/config
:
Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698
只要您通过vagrant ssh
登录,就可以从Vagrant访问主机端口52698上的服务。
您可以通过在vagrant VM上运行netstat -lt
并记下以下几行来确认它是否有效:
tcp 0 0 localhost:52698 *:* LISTEN
tcp6 0 0 ip6-localhost:52698 [::]:* LISTEN
答案 4 :(得分:2)
我可以通过本地IP地址(而不是其环回地址)访问在我的主机上运行的服务。我通过在端口80上创建一个http服务器(然后在端口987上)和curl
197.45.0.10:80和197.45.0.10:987(实际IP地址已更改以保护无辜者)进行测试。它有两次工作,我没有任何特殊的流浪汉配置(没有public_network,没有forwarding_port),虽然我有一些端口通过PuTTY转发,但我没有转发端口80和987。因此,可以尝试使用主机的本地或公共IP地址。
如果您想从另一个访问(ssh into)一个来宾流浪者实例,您可以启用public_network
以及Vagrantfile
中的端口22转发,如下所示:
config.vm.network "public_network"
config.vm.network "forwarded_port", guest: 22, host: 2200
然后只要该端口处于打开状态(即在路由器配置中进行更多端口转发),您就可以从任何地方,甚至是外部世界访问该机器。