前言

简单介绍一下NAT技术,NAT全称Network Address Translation,网络地址转换,简单来说就是把内网ip转为公网ip。由于ipv4地址逐渐枯竭,ip变的十分宝贵,出现了NAT这种技术,它可以让多个设备通过NAT路由器使用同一个公网ip访问互联网,而路由器之下的这些设备之间使用内网ip进行区分。这项技术很大程度的延缓了ipv4不够用的窘境,弊端则是很难从公网去访问内网资源。目前家用宽带很少能够分到公网ip了,基本上是多户共用一个公网ip,对于有从公网访问内网的需求(比如访问家里的摄像头,nas,服务器)的人来说,那就只有做一下内网穿透了。

目前有很多成熟的内网穿透方案,比如花生壳,frp等等。花生壳付费,frp虽然免费开源,但还是需要购买一台具有公网ip的服务器作为中转服务器,一年的费用也不低,像我这种白嫖怪花钱是不可能花钱的,于是把目光定在了zerotier和cloudflare提供的tunnel上

zerotier

  1. 注册账号

    https://www.zerotier.com/ ,注册完成后登录后台点击Create A Network,会生成一个带有NETWORK ID的组,这个NETWORK ID就是之后加入局域网的门牌号

  2. 一键安装

    Windows和Android的安装自不必多说,都是图形化界面。Linux也很简单,使用官方一键脚本即可

    1
    curl -s https://install.zerotier.com | sudo bash
  3. 开放防火墙端口

    1
    2
    3
    apt-get install ufw
    ufw allow 9993/udp
    ufw reload
  4. 加入局域网

    1
    zerotier-cli join "Network ID"
  5. 添加开机自启

    1
    2
    systemctl enable zerotier-one
    systemctl start zerotier-one

    过一会在后台打勾允许加入并分配ip即可,这样加入”Network ID”的成员相当于在同一个局域网,使用zerotier分配的ip即可互相访问。

实测后,Linux和Android互相访问建立链接的速度还可以,Windows端经常出现显示在线但是ping不通其他设备的情况,需要reconnect多次,不太清楚是zerotier的问题还是GFW的问题,有资料说可以将局域网内一台设备配置为moon服务器,可以改善访问速度,有机会再研究一下。

zerotier-cli 常用命令

1
2
zerotier-cli info       #查询当前设备信息
zerotier-cli peers #查询同group在线设备

cloudflare Tunnels

由于安卓访问内网需要手动开启一下zerotier,并且与代理冲突,不能同时使用,比较不方便,所以想到使用cloudflare Tunnels将内网的端口映射为域名,直接通过域名即可访问

准备工作

  1. 一个域名
  2. cloudflare账号

本着白嫖的原则,域名去 https://www.freenom.com/ 或者 https://nic.eu.org/ 申请一个免费的即可

然后将域名的nameserver解析到cloudflare账号下

安装cloudflared

1
2
3
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb

dpkg -i cloudflared.deb

登录cloudflared

1
cloudflared tunnel login

然后浏览器进入输出的网址,选择要绑定的域名点击授权

创建隧道

1
cloudflared tunnel create <name>

会返回创建的Tunnel的UUID

创建隧道配置文件

在/root/.cloudflared/下创建文件config.yml

内容如下

1
2
3
url: http://localhost:<port>
tunnel: <Tunnel-UUID>
credentials-file: /root/.cloudflared/<Tunnel-UUID>.json

<port>替换为需要映射的端口,<Tunnel-UUID>替换为上一步的输出

将流量路由到隧道

1
cloudflared tunnel route dns <Tunnel UUID or Name> <Hostname>

<Hostname>可以是域名,也可以是三级域名

测试隧道

1
cloudflared tunnel run <UUID or Name>

正常情况下Tunnels后台的status已经变成了绿色的HEALTHY,并且访问自己的域名也是正常的。不过终端一旦CTRL+C停下来Tunnel就失效了,接下来需要配置后台启动

作为服务运行

1
2
3
cloudflared service install
systemctl enable cloudflared
systemctl start cloudflared

好了,现在已经在后台运行tunnel了,无论用内网外网,直接域名即可访问对应的服务