内网穿透工具FRP
Fast Reverse Proxy
核心优势
- 开源与活跃维护
 GitHub Star 87.3k,更新频繁(最近提交为5天前),社区支持强大,长期维护有保障。
- 多协议支持
 支持TCP、UDP、HTTP/HTTPS等协议,完美适配MySQL(TCP)、MinIO(HTTP/S3)、WebDAV(HTTP)的穿透需求。
- 配置灵活
 通过frpc.ini配置文件可自定义端口映射规则,支持批量端口管理和独立代理控制,适合多服务场景。
- Docker兼容性
 提供官方Docker镜像,可直接在NAS的Docker容器中部署客户端(frpc),与你的NAS环境无缝衔接。
- 安全性
 支持TLS加密传输,避免数据在公网暴露风险。
服务端frps部署
1.创建目录
mkdir -p /data/frp
cd /data/frp
vim frps.ini
2.编辑配置文件
[common]
bind_addr = 0.0.0.0
bind_port = 7000
dashboard_port = 7001
vhost_http_port = 10080
vhost_https_port = 10443
 
token = abcd12345
dashboard_user = admin11
dashboard_pwd = admin11
log.to = "/var/log/frp/frps.log"
log.level = "debug"
log.maxDays = 7
#需要穿透的内网服务1
[could]
type = tcp
local_ip = 192.168.31.100
local_port = 5000
remote_port = 5000
#需要穿透的内网服务2
[chat]
type = tcp
local_ip = 192.168.31.223
local_port = 3000
remote_port = 3000
配置文件详解
[common] # 通用配置部分,用于设置 frp 服务器的基本参数。
bind_addr = 绑定的 IP 地址,这里设置为 0.0.0.0,表示监听所有的网络接口。
bind_port = 服务绑定的端口号,这里设置为 7000。
dashboard_port = frp 仪表盘的端口号,这里设置为 7001。
vhost_http_port = 虚拟主机 HTTP 端口号,这里设置为 10080。
vhost_https_port = 虚拟主机 HTTPS 端口号,这里设置为 10443。
token = 访问 frp 服务器的令牌,这里设置为 abcd12345
dashboard_user = frp 仪表盘的用户名,这里设置为 admin11。
dashboard_pwd = frp 仪表盘的密码,这里设置为 admin11。
[could] 和 [chat] = 代理规则部分,用于定义具体的代理规则。
type = 代理类型,这里设置为 tcp,表示 TCP 代理。
local_ip = 本地 IP 地址,这里设置为 192.168.31.100和192.168.31.223。
local_port = 本地端口号,这里设置为 5000 和 3000。
remote_port = 远程端口号,这里设置为 5000 和 3000。
3.拉取镜像
docker pull ryaning/frps
4.启动容器
docker run --restart=always --network host -d -v /home/frp/frps.ini:/etc/frp/frps.ini -v /home/frp/logs:/var/log/frp --name frps ryaning/frps
详解
--restart=always 表示容器将会在退出时自动重启。
--network host 表示容器使用宿主机的网络命名空间,与宿主机共享网络栈,使得容器中的应用可以直接使用宿主机的网络接口。
-d 表示容器以后台模式运行。
-v /data/frp/frps.ini:/etc/frp/frps.ini 表示将宿主机上的 /data/frp/frps.ini 文件挂载到容器中的 /etc/frp/frps.ini 文件,这样可以在容器中使用自定义的配置文件。
--name frps 表示给容器指定一个名称为 “frps”。
当容器启动后,frp 服务器就会在容器中运行,使用挂载的配置文件进行配置。
5.安全组配置
在云服务器的安全组中,开放入方向端口(如7000、MySQL端口、MinIO API端口等)
| 端口 | 服务 | 
|---|---|
| 7000 | FRP监听端口 | 
| 30001 | MySQL端口 | 
| 30002 | MinIO API端口 | 
| 30003 | Webdav | 
客户端frpc部署
- 在Docker中运行frpc容器,配置frpc.ini,分别映射:- MySQL:TCP协议,本地3306 → 云服务器3306。
- MinIO:HTTP协议,本地9000端口 → 云服务器9000(需结合MinIO的S3兼容API配置)。
- WebDAV:HTTP协议,本地WebDAV端口(如8080)→ 云服务器80/443。
 
QNAP NAS部署frpc
打开容器,创建-搜索 frpc,选择下图标注,点击 创建

三、版本选择latest

四、镜像文件,操作选项里面的“+”

五、创建,设置CPU和内存,设置高级设置

六、高级设置,网络设置为host

