本文会从“是什么、为什么、怎么做”这三方面来介绍“内网穿透”。
是什么
内网穿透是可以在你有网络的任何时间、任何地点都可以访问家中的设备。
但其实,互联网的作用就是这个,那为什么还要用内网穿透。这就是接下来讨论的:
首先搞明白,互联网怎么做到可以连接每个设备后,使每个设备可以互相通讯的。通讯的基础是我能找到你,我怎么找到你的,是因为你有一个独一无二的地址,也就是ipv4地址。但ipv4地址只有42亿个,不够每个设备分的,所以没分到的设备就通讯不了了,解决这个问题就出现了ipv6、NAT技术和动态分配这3种方法。
- ipv6有接近无数个地址,解决了。
- NAT技术就是好多个设备用一个ipv4地址,比如家里的路由器就可以用一个ipv4去让好多个设备共同上网。原理是在你发出请求数据包时,路由器会记住这个数据包是你这台设备发出的(也就是记住设备的内网ip)并且把请求数据包数据改一下(可以让请求数据包回来的时候从某个特定端口进入内网),同时会把端口号和设备的内网ip绑定,之后在有回答你的请求的数据包通过你路由器的ipv4地址回来时,路由器就会查询这个数据包是哪个端口收到的,并查看这个端口和哪个内网ip绑定了,就发送出去。这样所有内网设备都可以用一个ipv4地址上网了。
- 动态分配,因为动态分配所有有了动态公网ip,也就是变化的ipv4地址,它的机制就是让有联网需求的设备分配到公网ip,没有需求的暂时不给公网ip。
接下来这3种方法怎么连接家里的设备
- 既然ipv6使每个设备都有地址,那么可以直接连接到你家里的设备。
- 动态分配,就代表你有公网ip,所以也简单:在路由器上做一个端口转发就可以。
(就是事先让路由器知道从某个端口进来的数据,发送到哪体设备上,不需要内网设备发送数据后才绑定)。 - 最后NAT则是咱们今天的主题,如果没有公网,那大概率就是NAT了2层或更多层,那样你没办法去最外层的设备上做端口转发,所以就需要一台有公网ip的云服务器,去阿里云或者腾讯云那么租一台,让家里的设备联系上云服务器,而你也能联系上云服务器,就可以把流量通过云服务器中转后,你和家里的设备连接上。
为什么
你为什么需要内网穿透,也就是为什么需要随时随地访问家里的设备。那这个问题我也不知道为什么了,可能是移动办公方便,可能是你手机存不下太多的数据,文件、照片,可能是长时间不在家。
怎么做
本文基于frp去实现(附frp中文文档 ),前文咱们说了,需要云服务(用frps)和家里面的电脑(用frpc)通讯,那么就需要配置2台电脑。
首先配置云服务器
下载frp,页面里有好多文件,常用的有:
- linux系统——linux
- windows系统——windows
- 32位——86或不写
- 64位——64一定会写
- arm架构 ——arm一定会写
- x86架构——amd或不写(这个我有点疑惑,为啥是amd不是intel)
接下来你要会一点操作ssh工具的能力
按照自己带有公网ip的电脑(云服务器)去下载文件后,放到云服务器里
tar -xzvf 解压文件名
/*解压压缩包操作(使用时把‘解压文件名’换成真实的文件名)
有概率解压不成功,可能要把’xzvf‘的z去掉*/
用SFTP页面进入刚刚解压后出现的文件夹,更改frps.ini文件,示例:
[common]
bind_port = 7000 //和家里电脑(nas,路由器之类的)连接用 (*必需*)
kcp_bind_port = 7000 //在弱网环境下传输效率提升明显
vhost_http_port = 7999 //用http访问云服务器所用端口
vhost_https_port = 8000 //用https访问云服务器所用端口
dashboard_port = 7500 //访问云服务器这个端口后会出现frp监控牙面
dashboard_user = admin //frp监控页面账号
dashboard_pwd = admin //frp监控页面密码
token = password123 //家里的电脑(nas,路由器之类的)的配置文件里要有相同的token才能和云服务器连接成功
cd命令进入解压后出现的文件夹
./frps -c ./frps.ini //带着配置文件去启动frps
control+z //退出这个进程,因为咱们要设置一下开机自动启动
vi /lib/systemd/system/frps.service //添加一个文件
按i键进入编辑,输入下方内容
[Unit]
Description=frps service
After=network.target
[Service]
Type=simple
ExecStart=/root/frp/frps -c /root/frp/frps.ini
#上方根据你解压后出现的文件位置修改
[Install]
WantedBy=multi-user.target
输入后按esc键退出编辑,直接输入:wq保存并退出文件。
systemctl enable --now frps #启动frps并启动frps开机自启
配置客户端(家里的电脑)
推荐用docker,卸载容易,还能隔离原来的环境。咱们下载docker这个app后,应该会自动增加一个共享文件夹,在里面添加一个文件夹,就叫frp了。
在这个frp文件夹中放入名为frpc.ini文件,可以用txt文件改后缀名达成。
(建议去买一个域名后dns解析到云服务器的公网ip地址,再免费申请一个ssl证书,不用区分是什么nginx还是其他的,随便)
文件内容:
[common]
server_addr = 服务器域名或ip地址
server_port = 7000
token = 和服务器配置文件上token一样的数值
[nas_web]
type = https #代表https访问
custom_domains = 服务器域名
local_port = 5006 #云服务器访问本机器的端口
local_ip = 127.0.0.1 #代表内网设备地址
[nas_web2]
type = https #代表https访问
custom_domains = 服务器子域名 #子域名也要同样解析到云服务器ip地址上
#为什么这次用子域名,因为有两个https,但咱们在云服务器上就设置了一个端口,
#所以只能用两个域名区分到底是访问哪台电脑的哪个端口。
local_port = 4000 #云服务器访问内网设备的端口
local_ip = 127.0.0.1 #代表内网设备地址
[nasTesSpeed]
type = tcp
local_ip = 127.0.0.1 #代表本机地址
local_port = 1500 #云服务器访问内网设备的端口
remote_port = 6004 #你访问云服务器的端口
去docker注册表里搜索frpc,选星星✨最多的那个,群晖的这里是snowdreamtech的frpc,下载好后,去docker映像里面,双击刚下载的frpc(检查一下是不是frpc),开始设置容器。
应用后,统计一下你要用哪个端口号访问云服务器的域名,去云服务器里面把端口号防火墙打开,最后用域名+端口号,就可以访问内网了。
刚才是ssl证书没有用,如果访问内网的时候出现网站不安全的话,就把ssl证书导入到群晖的证书里,就可以了。
附:如果大家对于ssl证书操作或其他的操作不明白的话,评论区告诉我,我大概一个星期就可以更新文章去解决这类问题。