我正在研究Web服务体系结构。我有一些需要在本地主机上运行的软件,而不是在Vagrant中运行。但我想在来宾上运行一些客户端服务。
Vagrant的config.vm.forwarded_port
参数将打开主机上的端口并将数据发送给来宾。但是,如何在客户机上打开端口并将数据发送到主机?(它仍然是端口转发,但方向相反。)
我正在研究Web服务体系结构。我有一些需要在本地主机上运行的软件,而不是在Vagrant中运行。但我想在来宾上运行一些客户端服务。
Vagrant的config.vm.forwarded_port
参数将打开主机上的端口并将数据发送给来宾。但是,如何在客户机上打开端口并将数据发送到主机?(它仍然是端口转发,但方向相反。)
Answers:
当您运行时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
选项按您想要的方向转发端口。因此,如果要连接到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 ssh -- -R 12345:localhost:80
以下命令更简单地运行它。它遵循ssh选项语法-R [bind_address:] port:host:hostport,其中第一个数字是客户机内要监听的端口号,后两个是服务地址从主机可见。
vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
在书里 Vagrant: Up and Running
由Vagrant的创建者撰写的(出版日期: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
指示流浪者创建一个具有静态IP地址的专用网络:192.168.0.0
主机的IP地址始终是相同的IP地址,但最后一个八位位组为1。在前面的示例中,主机将具有IP地址192.168.0.1
。
Vagrant: Up and Running
),您可以建立桥接网络。在桥接网络上,本地网络中的其他计算机可以访问您的虚拟机,反之亦然。但是由于IP地址是通过DHCP分配的,因此您必须ifconfig
在虚拟机中找到其IP地址。
192.168.0.0
无效-卷曲/ ping主机导致连接t / o。使用@Nucleon的地址(与该主题上的Vagrant文档一致)按广告宣传进行。
config.vm.network :private_network, ip: "192.168.0.0"
并对主机进行卷曲/ ping操作192.168.0.1
导致连接超时。配置要192.168.50.4
解析的网络,即位于的主机192.168.50.1
。
您可以通过来宾OS内的默认网关访问主机上的端口。(通常具有的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
。
资料来源:如何从无所事事的virtualbox机器与主机PostgreSQL连接;从VirtualBox来宾操作系统连接到主机?
ifconfig
并ip address
没有得到我需要的东西,但是netstat -rn
做到了。
~/.ssh/config
在主机上添加以下内容:
Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698
只要您通过进行登录,就可以从Vagrant访问主机端口52698上的服务vagrant ssh
。
您可以通过netstat -lt
在无业游民的VM上运行并在以下几行上记笔记来确认它是否有效:
tcp 0 0 localhost:52698 *:* LISTEN
tcp6 0 0 ip6-localhost:52698 [::]:* LISTEN
我可以通过其本地IP地址(而不是其环回地址)访问在主机上运行的服务。我通过在端口80(然后在端口987)上创建一个http服务器并curl
ing 197.45.0.10:80和197.45.0.10:987(更改了实际IP地址以保护无辜者)进行测试。它两次都起作用,并且我没有任何特殊的流浪者配置(没有public_network,没有forwarded_port),尽管我确实有一些通过PuTTY转发的端口,但我没有转发80和987端口。因此,也许尝试使用主机的本地或公共IP地址。
而且,如果您要从另一个访问(通过SSH进入)一个guest虚拟机实例,则可以像这样public_network
从端口22 启用和转发Vagrantfile
:
config.vm.network "public_network"
config.vm.network "forwarded_port", guest: 22, host: 2200
然后,只要该端口打开(即在路由器配置中进行更多端口转发),您就可以从任何地方(甚至是外界)访问该计算机。