frp穿透技术
frp穿透技术
- 技术说明:群晖电脑位于学校内部,无公网ip,也没有IPv6的情况下,要与外网连接; 综合考虑下,采用frp技术,借助腾讯云服务器转发群晖网络到公网上。腾讯云服务器上已经部署了多个网站,80端口占用,因此使用8080端口转发。最终效果相当于每次nas.liufeisheng.cn时,先访问腾讯云服务器的8080端口,然后转发至群晖80端口,群晖80端口再转发到5000端口进入nas登录界面。
- 要实现的目的,可以部署个人网页、收集文件、远程看相册、远程看视频等
- 最终经过多种技术对比,采用FRP内容穿透的方式来进行
- 要求:有一台云服务器,有域名
- 通过nas设备-frpc-frps-云服务器-域名的途径进行内容转发
- 需要消耗云服务器流量,流量小,仅适用于小型文件收集,视频播放之类需要采取其他技术
- 其他技术
- DDNS-GO,这个是动态解析并转发域名,因为学校没有公网IP,且没有IPv6,发现仅是在内网生效
- 花生壳,要收费;
- easytier,tailscale等仅是组建自己的局域网,如果想自己的设备连接nas看视频,可以考虑
- 具体的技术流程:
- 首先群晖上安装frpc,注意版本号,然后在云服务器上安装同样版本号的frps
- 服务器上个人软件安装到/usr/local目录下
- 设置frps,然后打开云服务器的安全組或防火墙
- 在/usr/local/frps.toml设置如下
bindAddr = "0.0.0.0"
bindPort = 7000
#kcpBindPort = 7000
quicBindPort = 7000
vhostHTTPPort = 8080
vhostHTTPSPort = 8443
transport.maxPoolCount = 2000
transport.tcpMux = true
transport.tcpMuxKeepaliveInterval = 60
transport.tcpKeepalive = 7201
transport.tls.force = true
transport.tls.certFile = "/etc/letsencrypt/live/nas.liufeisheng.cn/fullchain.pem"
transport.tls.keyFile = "/etc/letsencrypt/live/nas.liufeisheng.cn/privkey.pem"
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "***"
webServer.pprofEnable = false
log.to = "./frps.log"
log.level = "info"
log.maxDays = 3
log.disablePrintColor = false
auth.method = "token"
auth.token = "***"
allowPorts = [
{ start = 1000, end = 50000 }
]
maxPortsPerClient = 8
udpPacketSize = 1500
natholeAnalysisDataReserveHours = 168
- 注意,这一步当时没注意打开安全组,frps设置好后一直没反应
- 然后打开对应服务器的公网ip:7500,能显示frps的dashboard面板
- 为了方便,在群晖系统上,直接将frpc安装到底层Linux系统上, 找到与frps一样的版本号,下载安装
- wget下载到/tmp目录下,然后设置好frpc的全局执行, 然后通过root账号转移到/usr/local/frp下
- frpc.toml配置下
serverAddr = "47.113.x.x"
serverPort = 7000
auth.method = "token"
auth.token = "***"
[[proxies]]
name = "dsm"
type = "http"
localIp = "127.0.0.1"
localPort = 5000
customDomains = ["nas.liufeisheng.cn"]
[[proxies]]
name = "dsm_https"
type = "https"
localIp = "127.0.0.1"
localPort = 5001
customDomains = ["nas.liufeisheng.cn"]
- 注意上面的auth.token要一致
经过以上过程,则成功地将内网和外网进行了穿透
frp端口域名映射
- 需求:假设现在本地群晖设备有个端口号5050,显示的是一个网站。需要绑定一个域名test.liufeisheng.cn,以便外网能够看到
- 流程:localhost:5050 ,通过frpc客户端的本地端口80到达frps服务器8080,再达到服务器80端口,通过服务器的外网ip成功访问
- 技术点:
- 群晖客户端frpc.toml配置好端口与域名,转5050端口绑定到域名
[[proxies]]
name = "test"
type = "http"
localIp = "127.0.0.1"
localPort = 5050
customDomains = ["test.liufeisheng.cn"]
- 配置好后,客户端systemctl restart frpc重启frp
- 云服务器nginx配置文件新增内容如下,告知服务器 test.liufeisheng.cn这个域名是转向8080端口
server {
listen 80;
server_name test.liufeisheng.cn;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
- dns解析test.liufeisheng.cn后,知道访问的是云服务器的80端口,然后转到8080端口; 而8080端口被frp转发到群晖客户端的80端口
3.群晖客户端响应,将test.liufeisheng.cn与本地5050绑定,并指定是访问本地目录的网站
server {
listen 5050;
server_name test.liufeisheng.cn; # 或你的域名
# 网站根目录
root /var/services/homes/fei/www;
index index.html index.htm;
# 日志配置(可选)
access_log /var/log/nginx/site1_access.log;
error_log /var/log/nginx/site1_error.log;
# 处理静态文件请求
location / {
try_files $uri $uri/ =404;
}
}
- 用Tailscale做VPN,让用户登录VPN访问内部网站,很方便也不花钱。