内网穿透方案
前言
简单介绍一下NAT技术,NAT全称Network Address Translation,网络地址转换,简单来说就是把内网ip转为公网ip。由于ipv4地址逐渐枯竭,ip变的十分宝贵,出现了NAT这种技术,它可以让多个设备通过NAT路由器使用同一个公网ip访问互联网,而路由器之下的这些设备之间使用内网ip进行区分。这项技术很大程度的延缓了ipv4不够用的窘境,弊端则是很难从公网去访问内网资源。目前家用宽带很少能够分到公网ip了,基本上是多户共用一个公网ip,对于有从公网访问内网的需求(比如访问家里的摄像头,nas,服务器)的人来说,那就只有做一下内网穿透了。
目前有很多成熟的内网穿透方案,比如花生壳,frp等等。花生壳付费,frp虽然免费开源,但还是需要购买一台具有公网ip的服务器作为中转服务器,一年的费用也不低,像我这种白嫖怪花钱是不可能花钱的,于是把目光定在了zerotier和cloudflare提供的tunnel上
zerotier
注册账号
https://www.zerotier.com/ ,注册完成后登录后台点击Create A Network,会生成一个带有NETWORK ID的组,这个NETWORK ID就是之后加入局域网的门牌号
一键安装
Windows和Android的安装自不必多说,都是图形化界面。Linux也很简单,使用官方一键脚本即可
1
curl -s https://install.zerotier.com | sudo bash
开放防火墙端口
1
2
3apt-get install ufw
ufw allow 9993/udp
ufw reload加入局域网
1
zerotier-cli join "Network ID"
添加开机自启
1
2systemctl enable zerotier-one
systemctl start zerotier-one过一会在后台打勾允许加入并分配ip即可,这样加入”Network ID”的成员相当于在同一个局域网,使用zerotier分配的ip即可互相访问。
实测后,Linux和Android互相访问建立链接的速度还可以,Windows端经常出现显示在线但是ping不通其他设备的情况,需要reconnect多次,不太清楚是zerotier的问题还是GFW的问题,有资料说可以将局域网内一台设备配置为moon服务器,可以改善访问速度,有机会再研究一下。
zerotier-cli 常用命令
1 | zerotier-cli info #查询当前设备信息 |
cloudflare Tunnels
由于安卓访问内网需要手动开启一下zerotier,并且与代理冲突,不能同时使用,比较不方便,所以想到使用cloudflare Tunnels将内网的端口映射为域名,直接通过域名即可访问
准备工作
- 一个域名
- cloudflare账号
本着白嫖的原则,域名去 https://www.freenom.com/ 或者 https://nic.eu.org/ 申请一个免费的即可
然后将域名的nameserver解析到cloudflare账号下
安装cloudflared
1 | curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64.deb |
登录cloudflared
1 | cloudflared tunnel login |
然后浏览器进入输出的网址,选择要绑定的域名点击授权
创建隧道
1 | cloudflared tunnel create <name> |
会返回创建的Tunnel的UUID
创建隧道配置文件
在/root/.cloudflared/下创建文件config.yml
内容如下
1 | url: http://localhost:<port> |
<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 | cloudflared service install |
好了,现在已经在后台运行tunnel了,无论用内网外网,直接域名即可访问对应的服务