本文主要通过frp(一种内网穿透的工具)将nas中的samba端口暴露到外网上,方便在外面也能访问到家里nas的数据。
项目启动缘由
说来也巧,我airpods pro耳机到的那天,正好是我QQ音乐会员到期的那天。所以,我在试耳机的时候,发现QQ音乐总会无端的自动切歌,我一度怀疑是我耳机的问题,马上都准备要退货了,百度一下才发现居然是QQ音乐普通用0户听会员歌曲只能听1分钟,到时间QQ音乐就自动切歌。
这一下,我属实被恶心到了。
当然我是对他们维护音乐版权不排斥的,但是,我觉得直接不让我们听都比现在的方式要合理,这样纯粹有点恶心人了。
有点扯远了,总而言之,恰巧我有一些音频的获取方式,也在家里的nas中下载了一些音频,当时我就想为何我不直接通过把家里nas的内容共享到外网上,即免费又有高音质。
项目选型
现在公网IP越来越难获取,何况我还是蹭的室友的网,更不可能获取到公网IP了,索性只能通过内网穿透的方式把家里的nas服务暴露出去了。
准备工作
要达到这一目标,我们首先需要你有一些基础的准备。
- 一个开启了samba的nas
- 一台VPS(也可以没有)
开启samba以及在防火墙开放对应的端口
由于每个人的nas设备不一样,我就不介绍samba的开启方法了,主要需要注意两点,由于是暴露在公网上,所以最好把重要的内容用账号隔离开,以及不要给写权限。
接着开启对应的端口,由于samba默认的端口445
,所以我们开启一下这个端口的tcp
和udp
使用frp进行端口暴露
使用自己的VPS进行流量转发
如果你有一台带宽不小的VPS,完全可以使用自己的VPS进行frp的转发,一来比较好修改,二来比较安全。
客户端frpc的配置
这里的客户端,也就是我们家的nas,需要对frp进行如下配置
server_addr
指定VPS的ip
server_port
指定VPS用于和nas进行通信的端口(需要暴露出来)
local_ip
指定nas的ip,本来可以指定127.0.0.1
,但是不知道为什么我这如果配后者不生效
local_port
指定nas开启samba服务的端口,也就是默认的445
remote_port
指定远程连接的端口(需要暴露出来)
使用如下命令启动即可
服务器端frps的配置
服务器端配置非常简单,就是指定用于通信的端口
之后直接启动即可
使用免费的frp代理平台服务进行转发
这也是我才知道的一类平台,由于我的服务器只有1M的垃圾带宽,所以听一些无损音乐都卡的不行,因此才发现了这类的平台: natfrp。
免费用户是10M的带宽,当然我测出来是只有3M左右,但是听音乐,甚至看1080P的电影电视剧都是毫无压力的,所以在这里也分享一下这个平台的配置方法。
在左边的菜单栏里点击【创建隧道】,并进行如下配置
对比上面可以发现,其实就是frpc配置文件的图形化配置,并没有什么额外的高级配置,之后点击【确认创建】就会生成一个新的隧道。
点击左侧的【隧道列表】,可以看见我们刚刚创建的隧道,对应到刚刚的vps配置,ip就是他们提供的url,端口是左侧箭头指向的位置。
点击【配置文件】,会弹出一个框,这个就是frpc的配置,也就是nas中frp的配置,这个网站已经帮我们生成好了,我们只需要复制到nas中开启frpc即可。
外部连接
进行到这,samba服务已经暴露出去了,我们现在可以使用支持samba的客户端进行访问了,以mac为例,打开mac的Finder的【连接服务器】,输入对应的域名+端口
连接即可。
可以访问了!!
额外服务
我们的音乐已经的暴露出来了,现在在任何场景都能访问了,但是有时候网络不好等等情况,我们的音频太大,例如我现在存储的都是flac,基本上30MB一首歌,所以我希望是把他们压缩以后单独存储一下。
转码脚本,这个需要nas上安装ffmpeg
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#!/bin/bash
###############################################################
## 自动同步转码程序 ##
## ##
## 对于高码率的文件(例如flac和wav格式的音频进行转码) ##
## 并在对应的转码文件夹下创建完全一样的文件夹结构 ##
## ##
###############################################################
ROOT_PATH="/Users/bjhl/gogo" # 音乐文件夹
ENCODE_PATH="/Users/bjhl/encode" # 转码后的文件夹,可以不存在
SUPPORT_TRANSCODE_EXT=(flac wav)
COPY_EXT=(jpeg jpg png)
checkSupportExt() {
local type="$1"
for supportType in ${SUPPORT_TRANSCODE_EXT[@]}; do
[ "${supportType}" = "${type}" ] && exit 0
done
exit 1
}
checkCopyExt() {
local type="$1"
for supportType in ${COPY_EXIT[@]}; do
[ "${supportType}" = "${type}" ] && exit 0
done
exit 1
}
encode() {
local sourceFile="$1"
local targetFolder="$2"
local fileName="$3"
local targetFile="${targetFolder}/${fileName}.aac"
echo "transcoding from [${sourceFile}] to [${targetFolder}]"
ffmpeg -n -v error -i "${sourceFile}" -ar 44100 -ac 2 -ab 320k "${targetFile}"
}
sync() {
# 当前文件夹路径
local folderPath="$1"
local targetPath="$2"
if [ ! -d "${targetPath}" ]; then
echo "mkdir: ${targetPath}"
mkdir "${targetPath}"
fi
OLD_IFS="$IFS"
IFS=$'\n'
for f in `ls "${folderPath}"`; do
# 当前文件
local file="${folderPath}/${f}"
[ -L "${file}" ] && continue # 如果是链接文件直接过滤,怕有死循环
[ -d "${file}" ] && sync "${file}" "${targetPath}/${f}"
if [ -f "${file}" ]; then
local ext="${file##*.}"
local fn="${f%.*}"
if `checkSupportExt "${ext}"`; then
encode "${file}" "${targetPath}" "${fn}"
elif `checkCopyExt "${ext}"`; then
echo "[copy file] ${file}"
cp "${file}" "${targetPath}/${f}"
else
echo "[ext not support] ${file}"
fi
fi
done
IFS=$OLD_IFS
}
folderPrepare() {
if [[ "${ENCODE_PATH}" =~ "${ROOT_PATH}" ]]; then
echo "不可以套娃哦!"
exit 0
fi
if [ ! -d "${ROOT_PATH}" ]; then
echo "您的原文件夹呢?"
exit 0
fi
if [ ! -d "${ENCODE_PATH}" ]; then
mkdir -p "${ENCODE_PATH}"
fi
}
main() {
folderPrepare "${ROOT_PATH}" "${ENCODE_PATH}"
sync "${ROOT_PATH}" "${ENCODE_PATH}"
}
main
需要自己配置的是前两个变量
ROOT_PATH
存储音频的原文件夹
ENCODE_PATH
转码后的音频的文件夹
这个脚本会保证文件夹
结构原封不动地复制过去。
如果遇到flac、wav
文件会转码成aac
文件并复制过去。
如果遇到图片格式jpg
等(可能是cover)会直接复制过去。
其他的文件类型直接忽略。