一、起因
家里部署了Nas,在出租屋里直接使用frp访问外网服务器转发的是可以用,但是,流量得多贵啊,还有中间商赚带宽。于是想了一下,在出租屋的路由上部署frp客户端,使用xtcp
协议,打洞直连,速度快还不需要流量。
二、流程
前提条件:
- 一台公网frps服务器
- 家里Nas,已经配置好 SMB文件共享(端口445)、WebDav(端口80,可选端口443),其他自行发挥。
- 出租屋解锁SSH的小米路由,我家是小米路由器 AX3000T 解锁 SSH
- 小米路由IP: 192.168.1.1
- WebDav域名: nas.zengwu.com.cn
三、配置
服务器和nas端的frp安装比简单,可以参考frp内网穿透搭建远程桌面,这里点重讲一下小米路由上的安装和配置。
1. 服务器frps配置
服务器frps只要一个基本的端口配置就可以了,其他的根据个人情况而定
# 服务器端口
bindPort = 5000
# 权限认证
auth.method = "token"
auth.token = "123456"
# 其他配置
2. 家里Nas frpc配置
这里配置445、80二个端口的xtcp和stcp,使用frp的Fallback机制,保证xtcp打洞失败的时候使用stcp链接。优势是打洞失败时可以走stcp连接,劣势是不知道什么时候失败走的stcp,这里会消耗服务器流量。如果怕消耗流量,可以只配置xtcp。
# 服务器域名端口
serverAddr = "公网服务器ip或域名"
serverPort = 5000
# 权限认证
auth.method = "token"
auth.token = "123456"
# smb stcp 协议配置,默认端口445
[[proxies]]
name = "STCP-SMB"
type = "stcp"
secretKey = "123456"
localIP = "127.0.0.1"
localPort = 445
transport.useEncryption = true
transport.useCompression = true
# smb xtcp 协议配置,默认端口445
[[proxies]]
name = "XTCP-SMB"
type = "xtcp"
secretKey = "123456"
localIP = "127.0.0.1"
localPort = 445
transport.useEncryption = true
transport.useCompression = true
# web stcp 协议配置,默认端口80
[[proxies]]
name = "STCP-Web"
type = "stcp"
secretKey = "123456"
localIP = "127.0.0.1"
localPort = 80
transport.useEncryption = true
transport.useCompression = true
# web xtcp 协议配置,默认端口8
[[proxies]]
name = "XTCP-Web"
type = "xtcp"
secretKey = "123456"
localIP = "127.0.0.1"
localPort = 80
transport.useEncryption = true
transport.useCompression = true
3. 小米路由frp安装配置
3.1 下载frp
用ssh登录到小米路由中,使用df -h
查看磁盘情况,我这里只有/tmp
目录空间宽裕点,就安装到tmp目录吧。
root@XiaoQiang:/tmp# df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 18.3M 18.3M 0 100% /
tmpfs 119.5M 13.9M 105.5M 12% /tmp
ubi1:cfg 24.3M 1.8M 21.2M 8% /data
ubi1:cfg 24.3M 1.8M 21.2M 8% /userdisk
/dev/root 18.3M 18.3M 0 100% /userdisk/data
ubi1:cfg 24.3M 1.8M 21.2M 8% /etc/config
ubi1:cfg 24.3M 1.8M 21.2M 8% /etc/datacenterconfig
ubi1:cfg 24.3M 1.8M 21.2M 8% /etc/smartcontroller
ubi1:cfg 24.3M 1.8M 21.2M 8% /etc/parentalctl
ubi1:cfg 24.3M 1.8M 21.2M 8% /etc/smartvpn
ubi1:cfg 24.3M 1.8M 21.2M 8% /etc/ppp
ubi1:cfg 24.3M 1.8M 21.2M 8% /etc/crontabs
ubi1:cfg 24.3M 1.8M 21.2M 8% /etc/mipctl
tmpfs 512.0K 0 512.0K 0% /dev
小米路由是定制版的OpenWRT,用cat /proc/cpuinfo
查看一下指令集
root@XiaoQiang:/tmp# cat /proc/cpuinfo
processor : 0
model name : ARMv8 Processor rev 4 (v8l)
BogoMIPS : 26.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
processor : 1
model name : ARMv8 Processor rev 4 (v8l)
BogoMIPS : 26.00
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid
CPU implementer : 0x41
CPU architecture: 8
CPU variant : 0x0
CPU part : 0xd03
CPU revision : 4
这里是ARMv8的,支持arm64,去frp releases 下载linux_amd64.tar.gz版本就可以了,如果是ARMv7或更早版本可以下载linux_amd.tar.gz版本。
下载,解压到 /tmp/frp
目录,只保留frpc
、frpc.toml
二个文件,其他可以删了。
3.2 配置frp
这里配置配置445、80二个端口的xtcp和stcp。因为80端口被nginx占用了,我们可以本地监听5080端口,然后再修改 nginx配置,将webdav域名转到5080端口上。
# 服务器域名端口
serverAddr = "公网服务器ip或域名"
serverPort = 5000
# 权限认证
auth.method = "token"
auth.token = "123456"
# SMB ################################################
# stcp 协议配置
[[visitors]]
name = "STCP-SMB-visitor"
type = "stcp"
# 被连接客户端配置的stcp name
serverName = "STCP-SMB"
secretKey = "123456"
# stcp-visitor 的 bindPort 设置为 -1 表示不需要监听物理端口,只接受 fallback 的连接即可。
bindPort = -1
# 加密压缩传输内容
transport.useEncryption = true
transport.useCompression = true
# xtcp 协议配置
[[visitors]]
name = "XTCP-SMB-visitor"
type = "xtcp"
# 被连接客户端配置的 xtcp name
serverName = "XTCP-SMB"
secretKey = "123456"
bindAddr = "0.0.0.0"
bindPort = 445
# 加密压缩传输内容
transport.useEncryption = true
transport.useCompression = true
# 如果仅配置xtcp,后面配置可以删keepTunnelOpen 和 fallback配置可以删了
# 配置了 keepTunnelOpen = true 时,frpc 会定期检测隧道是否打开
# 如果没有,则会尝试打洞建立隧道,这样可以始终保持隧道打开,在需要连接对端服务时,可以避免延迟。
keepTunnelOpen = true
# 如果 xtcp 打洞失败,则使用 stcp 进行链接,fallbackTo = 上面的 stcp name
fallbackTo = "STCP-SMB-visitor"
# 打洞超过时间,200ms还未成功的话,会回退到使用 stcp_desktop_visitor 建立连接。
fallbackTimeoutMs = 1000
# Web ################################################
# stcp 协议配置
[[visitors]]
name = "STCP-Web-visitor"
type = "stcp"
serverName = "STCP-Web"
secretKey = "123456"
bindPort = -1
transport.useEncryption = true
transport.useCompression = true
# xtcp 协议配置
[[visitors]]
name = "XTCP-Web-visitor"
type = "xtcp"
serverName = "XTCP-Web"
secretKey = "123456"
bindAddr = "0.0.0.0"
bindPort = 5080 ## 避免和nginx端口冲突
transport.useEncryption = true
transport.useCompression = true
keepTunnelOpen = true
fallbackTo = "STCP-Web-visitor"
fallbackTimeoutMs = 1000
3.3 启动frp
可以先用/tmp/frp/frpc -c /tmp/frp/frpc.toml
来启动测试。然后,可以在电脑运行栏中输入\\192.168.1.1
访问smb文件共享
测试没问题后,可以启动到后台。
#本想用nohup的,结果没有这个命令,而且opkg安装也找不到,就先不折腾了,直接使用括号创建子shell
( /tmp/frp/frpc -c /tmp/frp/frpc.toml & ) > /dev/null 2>&1
用vim编辑器打开/etc/rc.local
文件,将上面命令添加进去,使之开机启动。
root@XiaoQiang:/tmp/frp# cat /etc/rc.local
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.
( /tmp/frp/frpc -c /tmp/frp/frpc.toml & ) > /dev/null 2>&1
exit 0
3.4 配置 nginx转发 webdav
在/etc/nginx/conf.d
目录新建 nas.conf
文件
server {
listen 80;
server_name nas.zengwu.com.cn;
charset UTF-8;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_redirect off;
proxy_pass http://localhost:5080/;
}
}
## 如果需要https连接,切有证书,将证书文件放到 /etc/nginx/目录下
server {
listen 443 ssl;
server_name nas.zengwu.com.cn;
ssl_certificate nas.crt;
ssl_certificate_key nas.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5:!SHA;
ssl_prefer_server_ciphers on;
#
keepalive_timeout 0;
#set the send_timeout as 60 minutes
send_timeout 60m;
#
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
proxy_redirect off;
proxy_pass http://localhost:5080/;
}
}
# 测试配置文件是否有问题
/usr/sbin/nginx -c
# 重新加载配置文件
/usr/sbin/nginx -s reload
最后,打开app,添加自义定hosts,将nas域名解析到路由上
没有绑定app可以 vim /etc/custom_hosts
添加后再重启路由
192.168.1.1 nas.zengwu.com.cn
到此,所有配置完成,连接路由的设备,可以通过 \\192.168.1.1
访问smb共享、通过 http//域名
访问webdav
评论区