聊一聊内网穿透

之前的离线下载是搭建在服务器,取回的时候还是有点麻烦,最好的方法是离线到路由器。但要实现这一功能,得先解决一个问题,内网怎么穿透?

什么是内网穿透

为了解释清楚这件事,需要了解几个概念。

WAN

Wide Area Network,广域网,又称外网、公网。指覆盖范围非常大的国际性的远程网络,通俗来讲就是能连全世界。

LAN

Local Area Network,局域网,又称内网。指覆盖范围很小的具有封闭性的网络,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。

路由器

内网随便接随便玩,但接外网要钱,也就是找电信拉宽带,电信会给一个账号和密码,以及一个光猫,我们在电脑上通过账号和密码来拨号上网。这样一来虽然有了网络,但不方便,因为只有电脑这一台设备能连,其他设备比如笔记本电脑、手机、电视,就只能眼巴巴地看着。怎么办?路由器就是用来解决这个问题的。

之前是电脑连接光猫,现在改成路由器连接光猫,然后所有要上网的设备来连这台路由器。路由器有无线功能,所以电脑可以通过网线来连,手机可以通过WiFi来连。

这是什么原理?很简单,路由器就是一个组织者和代理人,它把所有连上的设备组建成一个内网,这些设备要访问外网,就由它代为请求。比如

  1. 我们要查百度
  2. 路由器代我们去查
  3. 百度把结果返给路由器
  4. 路由器把结果返给我们

在这个过程中,起点是我们,终点还是我们,所以上网完全没问题。可反过来,我们的电脑要像百度一样,对外提供服务,也就是说起点是百度,终点还是百度,行不行?不行,因为百度只能找到路由器,而路由器不知道接下来找哪台设备。

举个例子,工厂拖欠工资,所有员工委托一名律师打官司,厂长不可能一个一个找员工谈,他只能找到律师,然后集体赔偿,但厂长不愿意出这么多钱,他只想把带头闹事的人搞定,于是他找到律师,问谁带的头啊?律师回答,不知道,大家的情绪都很激动。

难道就找不到带头的么?是的,除非员工事先和律师约定好,有人愿意出来谈判。赵铁柱就是这么一个人,他找到律师说,我啥也不怕,厂长找你要人,你就把我供出去。

这种事先的约定,就是在路由器上配置的端口映射。端口映射能解决路由器找设备的问题,但对于我们这些普通用户,仅仅有这一点还不够。我们没有公网IP。

还是用刚才的例子,员工委托的律师,可能并不是真正负责处理案子的律师。这名律师在接到业务后,又把它委托给另一名律师,这样他能坐着收钱。可接到委托的律师也不傻,他又转手给要价更低的实习律师。一层一层下来,厂长见到的律师,完全不认识工厂里的员工。所以我们配置的端口映射,根本没用。

在现实情况中,电信是一手运营商;长城宽带、巨龙宽带到电信办了个超大套餐,然后自己搭服务器做路由,成为了二手运营商;房东办了巨龙宽带的100M套餐,用路由器分出一根网线给你;你在房东那买了20M的宽带,再自己接个路由器,给手机和电脑使用。

公网IP这种稀缺资源,掌握在一手运营商手上。如果你是直接在电信拉的宽带,那可以直接拨打10000号找客服申请。但如果是上面这种情况,朋友,我劝你还是放弃吧。

内网穿透就是没有公网IP时,让外网访问内网设备的技术。

FRP

市面上有很多内网穿透软件,最有名的应该是花生壳,但这玩意得实名认证,而且收费,这里使用更稳定更简单的开源软件,FRP。

下载

FRP的服务端和客户端是同一个项目,但根据操作系统的不同,有不同的压缩包。下载地址

使用前最好确保服务端和客户端是同一个版本,参考官方文档

Linux服务端

虽然自己的电脑没有公网IP,但需要一台有公网IP的VPS做代理,最好有自己的域名,配置一个*.frp.zsf.com的泛解析。搭建过程如下

1
2
3
4
5
6
7
$ cd /usr/local
$ wget https://github.com/fatedier/frp/releases/download/v0.25.0/frp_0.25.0_linux_amd64.tar.gz
$ tar -zxvf frp_0.25.0_linux_amd64.tar.gz
$ mv frp_0.25.0_linux_amd64 frp
$ cd frp
$ rm -f frpc* LICENSE
$ vim frps.ini

修改配置文件frps.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common]
# 与客户端绑定的进行通信的端口
bind_port = 7000

vhost_http_port = 80
vhost_https_port = 443
# HTTP和HTTPS协议配合泛解析一起使用
subdomain_host = frp.zsf.com

# 服务端导航页面
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin

保存后启动

1
$ nohup ./frps -c ./frps.ini &

查看是否启动成功

1
$ ps -ef | grep frps

浏览器打开server.frp.zsf.com:7500可以看到所有客户端连接状态。

Linux客户端

和服务端搭建类似

1
2
3
4
5
6
7
$ cd /usr/local
$ wget https://github.com/fatedier/frp/releases/download/v0.25.0/frp_0.25.0_linux_amd64.tar.gz
$ tar -zxvf frp_0.25.0_linux_amd64.tar.gz
$ mv frp_0.25.0_linux_amd64 frp
$ cd frp
$ rm -f frps* LICENSE
$ vim frpc.ini

修改配置文件frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[common]
# 服务端地址
server_addr = server.frp.zsf.com
server_port = 7000

# 客户端管理后台
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

[test-ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
# tcp协议需要remote_port
remote_port = 6001

[test-web]
type = http
local_ip = 127.0.0.1
local_port = 6080
# http协议需要subdomain
subdomain = web

保存后启动

1
$ nohup ./frpc -c ./frpc.ini &

有几点注意事项

  1. 访问客户端管理后台localhost:7400可在线更新配置文件
  2. 不管多少个客户端映射多少个端口,每个映射名必须不一样,也就是[]中的内容
  3. tcp协议的映射地址是server.frp.zsf.com:6001
  4. http协议的映射地址是web.frp.zsf.com
  5. 因为tcp协议只有IP不存在域名,所以访问时必须加端口

Windows客户端

  1. 下载Windows压缩包,地址在上方
  2. 解压到任意位置
  3. 删除服务端文件frps*LICENSE
  4. 修改配置文件frpc.ini,和Linux客户端配置方式相同
  5. 按住Shift然后右键,选择在此处打开命令窗口
  6. 输入frpc.exe -c frpc.ini启动

可参考另一篇优秀教程,使用frp进行内网穿透