stream浪汉反向端口转发?
我正在研究一个Web服务架构。 我有一些软件需要在本地主机上运行,而不是在Vagrant上运行。 但是我想在客人身上运行一些客户服务。
Vagrant的config.vm.forwarded_port
参数将在主机上打开一个端口并将数据发送给guest虚拟机。 但是我怎样才能打开客户端口并将数据发送给主机? (这仍然是端口转发,但方向相反。)
当你运行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
上的端口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: Up and Running
的创始人写的“ Vagrant: Up and Running
(公开date:2013年6月12日)一书中,他提到访客机器无法访问在主机上运行的服务。
您可以使用“ Host-Only Networks
networking”来build立专用networking,而不是使用“ Forwarded Ports
。
-
通过
Forwarded Ports
使用Host-Only Networks
优点-
访客机器可以访问在主机上运行的服务
这个function可以解决你的问题。
-
访客机器可以访问在其他访客机器上运行的服务
此function将服务分离到多台机器上以更准确地模拟生产环境非常有用。
-
安全
外部机器无法访问客户机器上运行的服务
-
减less工作
无需configuration每一个
Forwarded Port
-
-
如何configuration
Host-Only Networks
config.vm.network :"hostonly", "192.168.0.0"
Version#1config.vm.network :private_network, ip: "192.168.0.0"
Version#2在
Vagrantfile
有这行Vagrantfile
将指示vagrant创build一个具有静态IP地址的专用networking:192.168.0.0
主机的IP地址始终是相同的IP地址,但最终的八位字节为1.在上例中,主机的IP地址为
192.168.0.1
。
您可以通过访客操作系统内的默认网关访问主机上的端口。 (通常具有10.0.2.2
的IP)。
例如,如果您的主机上有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 netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2
netstat -rn | grep "^0.0.0.0 " | tr -s ' ' | cut -d " " -f2
。
来源: 如何从stream浪的virtualbox机器连接主机PostgreSQL ; 从VirtualBox来宾操作系统连接到主机?
将以下内容添加到主机上的~/.ssh/config
:
Host 127.0.0.1 RemoteForward 52698 127.0.0.1:52698
它可以让你访问从Vagrant的主机端口52698服务,只要你通过vagrant ssh
。
您可以通过在vagrant虚拟机上运行netstat -lt
并在以下几行注释来确认它的工作原理:
tcp 0 0 localhost:52698 *:* LISTEN tcp6 0 0 ip6-localhost:52698 [::]:* LISTEN
我可以通过本地IP地址(而不是其回送地址)访问在主机上运行的服务。 我通过在端口80(然后在端口987)上创build一个http服务器,并testing197.45.0.10:80和197.45.0.10:987(实际的IP地址改变以保护无辜者)来testing。 它工作两次,我没有任何特别的stream浪者configuration(没有public_network,没有forwarded_port),虽然我有一些端口通过PuTTY转发,我没有端口80和987转发。 所以也许尝试使用主机的本地或公共IP地址。
如果你想访问(ssh)一个来自另一个游客stream浪的实例,你可以启用public_network
以及从stream量文件中的22端口转发,如下所示:
config.vm.network "public_network" config.vm.network "forwarded_port", guest: 22, host: 2200
然后只要该端口是开放的(即在你的路由器configuration中做更多的端口转发),你可以从任何地方,甚至外部世界访问该机器。