内网穿透工具:FRP(Fast Reverse Proxy)
内网穿透工具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天更新一次)以增强安全性。
License:
CC BY 4.0