我正在研究 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
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所指出的,你也可以使用vagrant ssh -- -R 12345:localhost:80
命令,这个命令有相同的效果,而且更为简洁。
vagrant ssh -- -R 12345:localhost:80
来运行此操作。这遵循了ssh选项语法 -R _[bind_address:]port:host:hostport_,其中第一个数字是在虚拟机内部监听的端口号,最后两个数字是从主机机器可见的服务地址。 - Eerovagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
- ibizamanifconfig
命令来查找其IP地址。 - nucleartide192.168.0.0
是不起作用的 - 对主机进行curl / ping操作会导致连接超时。使用@Nucleon的地址(与Vagrant文档上的主题一致)按照广告运作。 - markdsieversconfig.vm.network :private_network, ip: "192.168.0.0"
并在192.168.0.1
上进行curl / ping测试时,结果是连接超时。将网络配置为192.168.50.4
解决了这个问题,即主机现在可通过192.168.50.1
访问。 - markdsievers您可以通过虚拟机内部的默认网关(通常具有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
是guest的默认网关的IP地址):
vagrant ssh
curl http://10.0.2.2:8000/hello # Outputs: Hello, guest!
要在虚拟机操作系统中查找默认网关的IP,请运行netstat -rn
命令(或在Windows虚拟机上运行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。
来源:如何从vagrant virtualbox机器连接到主机PostgreSQL; 如何从VirtualBox客户机操作系统连接到主机
ifconfig
和ip address
都不能给我我需要的信息,但是netstat -rn
可以。 - geerlingguy在主机上,请将以下内容添加到您的~/.ssh/config
文件中:
Host 127.0.0.1
RemoteForward 52698 127.0.0.1:52698
只要您通过vagrant ssh
登录,就可以从Vagrant访问主机端口52698上的服务。
您可以在Vagrant虚拟机上运行netstat -lt
并注意以下行来确认其是否有效:
tcp 0 0 localhost:52698 *:* LISTEN
tcp6 0 0 ip6-localhost:52698 [::]:* LISTEN
config.vm.network "public_network"
config.vm.network "forwarded_port", guest: 22, host: 2200