内网穿透服务

微信开发中经常用到内网穿透,因为要使微信的服务器访问到开发机上的服务就必须使用内网穿透技术,起码在 IPV4 时代是这样的。关于内网穿透其实很多时候使用的是网络上的网络服务商提供的内网穿透服务,比如国内的 natapp.cn

免费版的不能自定义域名,基本上只能临时试试。但是即使是 9 元 / 月 还是不如云服务器的划算,连续买上十二个月的 9 元 / 月 隧道还不如直接买个云服务器自己搭建一个内网穿透服务。腾讯云的服务器学生机一年也才 80 多元,而且功能远远不止内网穿透,所以还是自己搭建一个内网穿透服务比较划算,顺带学习一下内网穿透的原理。

内网穿透的原理

内网穿透,即 NAT(Network Address Translator)穿透,是指计算机在内网(局域网)内使用私有 IP 地址,在连接外网(互联网)时使用全局 IP 地址的技术。该技术被普遍使用在有多台主机但只通过一个公有 IP 地址访问的私有网络中。比如我在实验室配置了一个服务器 Server A,当我在实验室的时候,就可以通过自己的笔记本使用 SSH 连接,因为我和服务器处于一个局域网,当我回宿舍以后,就没有办法直接使用 SSH 连接了,因为我和服务器不在一个局域网,这个时候就需要进行 NAT 穿透,让我在宿舍也可以使用 SSH 连接 Server A。

关于 NAT 的内容可以查看我的文章 《NAT 技术与 ARP 协议》

内网穿透的搭建

首先准备一台云服务器,得到云服务器的公网 IP 地址。下载对应的客户端:https://github.com/fatedier/frp/releases

我的环境是 centos7.5,所以下载了 frp_0.34.3_linux_amd64.tar.gz 下载地址是:https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz

另外客户端是 Windows,所以还需要下载 frp_0.34.3_windows_amd64.zip,下载地址是:https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_windows_amd64.zip

服务端配置

服务端配置 frps.ini:

1
2
3
[common]
bind_port = 7000
token = 12345678XXX

启动 frp 服务:

1
2
3
4
./frps

2019/04/22 22:55:35 [I] [service.go:190] frps tcp listen on 0.0.0.0:7000
2019/04/22 22:55:35 [I] [root.go:215] start frps success

出现上述即启动成功,为了方便直接写一个服务脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
vim /lib/systemd/system/frpc.service

[Unit]
Description=frp client
After=network.target

[Service]
TimeoutStartSec=30
ExecStart=/root/frp_0.34.3_linux_amd64/frps -c /root/frp_0.34.3_linux_amd64/frps.ini
ExecStop=/bin/kill $MAINPID

[Install]
WantedBy=multi-user.target

现在就可以直接后台启动 frp 服务了:

1
2
3
4
5
# 启动 frp 服务 
systemctl start frpc

# 停止 frp 服务
systemctl stop frpc

客户端配置

解压后编辑 frpc.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[common]
server_addr = 82.75.200.51
server_port = 7000
token = 12345678XXX

[http-for-tomcat]
type = tcp
local_ip = 127.0.0.1
local_port = 8080
remote_port = 7001

[http-for-nginx]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 7002

除了 common,其他 [ ] 内的名字随便起,type 是网络类型,local_ip 是本地 IP,一般写成 127.0.0.1 即可,local_port 是本地端口,remote_port 是远程端口,记得开放云服务的远程端口防火墙。

1
2
3
4
5
6
7
# 开启 frp 客户端 
./frpc

2019/04/22 23:03:11 [I] [service.go:288] [a779a30133b86f50] login to server success, get run id [a779a30133b86f50], server udp port [0]
2019/04/22 23:03:11 [I] [proxy_manager.go:144] [a779a30133b86f50] proxy added: [http-for-tomcat]
2019/04/22 23:03:12 [I] [control.go:180] [a779a30133b86f50] [video-m3u8] start proxy success
......

参考资料

1、frp in github

2、https://natapp.cn