搭建 frp 内网穿透以访问内网 NAS(或其他内网服务)

   Updated: 2020-07-02 16:39       搭建 frp 内网穿透以访问内网 NAS(或其他内网服务)有7条评论

对于家庭宽带,如果宽带服务商有提供公网 ip,那直接使用 DDNS 然后路由器设置好端口映射即可访问内网计算机。由于现在宽带服务商一般不提供公网 ip 地址了,就需要使用 frp、Ngrok 等内网穿透技术来达到访问内网计算机的目的。

frp、Ngrok 等需要服务器中转流量,不是点对点的连接,所以速度取决于 frps 服务器网络的带宽。点对点的可以使用 ZeroTier

frp 和 Zerotier 优缺点比较:

  • frp:需要有一个具有公网的服务器做中转,速度不太理想,需要针对每个应用做端口转发。稳定,适应性强
  • Zerotier:点对点连接,不需要服务器中转,速度相对理想,相当于在一个局域网内,不需要针对每个应用做端口转发。不稳定,适应性差,比如 4G 网络下很大可能不能穿透

我的环境

  • 处于内网中的黑群晖 DS3615xs(安装 frp 客户端)
  • 安装 CentOS 6 x64 系统的拥有外网 ip 地址的 Vultr vps(安装 frp 服务端)

frp 版本选择

SSH 进服务器,运行以下命令查看操作系统和 CPU 版本以选择对应的 frp 版本(一般是选择 linux_amd64 版本)

uname -a #或 arch

frp 服务端的搭建

这里以 frp 官方原始程序为例。也可以使用 frps 服务端一键配置脚本,更简单和方便,并且搭好以后开机自动启动 frps,不需要自行设置开机启动,适合小白。

下载 frp 程序

先 SSH 进入服务器

#切换为以系统管理者的身份执行指令
sudo -i
# 下载最新版 frp
wget --no-check-certificate https://github.com/fatedier/frp/releases/download/v0.26.0/frp_0.26.0_linux_amd64.tar.gz
# 解压
tar -xzvf frp_0.26.0_linux_amd64.tar.gz
# 文件夹名改成 frps,不然目录太长了不方便
mv frp_0.26.0_linux_amd64 frps
# 进入 frps 目录
cd frps
# 确保 frps 程序具有可执行权限
chmod +x frps

然后试着运行一下 frps help

./frps --help

正常情况下会输出一串帮助信息,那么就说明你下载了正确架构的版本。如果提示-bash: ./frps: cannot execute binary file: Exec format error 就说明你下错版本了

配置服务端

用 vi 打开配置文件(vi 的具体使用方法 google 搜索)

vi frps.ini

配置文件内容解释

# 配置开始
[common]

# frp 服务端端口(必须,客户端和它连接的端口)
bind_port = 27000

# frp 服务端密码(必须,客户端和它认证)
token = 12345678

# 认证超时时间,由于时间戳会被用于加密认证,防止报文劫持后被他人利用
# 因此服务端与客户端所在机器的时间差不能超过这个时间(秒)
# 默认为 900 秒,即 15 分钟,如果设置成 0 就不会对报文时间戳进行超时验证
authentication_timeout = 900

# 仪表盘端口,只有设置了才能使用仪表盘
dashboard_port = 27500

# 仪表盘访问的用户名密码,如果不设置,则默认 admin
dashboard_user = admin
dashboard_pwd = admin

# 如果你想要用 frp 穿透访问内网中的网站(例如路由器设置页面)
# 则必须要设置以下两个监听端口,不设置则不会开启这项功能
vhost_http_port = 20080
vhost_https_port = 20443

# 此设置需要配合客户端设置,仅在穿透到内网中的 http 或 https 时有用(可选)
# 假设此项设置为 example.com,客户端配置 http 时将 subdomain 设置为 test,
# 则你将 test.example.com 解析到服务端后,可以使用此域名来访问客户端对应的 http
subdomain_host = example.com

启动 frps

./frps -c frps.ini

提示 Start frps success,这表示服务端启动成功

frp 客户端的搭建

群晖中可以使用 Docker 版的 frpc,更方便,推荐 leonismoe/frpc

写好相应的 frpc.ini 配置文件后,放置于群晖中。卷中 「添加文件」,「文件」 选 frpc.ini 文件,「装载路径」/etc/frpc.ini,其他默认即可

下面是普通方式搭建 frpc 客户端的方法

下载 frp 程序

#切换为以系统管理者的身份执行指令
sudo -i
# 下载最新版 frp
wget --no-check-certificate https://github.com/fatedier/frp/releases/download/v0.26.0/frp_0.26.0_linux_amd64.tar.gz
# 解压
tar -xzvf frp_0.26.0_linux_amd64.tar.gz
# 文件夹名改成 frpc,不然目录太长了不方便
mv frp_0.26.0_linux_amd64 frpc
# 进入 frpc 目录
cd frpc
# 确保 frpc 程序具有可执行权限
chmod +x frpc

然后试着运行一下 frpc help

./frpc --help

