NAS设置内网穿透 | Nginx反向代理 | 外网访问 | 配置华为云服务器

在日常使用NAS时,相信大家通过外部网络访问NAS也是必备需求。但又苦于没有公网IP,向运营商申请又比较困难,所以在这里分享一个Nginx+Frp的内网穿透解决方案(网上也有很多介绍,这里详细写下个人的配置流程,尽量避免踩坑)

配置前准备:
必须:NAS、云服务器(这里示例华为云云曜云服务器)、ssh工具(推荐finalshell)
非必须:域名(可以不用,这里未介绍,国内域名需要备案)

1. 华为云服务器装系统ubuntu1804或Debian(这里使用ubuntu1804)

购买云耀云服务器后打开控制台操作

upload successful

首次登陆会有安装系统选项,这里我已经安装过,点击重装系统

upload successful

选择的系统镜像是ubuntu18.04,输入密码,确定,就可以开始安装了

upload successful

云服务器安装ubuntu系统成功后通过finalshell工具ssh连接,端口22登录,用户名:root 密码:安装时输入的内容

2. 在华为云服务器安装docker(手动安装和脚本安装两种方式)

2.1 手动安装:

2.1.1 更新软件包

sudo apt-get update

2.1.2 安装依赖

1
2
3
4
5
6
7
8
9
10
11
sudo apt-get install \

apt-transport-https \

ca-certificates \

curl \

gnupg \

lsb-release

2.1.3 添加Docker官方GPG密钥