七、设置共享文件夹,提前建立文件夹,并放入frpc.ini文件(敲黑板了)

八,确认无误,点击确认

九、检查运行情况

十、收工!

十一、如果要修改frpc.ini,必须删除正在运行的frpc程序,推倒重来一遍才行。
Linux server 部署frpc
1.创建目录
创建目录,用于存放容器持久化存储卷
mkdir -p /data/frp
cd /data/frp
vim frpc.toml
2.配置文件
[common]
server_addr = 120.78.156.217
server_port = 7000
token = abcd12345
[chat]
type = tcp
local_ip = 127.0.0.1
local_port = 3001
remote_port = 30001
配置文件内容含义:
[common] 部分定义了 frpc 的常规配置,包括 server_addr、server_port 和 token。请确保这些值是正确的,并与 frps 服务器的配置相匹配。
[chat] 部分定义了一个名为 chat 的隧道,其类型也是 tcp。该隧道将本地的 127.0.0.1:3001 映射到远程的 30001 端口。同样,请确保 IP 和端口设置正确。
3.查看frpc docker镜像
docker search frpc
4.拉取snowdreamtech/frpc 镜像
docker pull snowdreamtech/frpc 
5.启动snowdreamtech/frpc 容器
docker run --restart=always --network host -d -v /home/frps/frps.toml:/etc/frp/frpc.toml --name frpc snowdreamtech/frpc
docker run --restart=always --network host -d -v /home/frps/frps.toml:/frp/frps.toml --name=frps stilleshan/frps
(3)重启与访问frp
服务端重启
docker restart frps
客户端重启
docker restart frpc
查看监听服务
重启完成,查看服务器监听的端口(其中5000和3000端口是我们想要的)
[root@josh-clound frp]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1081/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1020/master         
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      550/rpcbind         
tcp6       0      0 :::3000                 :::*                    LISTEN      5268/frps           
tcp6       0      0 :::7000                 :::*                    LISTEN      5268/frps           
tcp6       0      0 :::7001                 :::*                    LISTEN      5268/frps           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1020/master         
tcp6       0      0 :::10080                :::*                    LISTEN      5268/frps           
tcp6       0      0 :::5000                 :::*                    LISTEN      5268/frps           
tcp6       0      0 :::10443                :::*                    LISTEN      5268/frps           
tcp6       0      0 :::111                  :::*                    LISTEN      550/rpcbind         
tcp6       0      0 :::80                   :::*                    LISTEN      5786/docker-proxy  
尝试访问
http://服务器IP:5000/ 进行访问
高级设置
一、基础TLS加密配置
1. 服务端配置(frps.ini)
[common]
bind_port = 7000
tls_cert_file = /path/to/server.crt  # 服务端证书路径
tls_key_file = /path/to/server.key   # 服务端私钥路径
tls_trusted_ca_file = /path/to/ca.crt # CA根证书路径
2. 客户端配置(frpc.ini)
[common]
server_addr = x.x.x.x
server_port = 7000
tls_enable = true                     # 启用TLS加密
tls_cert_file = /path/to/client.crt   # 客户端证书路径
tls_key_file = /path/to/client.key    # 客户端私钥路径
tls_trusted_ca_file = /path/to/ca.crt # CA根证书路径
二、高级双向认证配置(推荐)
1. 证书生成流程
# 生成CA证书
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -days 5000 -out ca.crt
# 生成服务端证书
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
# 生成客户端证书
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
2. 双向认证配置
服务端增加:
[transport.tls]
force = true  # 强制客户端使用TLS
客户端增加:
[transport.tls]
disable_custom_tls_first_byte = true  # 禁用特征字节
enable = true                         # 强制启用TLS
三、性能优化配置
[transport]
tcp_mux = true          # 启用TCP多路复用
keepalive_timeout = 60  # 心跳包超时时间
[common]
protocol = kcp          # 使用KCP协议加速
四、安全性增强建议
- 端口隐匿:将默认7000端口改为高位随机端口(如54321)
- 特征混淆:修改TLS握手包特征字节
- 访问控制:结合privilege_mode开启权限控制
- 日志审计:配置log_level = trace记录详细握手过程
五、验证与排错
- 检查证书权限:
chmod 600 *.key        # 密钥文件需严格权限
- 查看握手日志:
grep "TLS handshake" /var/log/frps.log
- 抓包验证:
tcpdump -i eth0 port 7000 -w frp_tls.pcap
通过以上配置,FRP的通信过程将采用TLS 1.3加密,结合双向认证可有效防御中间人攻击。建议定期轮换证书(推荐每90天更新一次)以增强安全性。
 
           
        
        
      