0x00 写在前面
众所周知,使用家用NAS的一个最大障碍就是没有公网IP。为了解决这个问题,就要使用内网穿透技术,将内网中的端口映射到公网中。本文就介绍通过 frp 实现内网穿透的方法。
首先,需要准备这样几个东西:
- 一台可以运行 Docker 的 NAS
- 一台公网服务器
- 一个域名
0x01 服务端(frps)
首先安装服务器上的程序,称为 frps。在 ssh 终端中输入如下命令:
wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh
chmod 700 ./install-frps.sh
./install-frps.sh install
输入如下命令以后就会进入 frps 的安装程序。程序中会要求输入一些配置信息,其中包括:
- Please select frps download url:选择从哪里下载 frps 程序
- Please input frps bind_port:输入 frps 绑定的端口,这个端口不要和服务器的其他程序端口冲突了,我设置的是 12555
- Please input frps dashboard_port:输入 frps 控制台的端口,可以用来查看 frps 程序运行的状态,不要和其他程序冲突了,我设置的是 12560
- Please input frps vhost_http_port:输入 frps 绑定 http 协议的端口,网页和 WebDAV 都通过这个端口进行访问。可以和 NAS 上的端口一致,也可以不一致。我设置的是 5123
- Please input frps vhost_https_port:输入 frps 绑定 https 协议的端口,我设置的是 5321
- Please input dashboard_user:输入 frps 控制台的用户名
- Please input dashboard_pwd:输入 frps 控制台的密码
- Please input token:输入 frps 认证令牌
- Please input frps max_pool_count:输入 frps 最大连接池数量
- Please select log_level:输入 frps 日志记录信息的级别,一般选默认即可。几种日志级别的说明:
info
是记录几乎所有的信息;warn
是记录警告信息;error
是记录错误信息;debug
是记录和调试有关的信息。
- Please input frps log_max_days:输入 frps 日志保存的天数
- Please select log_file:输入是否启用文件保存 frps 日志,默认启用
- Please select tcp_mux:输入是否启用 TCP 多路复用,默认启用
- Please select kcp support:输入是否启用 KCP,可以降低延迟。默认启用
输入完信息并且安装完成后,应该可以看到下图这样的一个界面,方便检查frps的配置:
如果发现刚才输入错误了,也还可以打开 /usr/local/frps/frps.ini 文件编辑其配置:
# [common] is integral section
[common]
# A literal address or host name for IPv6 must be enclosed
# in square brackets, as in "[::1]:80", "[ipv6-host]:http" or "[ipv6-host%zone]:80"
bind_addr = 0.0.0.0
bind_port = 12555
# udp port used for kcp protocol, it can be same with 'bind_port'
# if not set, kcp is disabled in frps
kcp_bind_port = 12555
# if you want to configure or reload frps by dashboard, dashboard_port must be set
dashboard_port = 12560
# dashboard assets directory(only for debug mode)
dashboard_user = 控制面板用户名
dashboard_pwd = 控制面板密码
# assets_dir = ./static
vhost_http_port = 5123
vhost_https_port = 5321
# console or real logFile path like ./frps.log
log_file = ./frps.log
# debug, info, warn, error
log_level = warn
log_max_days = 3
# auth token
token = 认证令牌
# only allow frpc to bind ports you list, if you set nothing, there won't be any limit
#allow_ports = 1-65535
# pool_count in each proxy will change to max_pool_count if they exceed the maximum value
max_pool_count = 最大连接池数量
# if tcp stream multiplexing is used, default is true
tcp_mux = true
subdomain_host = 主域名
这里我添加了最后一行,也就是这个 subdomain_host
的,因为后面要给内网的服务添加 https,需要绑定一个域名。
注意,这里输入的域名其实并不需要进行解析。因为将来我们访问的是它的二级域名。比如假设我写 baidu.com,但是实际上通过配置 NAS 上的程序,我们需要访问 nas.baidu.com 之类的链接才能真正访问到 frp 穿透的网页。
frps 程序还有如下指令:
frps restart #重新运行
frps start #启动
frps stop #停止
frps config #使用 vi 编辑配置
frps status #运行状态
frps version #程序版本,最好和客户端的版本匹配
0x02 NAS(frpc)
在客户端运行的程序叫 frpc。在威联通 NAS 的 Container Station 中查找 leonismoe/frpc 这个镜像。创建时将网络设置为 Host 模式:
然后设置共享文件夹:
设置好以后,在这个 /Public/frp 文件夹中添加一个名为 frpc.ini 的文件,输入如下内容:
[common]
server_addr = 服务器的IP地址
server_port = 服务器上FRPS绑定的端口
token = 你设置的token值
[nas]
type = http
local_ip = 127.0.0.1
local_port = 本地的端口(如果是管理页面,那就是8080,除非你改过)
pool_count = 20
subdomain = 二级域名
然后运行这个容器,再把完整的域名解析到服务器上,就能够通过 http://二级域名.主域名:5123 和进行访问了。
0x03 实现 https 访问
首先老规矩,在服务器上通过 acme.sh 来创建 SSL 密钥之类的文件。在终端中输入如下命令:
acme.sh --issue --standalone -d 域名
然后等待程序自动生成证书,再把生成好的证书下载下来,主要下载这两个文件:
- fullchain.cer
- 域名名称.key
下载下来这两个文件以后,把这两个文件放到 NAS 的 /Public/frp 文件夹里,然后编辑 frpc.ini 文件,前面的不用动,就添加下面这段就行了:
[nas-https]
type = https
pool_count = 20
subdomain = 二级域名
plugin = https2http
plugin_local_addr = 127.0.0.1:8080
plugin_crt_path = /etc/fullchain.cer
plugin_key_path = /etc/域名名称.key
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp
保存以后,重新运行 docker,就能使用 https://域名:5321 访问了。
0xFF 写在最后
本文是以单个端口为例,如果要将 NAS 上的多个端口实现内网穿透,可以参考 frp 的官方介绍:https://github.com/fatedier/frp