Home Nas通过Frp暴露到外网
Post
Cancel

Nas通过Frp暴露到外网

本文主要通过frp(一种内网穿透的工具)将nas中的samba端口暴露到外网上,方便在外面也能访问到家里nas的数据。

项目启动缘由

说来也巧,我airpods pro耳机到的那天,正好是我QQ音乐会员到期的那天。所以,我在试耳机的时候,发现QQ音乐总会无端的自动切歌,我一度怀疑是我耳机的问题,马上都准备要退货了,百度一下才发现居然是QQ音乐普通用0户听会员歌曲只能听1分钟,到时间QQ音乐就自动切歌。
这一下,我属实被恶心到了。
当然我是对他们维护音乐版权不排斥的,但是,我觉得直接不让我们听都比现在的方式要合理,这样纯粹有点恶心人了。

有点扯远了,总而言之,恰巧我有一些音频的获取方式,也在家里的nas中下载了一些音频,当时我就想为何我不直接通过把家里nas的内容共享到外网上,即免费又有高音质。

项目选型

现在公网IP越来越难获取,何况我还是蹭的室友的网,更不可能获取到公网IP了,索性只能通过内网穿透的方式把家里的nas服务暴露出去了。

准备工作

要达到这一目标,我们首先需要你有一些基础的准备。

  • 一个开启了samba的nas
  • 一台VPS(也可以没有)

开启samba以及在防火墙开放对应的端口

Snipaste_2020-11-06_15-01-54.png
由于每个人的nas设备不一样,我就不介绍samba的开启方法了,主要需要注意两点,由于是暴露在公网上,所以最好把重要的内容用账号隔离开,以及不要给写权限

接着开启对应的端口,由于samba默认的端口445,所以我们开启一下这个端口的tcpudp
Snipaste_2020-11-06_15-04-51.png

使用frp进行端口暴露

使用自己的VPS进行流量转发

如果你有一台带宽不小的VPS,完全可以使用自己的VPS进行frp的转发,一来比较好修改,二来比较安全。

客户端frpc的配置

这里的客户端,也就是我们家的nas,需要对frp进行如下配置
Snipaste_2020-11-06_15-08-45.png

server_addr指定VPS的ip
server_port指定VPS用于和nas进行通信的端口(需要暴露出来)
local_ip指定nas的ip,本来可以指定127.0.0.1,但是不知道为什么我这如果配后者不生效
local_port指定nas开启samba服务的端口,也就是默认的445
remote_port指定远程连接的端口(需要暴露出来)

使用如下命令启动即可
Snipaste_2020-11-06_15-12-34.png

服务器端frps的配置

服务器端配置非常简单,就是指定用于通信的端口
Snipaste_2020-11-06_15-14-21.png

之后直接启动即可

使用免费的frp代理平台服务进行转发

这也是我才知道的一类平台,由于我的服务器只有1M的垃圾带宽,所以听一些无损音乐都卡的不行,因此才发现了这类的平台: natfrp

免费用户是10M的带宽,当然我测出来是只有3M左右,但是听音乐,甚至看1080P的电影电视剧都是毫无压力的,所以在这里也分享一下这个平台的配置方法。

在左边的菜单栏里点击【创建隧道】,并进行如下配置
Snipaste_2020-11-06_15-18-15.png

对比上面可以发现,其实就是frpc配置文件的图形化配置,并没有什么额外的高级配置,之后点击【确认创建】就会生成一个新的隧道。

点击左侧的【隧道列表】,可以看见我们刚刚创建的隧道,对应到刚刚的vps配置,ip就是他们提供的url,端口是左侧箭头指向的位置。 Snipaste_2020-11-06_15-20-32.png

点击【配置文件】,会弹出一个框,这个就是frpc的配置,也就是nas中frp的配置,这个网站已经帮我们生成好了,我们只需要复制到nas中开启frpc即可。
Snipaste_2020-11-06_15-22-32.png

外部连接

进行到这,samba服务已经暴露出去了,我们现在可以使用支持samba的客户端进行访问了,以mac为例,打开mac的Finder的【连接服务器】,输入对应的域名+端口
Snipaste_2020-11-06_15-24-56.png

连接即可。

可以访问了!! Snipaste_2020-11-06_15-40-31.png

额外服务

我们的音乐已经的暴露出来了,现在在任何场景都能访问了,但是有时候网络不好等等情况,我们的音频太大,例如我现在存储的都是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)会直接复制过去。
其他的文件类型直接忽略。

This post is licensed under CC BY 4.0 by the author.

Guava小笔记

netcat使用