无用的反向端口转发?


121

我正在研究Web服务体系结构。我有一些需要在本地主机上运行的软件,而不是在Vagrant中运行。但我想在来宾上运行一些客户端服务。

Vagrant的config.vm.forwarded_port参数将打开主机上的端口并将数据发送给来宾。但是,如何在客户机上打开端口并将数据发送到主机?(它仍然是端口转发,但方向相反。)


由于Vagrant使用SSH,从理论上讲是有可能的,并且Ruby SSH实现gem支持此功能,但从未在Vagrant文​​档中看到这样的内容。
cmur2

Answers:


134

当您运行时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,它在更简洁的命令中具有相同的效果。


67
并且可以使用vagrant ssh -- -R 12345:localhost:80 以下命令更简单地运行它。它遵循ssh选项语法-R [bind_address:] port:host:hostport,其中第一个数字是客户机内要监听的端口号,后两个是服务地址从主机可见。
Eero

1
据我了解,反向转发仅适用于相应的ssh shell。我认为Dan Fabulich希望找到一种解决方案,而无需SSH进入虚拟机。
阿尔卑斯山

2
@Alp我认为这是整个系统可用的端口,而不仅仅是ssh进程可用。对我来说很好!
Henrik Heimbuerger 2014年

1
对于使用PuTTy的用户,配置gui的SSH / Tunnels部分允许远程端口转发(因此命令中的-R)或本地端口转发(命令行中的-L)
Titou

3
或者,如果您有多个流浪者设置,则说明了流浪者的潜在差异配置:vagrant ssh-config | ssh -F /dev/stdin $BOX -R $PORT_VM:localhost:$PORT -N
ibizaman 2015年

100

在书里 Vagrant: Up and Running由Vagrant的创建者撰写的(出版日期:2013年6月12日)中,他提到来宾计算机无法访问主机上运行的服务。

Forwarded Ports您可以使用来建立专用网络,而不是使用Host-Only Networks

  • 使用的优点Host-Only NetworksForwarded Ports

    1. 来宾计算机可以访问主机上运行的服务

      此功能将解决您的问题。

    2. 来宾计算机可以访问在其他来宾计算机上运行的服务

      此功能对于将服务分离到多台计算机上以更准确地模拟生产环境非常有用。

    3. 安全

      外部计算机无法访问来宾计算机上运行的服务

    4. 少工作

      无需配置每一个 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


2
同样(也来自Vagrant: Up and Running),您可以建立桥接网络。在桥接网络上,本地网络中的其他计算机可以访问您的虚拟机,反之亦然。但是由于IP地址是通过DHCP分配的,因此您必须ifconfig在虚拟机中找到其IP地址。
激进党

28
设置config.vm.network:private_network时,ip:“ 192.168.50.4”的事实意味着来宾将通过转到“ 192.168.50.1”访问主机,这是这里的关键信息。我找不到任何地方记录的那条小花絮。
Nucleon

1
我发现使用的答案地址192.168.0.0无效-卷曲/ ping主机导致连接t / o。使用@Nucleon的地址(与该主题上的Vagrant文​​档一致)按广告宣传进行。
markdsievers

8
@Mingyu否-使用您的配置行config.vm.network :private_network, ip: "192.168.0.0"并对主机进行卷曲/ ping操作192.168.0.1导致连接超时。配置要192.168.50.4解析的网络,即位于的主机192.168.50.1
markdsievers

3
“192.168.0.0”不是一个很好的例子,通常XXX0是用于广播ING
number5

73

您可以通过来宾OS内的默认网关访问主机上的端口。(通常具有的IP 10.0.2.2。)

例如,如果您的主机上有一个运行在端口8000上的网络服务器...

echo 'Hello, guest!' > hello
python -m SimpleHTTPServer 8000

您可以从Vagrant VM内部访问它10.0.2.2:800010.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来宾操作系统连接到主机?


我也非常喜欢此解决方案,因为它甚至无需停止我当前的无聊ssh会话即可工作。谢谢!
Rubix

太棒了!这正是我在寻找的东西
Khan Shahrukh

优秀的!ifconfigip address没有得到我需要的东西,但是netstat -rn做到了。
geerlingguy

9

~/.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

2
+1这对我有很大帮助。我添加了给定的文本,替换为端口5037,以使我的无所事事的盒子能够收听在我的主机上运行的android模拟器。

2

我可以通过其本地IP地址(而不是其环回地址)访问在主机上运行的服务。我通过在端口80(然后在端口987)上创建一个http服务器并curling 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

然后,只要该端口打开(即在路由器配置中进行更多端口转发),您就可以从任何地方(甚至是外界)访问该计算机。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.