没有公网IP?来试试异地组网和端口映射的这种方式吧

1,237 阅读5分钟

一、背景

公司之前是有公网的,而且我这边恰好又有公司路由的管理权限,于是很巧妙的给自己的电脑做了 DMZ + 端口转发,加上公司的公网IP和自己的 DDNS,一直以来都使用这种方式完成局域网的服务暴露到公网上测试。

后来公司的网络因为种种原因发生了变更,目前无权管理路由了,于是只能使用内网穿透来解决,但为了一劳永逸,我直接使用了P2P异地组网的方式,加上自己的公网服务器来解决工作上一些网络相关的问题:

二、实现目标

  • 2.1. 异地虚拟局域网组网

    因为工作需要,经常在家里或者公司互相远程访问,包括远程桌面、SSH、数据库等等。

  • 2.2. 局域网服务对外暴露

    比如一些支付业务的开发测试,又或者是一些本地的小服务临时需要让外网访问等等。

  • 2.3. 避免第三方的服务器带宽限制

    传统使用一些内网穿透都会受到一些公网服务器带宽的限制。

三、异地P2P组网

我们使用了 Zerotier 来做局域网组网。

3.1. 注册账号并创建网络

具体可以搜索 zerotier 进入官网,注册账号后点击 Create A Network

QQ_1729914387523.png

3.2. 配置网络基础信息

3.2.1 基础配置 Basics 部分

只需要输入网络名称,选择公开或私有即可,我这里选择了私有。

QQ_1729914846208.png

3.2.2 高级配置 Advanced

可以设置 路由 DHCP 地址段DNS服务器

  • 路由配置

    这里可以自由添加,比如内网的 192.168.1.0/24 统一访问到我家里的网关 192.168.1.1,我们就可以直接添加这一跳的静态路由,这样就完成了家里所有设备也能在我的虚拟局域网中访问到。

    QQ_1729914820423.png

    这里我直接配置为 10.0.0.0/24 via 10.0.0.1

  • DHCP 配置

    DHCP可以自行配置IP的起始段,这里我直接配置了 10.0.0.2 TO 10.0.0.100

    QQ_1729914875276.png

  • 其他配置

    你可以按照自己的喜好配置其他的,比如 DNS 等。

3.2.3 添加网络节点

接下来,你可以使用你的 Mac / Windows / Linux / iPhone / Android 等设备加入你的网络。

因为设备有限,这里我只是用 MaciPhone 来演示,首先是获取自己的网络ID:

QQ_1729915236689.png

  • Mac 客户端

    可以在 zerotier 官网下载后安装,然后输入网络ID连接即可。

    QQ_1729915408063.png

  • iOS

    这里目前只能使用 非国区 的 Apple ID 来下载 Zerotier One APP,同样的添加网络即可 QQ_1729915552334.png

3.2.4 授权节点

在添加节点后,需要在 zerotier 网络管理后台授权节点,否则节点无法加入网络。也可以为设备手动分配IP。

QQ_1729915613796.png

3.3. 网络测试

接下来,所有的客户端都配置完毕后,查看控制台的设备应该是全都连接正常,接下来我们直接使用 ping 命令来测试网络是否打通。

QQ_1729915460258.png

ping 一下速度:

image.png

3.4. 业务应用

我们的需求大致如下:

3.4.1 SSH

公司的电脑、家里的电脑、手机、云服务器都开通了 ssh 登录,于是接下来我们可以把随意的使用内网IP来进行连接(iPhone 使用了 ish-app 这个应用):

ssh root@10.0.0.x 到任意的设备

3.4.2 Web服务

同上,我们也可以通过内网IP访问到公司、家里的电脑、手机、云服务器的web服务:

http://10.0.0.x/ 到任意的设备

如果需要公网访问,只需要在我们的 阿里云香港公网网关上 做一个反向代理 到任意设备即可(请继续阅读第四段)

3.4.3 远程桌面

可以使用这些在网设备做互相的远程桌面,比如我在家使用 MacBook Pro 直接通过 Mac 自带的 屏幕共享 来随时连接公司的电脑:

QQ_1729916321684.png

四、Nginx动态反向代理

第三步中我们完成了 远程桌面 SSH 内网HTTP服务等的正常访问,接下来我们通过公网的服务器把内网的服务动态方向代理出去。

  • 阿里云公网服务器也是通过了 zerotier 加入了虚拟局域网的,IP是 10.0.0.2

  • 家里的 MacBook-Pro-15 IP是 10.0.0.5,MacBook-Pro-16 IP是 10.0.0.6

  • 公司的 Mac Mini IP是 10.0.0.4

于是我们直接在阿里云公网服务器上直接做了反向代理到对应的局域网设备上:

http{
  ...
  map $host $port_4 {
      default 80; 
      "~^([0-9]+)\.4\.hamm\.cn$" $1;
  }
  map $host $port_5 {
      default 80; 
      "~^([0-9]+)\.5\.hamm\.cn$" $1;
  }
  ...
  server
  {
      listen 80;
      server_name *.4.hamm.cn;
      location / {
          proxy_pass http://10.0.0.4:$port_4;
      }
  }
  server
  {
      listen 80;
      server_name *.5.hamm.cn;
      location / {
          proxy_pass http://10.0.0.5:$port_5;
      }
  }
  ...
}

接下来,我们就可以通过下面的方式访问到任意一个局域网设备上的 http 服务了。(这里我还直接给上了通配符https证书)

访问方式 https://端口.IP.hamm.cn

如访问 Mac Mini 的 3000 端口,则只需要访问 3000.4.hamm.cn 即可。而且任意切换端口访问都无需去配置或重启公网服务器。

五、总结

又水了一篇,美滋滋。

如果你也喜欢 网络运维后端开发前端开发架构设计 等话题,欢迎关注收藏加点赞,一键三连是一种美德哈哈哈。

下一篇,我们将来完成组网后的企业内部服务的一环:

如何在异地组网之后搭建自己的企业局域专网

That's all.

六、什么?爬墙?

本文完。