Vagrant 流浪反向端口转发?
我正在研究web服务体系结构。我有一些软件需要在本机主机上运行,而不是在Vagrant中运行。但我想为客人提供一些客户服务Vagrant 流浪反向端口转发?,vagrant,portforwarding,Vagrant,Portforwarding,我正在研究web服务体系结构。我有一些软件需要在本机主机上运行,而不是在Vagrant中运行。但我想为客人提供一些客户服务 Vagrant的config.vm.forwarded\u port参数将在主机上打开一个端口,并将数据发送给来宾。但是如何在来宾机上打开端口并将数据发送到主机?(它仍然是端口转发,但方向相反。)当您运行vagrant ssh时,它实际上在使用下面的命令: ssh-p 2222-o UserKnownHostsFile=/dev/null-o StrictHostKeyCh
Vagrant的
config.vm.forwarded\u port
参数将在主机上打开一个端口,并将数据发送给来宾。但是如何在来宾机上打开端口并将数据发送到主机?(它仍然是端口转发,但方向相反。)当您运行vagrant ssh
时,它实际上在使用下面的命令:
ssh-p 2222-o UserKnownHostsFile=/dev/null-o StrictHostKeyChecking=no-o LogLevel=ERROR-o identiesonly=yes-i~/.vagrant.d/unsecure\u private\u keyvagrant@127.0.0.1
SSH支持使用-R guestport:host:hostport
选项沿您想要的方向转发端口。因此,如果您想连接到来宾机上的端口12345
,并将其转发到localhost:80
,您可以使用以下命令:
ssh-p 2222-R 12345:localhost:80-o UserKnownHostsFile=/dev/null-o strichostkeychecking=no-o LogLevel=ERROR-o identiesonly=yes-i~/.vagrant.d/unsecure\u private\u keyvagrant@127.0.0.1
正如Eero正确评论的那样,您还可以使用命令
vagrant ssh--R 12345:localhost:80
,它在一个更简洁的命令中具有相同的效果。在《vagrant:Up and Running(发布日期:2013年6月12日)一书中,由vagrant的创建者编写,他提到来宾计算机不可能访问主机上运行的服务
您不必使用转发端口
,而可以使用仅主机网络
设置专用网络
- 在转发端口上使用仅主机网络的优点
- 来宾计算机可以访问主机上运行的服务 此功能将解决您的问题
- 来宾计算机可以访问在其他来宾计算机上运行的服务 此功能对于将服务分离到多台机器上以更准确地模拟生产环境非常有用
- 稳妥 外部计算机无法访问来宾计算机上运行的服务
- 减少工作量
无需配置每个
转发端口
- 如何配置仅限主机的网络
#流浪版本#1config.vm.network:“仅主机”,“192.168.0.0”
#Vagrant Version#2 在您的config.vm.network:private_网络,ip:“192.168.0.0”
vagrant文件中有这一行将指示vagrant创建一个具有静态IP地址的专用网络:
主机的IP地址始终是相同的IP地址,但最后的八位字节为1。在前面的示例中,主机的IP地址为192.168.0.0
192.168.0.1
curl
ing197.45.0.10:80和197.45.0.10:987(实际ip地址已更改以保护无辜者)上创建http服务器进行测试。这两次都有效,我没有任何特殊的流浪配置(没有公共网络,没有转发的端口),虽然我确实有一些端口通过PuTTY转发,但我没有转发端口80和987。因此,可以尝试使用主机的本地或公共IP地址
如果您想从另一个guest vagrant实例访问(ssh)一个guest vagrant实例,您可以启用public\u network
以及从vagrant文件中的端口22进行转发,如下所示:
config.vm.network "public_network"
config.vm.network "forwarded_port", guest: 22, host: 2200
然后,只要该端口处于打开状态(即在路由器配置中执行更多端口转发),您就可以从任何地方,甚至从外部世界访问该计算机。将以下内容添加到主机上的~/.ssh/config
:
Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698
它允许您从Vagrant访问主机端口52698上的服务,只要您通过Vagrant ssh
登录即可
您可以在vagrant VM上运行netstat-lt
,并在以下几行中记下注意事项,以确认其工作正常:
tcp 0 0 localhost:52698 *:* LISTEN
tcp6 0 0 ip6-localhost:52698 [::]:* LISTEN
您可以通过来宾操作系统内的默认网关访问主机上的端口。(其IP通常为10.0.2.2
)
例如,如果您的主机上有一个运行在8000端口上的Web服务器
echo 'Hello, guest!' > hello
python -m SimpleHTTPServer 8000
您可以从Vagrant VM内部访问它,网址为10.0.2.2:8000
(提供的10.0.2.2
是来宾默认网关的ip):
要查找来宾操作系统中默认网关的IP,请在Windows来宾操作系统上运行netstat-rn
(或ipconfig
),并查找目标IP为0.0.0
(或Windows上标记为“默认网关”的字段)的行:
您可以使用netstat-rn | grep“^0.0.0.0”| tr-s”| cut-d“-f2
以编程方式提取此IP
资料来源: 由于Vagrant正在使用SSH,因此理论上是可能的,并且支持这种情况,但在Vagrant docu中从未见过类似的情况。另请参见:您可以使用Vagrant SSH更简单地运行它--R 12345:localhost:80
这遵循SSH选项语法-R[bind_address:]port:host:hostport,其中,第一个数字是来宾计算机内部要侦听的端口号,最后两个是从主机可见的服务地址。据我所知,反向转发仅在相应的ssh外壳中有效。我认为Dan Fabulich想要一个不需要ssh到vm的解决方案。@Alp我相信它是整个系统可用的端口,而不仅仅是ssh进程可用的端口。对我来说很好!对于使用PuTTy的用户,配置gui的SSH/Tunnels部分允许远程端口转发(因此命令中使用-R)或Lo
vagrant ssh
curl http://10.0.2.2:8000/hello # Outputs: Hello, guest!
$ 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