正常情况下会输出一串帮助信息,那么就说明你下载了正确架构的版本。如果提示-bash: ./frpc: cannot execute binary file: Exec format error 就说明你下错版本了

配置客户端

用 vi 打开配置文件(vi 的具体使用方法 google 搜索)

vi frpc.ini

配置文件内容解释

# 配置开始
[common]

# frp 服务端地址,可以填 ip 或者域名
server_addr = x.x.x.x
# frp 服务端端口,与服务端配置中的 bind_port 一致
server_port = 27000
# frp 服务端密码,与服务端的 token 一致
token = 12345678
# 在 frpc 中启用 admin 端口,用于提供 API 服务(比如重启客户端)
admin_addr = 127.0.0.1
admin_port = 7400

[NAS DSM]
# 协议类型
type = tcp
# 服务所在的内网机器(这里是本机所以写 127.0.0.1,如果是其他机器比如路由器管理,则填写路由器的内网地址)
local_ip = 127.0.0.1
# 内网服务使用的端口
local_port = 5001
# 远程访问时使用的端口(这里设置远程端口是因为实际环境需要用到端口转发,比如宽带服务商封锁了 80 端口,而内网服务必须是 80 端口)
remote_port = 20088
# 自定义域名
custom_domains = xxx.com

启动 frpc

./frpc -c frpc.ini

提示 Start frpc success,这表示客户端启动成功

重启 frpc 的命令

./frpc reload -c ./frpc.ini # 此命令启用了 admin 端口才可用

浏览器输入 https://xxx.com:20088 应该就可以进入 NAS 的 DSM 界面了

设置 frp 开机启动

服务端(Linux)

如果使用 frps 服务端一键配置脚本,安装后会自动设置开机启动,不需要再做以下设置。

SSH 进入根目录

cd /

打开/etc/rc.local 文件

vi /etc/rc.local

添加一行命令

/root/frps/frps -c /root/frps/frps.ini # 路径根据实际修改

客户端(群晖)

如果使用 Docker 方式运行 frp 客户端,勾选 「启用自动重新启动」 即可,不需要做以下设置

NAS 里我们修改启动文件来设置开机自动启动 ftpc(网上也有说用 「任务计划」 来开机启动,但我没有设置成功)

SSH 进去,新建脚本文件

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

编辑脚本文件内容如下

#/bin/bash
nohup /root/frpc/frpc -c /root/frpc/frpc.ini &

设置文件权限

chmod +x /usr/syno/etc.defaults/rc.sysv/frpcautostartup.sh

编辑群晖的启动文件,将脚本文件路径写入启动文件中

vi /etc/rc

在文件的倒数第二行(exit 0 前面)添加脚本文件路径/usr/syno/etc.defaults/rc.sysv/frpcautostartup.sh

保存后重启系统

其他

关于 Vultr 里的端口注意

Vultr 里有坑(主要还是个人对防火墙规则不熟悉):我刚开始使用 8081 等四位数的端口,客户端始终无法和服务端通信,提示 no route to host,vps 控制面板里设置了防火墙规则还是一样

iptables -L -n

查看防火墙规则,发现仅开放了几个常用端口以及 20000-30000 的端口,把相应 remote_port 改为 20000-30000 之间的就好了

frp 命令

官方的 frp 程序服务端没有停止和重启命令,客户端没有停止命令,均没有卸载和更新命令。

使用 frps 服务端一键配置脚本安装的服务端的命令

  • 卸载:./install-frps.sh uninstall
  • 更新:./install-frps.sh update
  • 服务管理:/etc/init.d/frps {start|stop|restart|status|config|version}

故障及解决

外部无法访问,或者出现 「SSL 通信出现问题」 的提示。同时查看 Docker 中 frpc 容器日志,有出现连接拒绝的提示信息

解决方法:frpc.ini 文件中的 local_ip 值由 127.0.0.1 改成实际的内网 ip 后解决(这个比较奇怪,我以前用 127.0.0.1 是可以的)

参考链接

7 comments on “搭建 frp 内网穿透以访问内网 NAS(或其他内网服务)

  1. Pingback: 群晖搭建免费第三方 Bitwarden 密码服务器

  2. Pingback: 使用群晖搭建第三方 Bitwarden 密码服务器

  3. Pingback: 使用群晖搭建第三方 Bitwarden 密码服务器 – 冬青日志

  4. 00

    你好,这个 vps 需要长期付费才行吗,假如我为了弄 bitwarden 先暂时买一个月的,弄完了不续费可以吗?

    Reply
    1. 王小喜 Post author

      这个。。。你把 VPS 当成一个服务器,上面可以建很多服务,比如你的个人网站,比如 Bitwarden 服务。只是临时用用,那可以只买一个月

      Reply
  5. 网络小白

    群主,我目前设置的是通过 nas.xxx.com:20088 可以访问到群晖,但证书提示不安全,有办法弄个证书吗

    Reply
    1. 王小喜 Post author

      证书好办,申请一个导入群晖中就可以了。看这篇文章:https://blog.ppgg.in/4001.html

      1、阿里云,一年有效期
      2、Let's Encrypt,这个也可以,90 天有效期

      我用的阿里云

      Reply

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注