avatar

黄金月河3.1

浴火重生

  • 首页
  • Linux基础
  • 运维
  • Github
  • Python
  • 网络安全
  • 软路由
  • 时光手札
  • 关于
Home 内网穿透工具:FRP(Fast Reverse Proxy)
文章

内网穿透工具:FRP(Fast Reverse Proxy)

Posted 2025-02-25 Updated 2025-02- 26
By 奈幽
39~50 min read

内网穿透工具FRP

Fast Reverse Proxy

核心优势

  1. 开源与活跃维护
    GitHub Star 87.3k,更新频繁(最近提交为5天前),社区支持强大,长期维护有保障。
  2. 多协议支持
    支持TCP、UDP、HTTP/HTTPS等协议,完美适配MySQL(TCP)、MinIO(HTTP/S3)、WebDAV(HTTP)的穿透需求。
  3. 配置灵活
    通过frpc.ini配置文件可自定义端口映射规则,支持批量端口管理和独立代理控制,适合多服务场景。
  4. Docker兼容性
    提供官方Docker镜像,可直接在NAS的Docker容器中部署客户端(frpc),与你的NAS环境无缝衔接。
  5. 安全性
    支持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端口等)

端口服务
7000FRP监听端口
30001MySQL端口
30002MinIO API端口
30003Webdav

客户端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,选择下图标注,点击 创建

img

三、版本选择latest

img

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

img

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

img

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

img

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

img

八,确认无误,点击确认

img

九、检查运行情况

img

十、收工!

img

十一、如果要修改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:3000/进行访问

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协议加速

四、安全性增强建议

  1. 端口隐匿:将默认7000端口改为高位随机端口(如54321)
  2. 特征混淆:修改TLS握手包特征字节
  3. 访问控制:结合privilege_mode开启权限控制
  4. 日志审计:配置log_level = trace记录详细握手过程

五、验证与排错

  1. 检查证书权限:
chmod 600 *.key        # 密钥文件需严格权限
  1. 查看握手日志:
grep "TLS handshake" /var/log/frps.log
  1. 抓包验证:
tcpdump -i eth0 port 7000 -w frp_tls.pcap

通过以上配置,FRP的通信过程将采用TLS 1.3加密,结合双向认证可有效防御中间人攻击。建议定期轮换证书(推荐每90天更新一次)以增强安全性。

License:  CC BY 4.0
Share

Further Reading

OLDER

VSCode打造Shell脚本IDE完整教程

NEWER

开源镜像站

Recently Updated

  • 奈幽的渗透测试总结-红队
  • 基于Docker的虚拟 Chrome 浏览器
  • Metasploit Framework (MSF) 使用指南
  • rhel9 安装docker和docker-compose
  • 内网穿透工具:zrok

Trending Tags

Halo elasticsearch debian openwrt KeepassXC 必看精选 webdav 热门文章 docker Linux

Contents

©2025 黄金月河3.1. Some rights reserved.

Using the Halo theme Chirpy