群辉 NAS 使用 frp 实现内网穿透

前言

之前懒着折腾直接买了白群辉,发现群辉的 quickConnect 实在是不给力.群辉放在单位, 在家里电视上串流看电影的需求都满足不了,1M 的小水管也只能看看文档了.
然后去看了花生壳和花生棒,发现更是个天坑.免费版一个月 1g 流量+1M 带宽,付费版不限流量但是带宽比 qc 宽不了多少,可以说是性价比极低.(见下图)WX20190912-155910@2x
今天同时安利了 frp,试了下发现配置简单 ,同时内网穿透的效果也比较好,播放视频的速度也很满意,于是写下这边技术总结.

关于 frp

frp是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。

architecture
简单来说,frp 借助有公网 ip 的 vps 实现了内网穿透的功能.

流程

架构图:

未命名

工具

  • 有公网 ip 的 vps,最好是国内的主机.
  • 域名,并且做了域名解析.
  • ssh 客户端.
  • 群辉 DS218+

配置

在这里要说一句,客户端与服务端的软件版本必须保证相同,否则会报错.

服务端配置

1.登录服务器,下载服务器对应的软件版本.

[root@instance-ssr ~]# uname -a
Linux instance-ssr 5.1.15-1.el7.elrepo.x86_64 #1 SMP Tue Jun 25 10:52:45 EDT 2019 x86_64 x86_64 x86_64 GNU/Linux

我的主机是 centos7,所以下载了 amd64 版本.

解压文件

tar -zxvf frp_0.29.0_linux_amd64.tar.gz

删除不必要的客户端文件

//frpc 是客户端(client)文件,frps 为服务端(frps)文件.

cd frp_0.12.0_linux_amd64

rm -f frpc frpc_full.ini 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
25
26
27
28
29
    // common 为必填项
[common]
// Frp 服务端口(可自定义)
bind_port = 7000
//http 访问端口(可自定义)
vhost_http_port = 8080
//dashboard 界面端口
dashboard_port = 7500
// 登录 dashboard 用户名
dashboard_user = 用户名
// 登录 dashboard 密码
dashboard_pwd = 密码
// 最大连接池数量
max_pool_count = 5
// 超时验证时间
authentication_timeout = 900
// 自定义二级域名
subdomain_host =

[ssh]
//ssh 访问端口
listen_port = 6000
// 用户身份认证
auth_token = 和客服端 token 对应

//人人影视docker 配置
[renren]

listen_port =3001

运行

保存上面的文件,接着:

./frps -c ./frps.ini

来运行服务端程序.

客户端配置

这里的客户端主要是指群辉.

ssh 登录群晖

群辉必须开启 ssh
WX20190912-163142@2x

ssh admin@local_nas_ip

群晖下载 frp 客户端

1
2
3
4
5
sudo -i // 切换 root 用户
wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_linux_amd64.tar.gz
tar -zxvf frp_0.29.0_linux_amd64.tar.gz
cd frp_0.12.0_linux_amd64
rm -f frps frps_full.ini frps.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
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
51
52
53
54
55
56
57
58
59
60
61


[common]

// 服务器端公网ip
server_addr = ip

//frp 服务端口,和服务器端 bind_port 一致
server_port = 7000

// 和前面服务器端 [ssh] auth_token 一致
auth_token = 和服务器端对应

// 连接池数量
pool_count = 1


[ssh]

// type 服务类型(tcp、http、https、udp)
type = tcp

// NAS 本地局域网内网 ip
local_ip = NAS 局域网ip

// NAS 开启 ssh 服务端口号,默认 22
local_port = 22

// 服务器端 ssh 端口,和服务器端 [ssh] listen_port 配置一致
remote_port = 6000


//配置访问 nas 的主要方式(通过网页)
[nas]

// 服务类型为 http
type = http

// NAS 默认端口 5000
local_port = 5000

//域名(我这里申请了一个免费域名,然后在 dnspod与我 vps 的公网 ip 绑定,细节可以参考我之前写的[这篇文章](https://h123.cf/2019/08/29/2019.08.29.cname/#more))

custom_domains = hhbnas.cf



// NAS web Station 服务,没用可以不用设置
[web]
type = http
local_port = 80
subdomain = web


//人人影视 docker 配置
[renren]

type = tcp
local_ip = 10.200.11.144
local_port = 3001
remote_port = 3001

运行

与服务端类似,保存上面编辑的文件,接着:

./ frpc -c ./frpc.ini

测试

// user是你登录 nas 的用户名.
ssh -p 6000 user@你的公网 ip

配置成功以后就可以使用 ssh 链接了.

网页登录:

WX20190912-164543@2x

two more things

后台运行

现在客户端和服务端的程序都在运行了,但是我们断开链接以后服务就会中断,因此我们需要把服务转为后台运行.

服务端

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

客户端

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

同时我们可以使用群辉的定时任务功能,让 frp 在群辉重启以后自启动,方法如下:

1
2
3
4
5
6
7
8
9
10
//新建脚本
vi /usr/syno/etc.defaults/rc.sysv/frp.sh

// 编辑脚本
#/bin/bash
cd /root/frp_0.29.0_linux_amd64
nohup ./frpc -c ./frpc.ini &

// 设置文件权限
chmod +x frp.sh

群辉中新建计划任务.
控制面板>任务计划>触发的任务>用户定义的脚本

WX20190912-165240@2x

WX20190912-165429@2x

隐藏 8080 端口

在服务器的 nginx 配置文件(/ect/nginx/nginx.conf)中修改:

1
2
3
4
5
6
7
8
9
10
11
12
   server {
listen 80;
server_name localhost;
server_name_in_redirect off;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://127.0.0.1:8080/;
}
}

映射 80 到 8080 .

配置 ssh 别名

配置别名(alias)的过程比较简单,在~/.ssh/config这个文件(如果目录下没有这个文件,可以新建一个)接着按下面格式添加服务器信息:

# 服务器1
Host 别名
    HostName IP地址
    Port 22
    User 用户名
# 服务器2
Host 别名
    HostName IP地址
    Port 22
    User 用户名
...
# 更多服务器

例如, config 添加如下内容

Host ssr
HostName 35.234.36.117
Port 22
User root

可以通过 ssh ssr来直接进行登录.

done.

thank u !