流浪汉反向端口转发? ?

我在研究一个 Web 服务架构。我有一些软件需要在本地主机上运行,而不是在流浪汉中。但我想给客人做些客户服务。

Vagrant 的 config.vm.forwarded_port参数将在主机上打开一个端口,并将数据发送给客户机。但是我怎样才能在客户端上打开一个端口并将数据发送给主机呢?(它仍然是端口转发,但方向相反。)

49904 次浏览

当您运行 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: Up and Running(酒吧。Date: June 12,2013) ,由 Vagrant 的创建者撰写,他提到客户机不可能访问在主机上运行的服务。

您可以使用 Host-Only Networks建立一个私有网络,而不是使用 Forwarded Ports

  • Forwarded Ports上使用 Host-Only Networks的优点

    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

我可以通过主机的本地 IP 地址(而不是回送地址)访问运行在主机上的服务。我通过在端口80(然后在端口987)和 curling 197.45.0.10:80和197.45.0.10:987(实际 IP 地址更改以保护无辜者)上创建一个 http 服务器来进行测试。它两次都工作了,我没有任何特殊的流浪配置(没有 public _ network,没有 forward _ port) ,虽然我有一些端口通过 PuTTY 转发,我没有端口80和987转发。因此,也许可以尝试使用主机的本地或公共 IP 地址。

如果你想从一个客人流浪者实例访问(ssh)另一个客人流浪者实例,你可以启用 public_network,也可以像这样从 Vagrantfile的端口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登录。

您可以通过在流浪 VM 上运行 netstat -lt并记下以下代码行来确认它的工作原理:

tcp      0    0 localhost:52698         *:*                 LISTEN
tcp6     0    0 ip6-localhost:52698     [::]:*              LISTEN

您可以通过客户操作系统中的默认网关访问主机上的端口。(IP 通常为 10.0.2.2)

例如,如果您的主机上有一个运行在8000端口上的 webserver..。

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(或 Windows 客户端上的 ipconfig)并查找目标 IP 为 0.0.0.0的行(或 Windows 上标记为“ Default Gateway”的字段) :

$ 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。

资料来源: 如何从流浪虚拟机连接主机 PostgreSQL; 从 VirtualBox 客户操作系统连接到主机?