1
curl -fsSL [https://download.docker.com/linux/ubuntu/gpg](https://download.docker.com/linux/ubuntu/gpg) | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

2.1.4 添加Docker软件源

1
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] [https://download.docker.com/linux/debian](https://download.docker.com/linux/debian) $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

2.1.5 安装docker

1
2
3
sudo apt-get update

sudo apt-get install docker-ce docker-ce-cli [containerd.io](http://containerd.io)

2.1.6 测试安装是否成功

sudo docker run hello-world

2.2 脚本安装:

1
2
3
curl -fsSL [https://get.docker.com](https://get.docker.com) | bash -s docker --mirror Aliyun

sudo sh [get-docker.sh](http://get-docker.sh)

1
2
3
curl -fsSL [https://get.docker.com](https://get.docker.com) -o [get-docker.sh](http://get-docker.sh)

sudo sh [get-docker.sh](http://get-docker.sh)

2.3 设置docker开机自动启动

1
systemctl enable docker  # 设置开机自动启动

2.4 修改 Docker 配置(可选)

以下配置会增加一段自定义内网 IPv6 地址,开启容器的 IPv6 功能,以及限制日志文件大小,防止 Docker 日志塞满硬盘

1
2
3
4
5
6
7
8
9
10
11
12
13
cat > /etc/docker/daemon.json <<EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "3"
},
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef:c0::/80",
"experimental":true,
"ip6tables":true
}
EOF

3. 安装docker-compose(直接用github的,避免出问题)

依次执行以下命令

a.

1
curl -L "[https://github.com/docker/compose/releases/download/1.29.2/docker-compose-](https://github.com/docker/compose/releases/download/1.29.2/docker-compose-)$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

b.

1
chmod +x /usr/local/bin/docker-compose

c.

1
docker-compose --version

4. 安装Nginx Proxy Manager

4.1 Nginx配置

ssh连接到华为云服务器

1
2
3
4
5
6
7
sudo -i

mkdir -p /root/data/docker_data/npm

cd /root/data/docker_data/npm

vim docker-compose.yml(里面内容要对齐)

英文输入法下,按 i 输入如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 冒号左边可以改成自己服务器未被占用的端口
- '81:81' # 冒号左边可以改成自己服务器未被占用的端口
- '443:443' # 冒号左边可以改成自己服务器未被占用的端口
volumes:
- ./data:/data # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 data 文件夹中
- ./letsencrypt:/etc/letsencrypt # 冒号左边可以改路径,现在是表示把数据存放在在当前文件夹下的 letsencrypt 文件夹中

按一下 esc,然后:wq 保存退出

4.2 打开华为云服务器防火墙的端口 81

进入云服务器→安全组→配置规则

upload successful
upload successful

跳转新页面后点击入方向规则→添加规则→优先级1,端口81
upload successful

回到云服务器控制台:lsof -i:81 #查看 81 端口是否被占用,如果被占用,重新自定义一个端口

如果啥也没出现,表示端口未被占用,我们可以继续下面的操作了~

注:由于后续会用到很多端口,一一打开有点麻烦,可以全部开启端口

4.3 运行并访问 Nginx Proxy Manager

1
2
3
cd /root/data/docker_data/npm   # 来到 dockercompose 文件所在的文件夹下  

docker-compose up -d

理论上我们就可以输入 http://ip:81 访问了

默认登陆名和密码:

1
2
Email:admin@example.com
Password: changeme

注意:

1、不知道服务器 IP,可以直接在命令行输入:curl ip.sb,会显示当前服务器的 IP。

2、遇到访问不了的情况,请再次检查在宝塔面板的防火墙和华为云的后台防火墙是否打开对应了端口。

4.4 更新 Nginx Proxy Manager:(扩展)

1
2
3
4
5
6
7
8
9
10
11
cd /root/data/docker_data/npm  

docker-compose down

cp -r /root/data/docker_data/npm /root/data/docker_data/npm.archive # 万事先备份,以防万一

docker-compose pull

docker-compose up -d # 请不要使用 docker-compose stop 来停止容器,因为这么做需要额外的时间等待容器停止;docker-compose up -d 直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

4.5 卸载 Nginx Proxy Manager

1
2
3
4
5
cd /root/data/docker_data/npm  

docker-compose down

rm -rf /root/data/docker_data/npm # 完全删除映射到本地的数据

可以卸载得很干净。

5. 在华为云服务器端安装frps

5.1 安装frps

创建一下安装的目录:

1
2
3
4
5
sudo -i

mkdir -p /root/data/docker_data/frps

cd /root/data/docker_data/frps

简单起见,直接用docker命令安装

Docker方法安装:

1
2
3
4
5
cd /root/data/docker_data/frps

touch frps.ini

vim docker-compose.yml
1
2
3
4
5
6
7
8
9
version: '3.3'
services:
frps:
restart: always
network_mode: host
volumes:
- './frps.ini:/etc/frp/frps.ini'
container_name: frps
image: snowdreamtech/frps

docker-compose up -d

这样我们就搭建好了frp的服务端了,不过,现在我们frps.ini里面啥也没有,需要我们来配置一下,这边贴一个配置文件给大家参考,满足基本使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[common]

#frp 监听端口,与客户端绑定端口

bind_port= 5443
kcp_bind_port = 5443

#dashboard用户名

dashboard_user= xxxx

#dashboard密码

dashboard_pwd= xxxx

#dashboard端口,启动成功后可通过浏览器访问如http://ip:9527

dashboard_port= 9527

#设置客户端token,对应客户端有页需要配置一定要记住,如果客户端不填写你连不上服务端

token = 8ad3d1x429a2d

重启容器

docker-compose restart

云服务器添加9527与5443端口

http://ip:9527 可以访问frp网址,账号:xxxx 密码:xxxx

接下来要去云服务器,打开防火墙。

5.2 docker-compose更新(扩展)

1
2
3
4
5
6
7
8
9
10
11
cd /root/data/docker_data/frps

docker-compose down

cp -r /root/data/docker_data/frps /root/data/docker_data/frps.archive # 其实就是备份一下frps.ini这个文件

docker-compose pull

docker-compose up -d

docker image prune # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

5.3 卸载

1
2
3
4
5
docker stop frps

docker rm -f frps # 停止容器,此时不会删除映射到本地的数据

rm -rf /root/data/docker_data/frps # 完全删除映射到本地的数据

可以卸载得很干净。

6. 在NAS端安装frpc(这里用docker-compose安装失败,选择安装包下载)

6.1 配置frpc

ssh登录NAS,进入root模式

1
2
3
sudo -i

mkdir /root/data/docker_data/frpc

a.下载frp安装包(官网下载)

frp官网:https://github.com/fatedier/frp/releases

b.命令下载frp安装包

wget http://www.kaixinit.com/wp-content/uploads/2019/04/frp_0.36.2_linux_amd64.tar.gz

配置frpc.ini

vim 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# frpc.ini
[common]
server_addr = 114.115.162.44
server_port = 5443
token = 8ad3d1x429a2d

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 222
# 这个自定义,之后再ssh连接的时候要用
remote_port = 6000

[qb]
type = tcp
local_ip = 127.0.0.1
local_port = 8092
remote_port = 6001

[jellyfin]
type = tcp
local_ip = 127.0.0.1
local_port = 32771
remote_port = 6002

[NAS]
type = tcp
local_ip = 127.0.0.1
local_port = 5000
remote_port = 6003

[nextcloud]
type = tcp
local_ip = 127.0.0.1
local_port = 4433
remote_port = 6004

[RDP]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001

[vnc]
type = tcp
local_ip = 127.0.0.1
local_port = 5900
remote_port = 5900
use_encryption = true
use_compression = true

这时已经可以通过外网访问NAS了,http://IP:6003

6.2 配置frpc在NAS开机时自启动(可选)

vi /usr/syno/etc.defaults/rc.sysv/frpc.sh

英文输入法下,按 i 输入如下内容

1
2
3
4
#/bin/bash
sudo su
cd /root/data/docker_data/frpc/frpc
nohup ./frpc -c ./frpc.ini &

按一下 esc,然后:wq 保存退出

增加脚本文件执行权限

chmod +x [frpc.sh]

查看进程

ps -aux|grep frpc|grep -v grep

接下来将脚本文件关联到开机自启动,在NAS中打开 控制面板–>任务计划–>新增–>触发的任务–>用户定义的脚本
upload successful

创建任务→常规→任务名称:frpc,勾选√已启动,如下图:
upload successful

创建任务→用户定义的脚本:

/usr/syno/etc.defaults/rc.sysv/frpc.sh

upload successful

配置完成后可重启群晖系统一次,判断脚本文件是否启动成功。

重启系统命令:

reboot

查看进程是否正常启动:

ps -aux|grep frpc|grep -v grep

7. 结尾

到这里内网穿透功能基本基本就实现啦,祝大家玩得开心。

参考资料

【好玩儿的Docker项目】家里没有公网IP?FRP+NPM+VPS = 随时随地用域名访问家里的任何设备!内网穿透,从未如此简单! | 我不是咕咕鸽