企业级内网穿透实战:frp 深度部署、域名映射与 TLS 安全全解

1. 深度架构:为什么 frp 是穿透之王?

frp (Fast Reverse Proxy) 是一款专注于高性能、跨平台的反向代理应用。相比于传统的 DDNS(受限于公网 IP)或 VPN(配置臃肿),frp 的优势在于:

  • 协议丰富:支持 TCP, UDP, HTTP, HTTPS, STCP, KCP 等。
  • 配置极简:通过简单的 .toml 配置文件即可实现复杂的端口映射。
  • 安全性高:原生支持 TLS 加密传输,适配 Let’s Encrypt 证书。

2. 基础设施准备

  1. 公网服务端 (frps):一台具备公网 IP 的 Linux 云服务器(推荐 Ubuntu 22.04 LTS 或 Debian 11+)。
  2. 内网客户端 (frpc):你的 NAS、个人 PC 或内网服务器。
  3. 域名资源:一个已备案(或境外)的域名,并完成 A 记录解析到公网服务器 IP。
  4. TLS 证书:申请好的 SSL/TLS 证书(.crt 和 .key 文件),用于 HTTPS 映射。

3. 服务器底层优化:开启 BBR 加速

在进行内网穿透前,必须开启 Google BBR 拥塞控制算法,以大幅提升在高延迟或丢包环境下的传输吞吐量。

  1. 检查内核版本:需在 4.9 以上。
  2. 开启 BBR
    1
    2
    3
    echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
    echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
    sysctl -p
  3. 验证结果
    1
    2
    sysctl net.ipv4.tcp_available_congestion_control
    # 输出应包含 bbr

4. 服务端部署 (frps) — 进阶配置

4.1 安装与目录规范

1
2
3
4
5
# 下载最新版 (以 v0.54.0 为例)
wget https://github.com/fatedier/frp/releases/download/v0.54.0/frp_0.54.0_linux_amd64.tar.gz
tar -zxvf frp_0.54.0_linux_amd64.tar.gz
sudo mv frp_0.54.0_linux_amd64 /usr/local/frp
cd /usr/local/frp

4.2 配置 frps.toml (多业务支持)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bindPort = 7000           # frp 通讯主端口
vhostHTTPPort = 80 # HTTP 服务监听端口
vhostHTTPSPort = 443 # HTTPS 服务监听端口

# 鉴权设置
auth.method = "token"
auth.token = "SECRET_TOKEN_CHANGE_ME"

# 管理后台 (Dashboard)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "strong_password"
transport.tcpMux = true

# TLS 配置 (双向加密基础)
transport.tls.force = true

5. 域名与 SSL 证书实战 (HTTPS 穿透)

这是 frp 最核心的进阶用法:将内网 Web 服务映射到公网域名的 443 端口。

5.1 客户端 frpc.toml 配置

在内网机器上,我们将内网的 80 端口服务通过公网服务器的 TLS 证书包装后发布。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
serverAddr = "x.x.x.x"
serverPort = 7000
auth.token = "SECRET_TOKEN_CHANGE_ME"

[[proxies]]
name = "web-nas"
type = "tcp"
customDomains = ["nas.yourdomain.com"]

[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:80"

# 证书配置:将证书放在 frpc 所在机器
crtPath = "./server.crt"
keyPath = "./server.key"
hostHeaderRewrite = "127.0.0.1"

5.2 泛域名支持

如果你有多个服务,建议配置泛域名(如 *.yourdomain.com),在 frps.toml 中增加:

1
subDomainHost = "yourdomain.com"

这样客户端只需配置 subdomain = "nas" 即可通过 nas.yourdomain.com 访问。


6. 高安全性模式:STCP 与 P2P (XTCP)

6.1 STCP (Secret TCP)

不暴露公网端口,只有持有相同 Token 的客户端才能建立连接。

  • 服务端:无需额外配置。
  • 内网端:配置为 type = "stcp" 并设置 secretKey
  • 访问端:也需运行 frpc,配置 type = "stcp" 的 visitor。

6.2 XTCP (P2P 穿透)

尝试打洞实现点对点传输,流量不经过服务器中转,适合大文件传输。(XTCP(P2P)打洞的成功率极度依赖于两端的 NAT 类型,如果两端都是 Symmetric NAT(对称型 NAT),XTCP 几乎 100% 失败。此时必须依赖 frp 的 Server Helper 角色或回退到 STCP 模式)

1
2
3
4
5
6
[[proxies]]
name = "p2p_ssh"
type = "xtcp"
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22

7. 生产环境运维:Systemd 自启动

为了保证服务 24/7 不间断,必须配置守护进程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# /etc/systemd/system/frps.service
[Unit]
Description=frp server
After=network.target syslog.target

[Service]
Type=simple
LimitNOFILE=65535
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.toml
Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

启动命令:systemctl daemon-reload && systemctl enable frps --now


8. 适用场景与风险控制

适用人群

  • 私有云存储:Nextcloud/群晖 NAS 远程访问。
  • DevOps:本地 Webhook 回调调试、微信开发环境。
  • 远程管理:全平台 RDP/SSH/VNC 远程控制。

风险防范 (Risk Management)

  1. DDoS 风险:公网服务器建议开启防火墙(ufw/iptables),仅开放必要端口。
  2. 弱密码攻击:frp 本身不验证内网服务密码,请务必保证 SSH、RDP 等服务使用强密钥登录。
  3. 合规性:请确保映射的内容符合当地法律法规,避免映射敏感服务。

9. 总结:性能调优建议

  • 压缩:在 proxies 中开启 transport.useCompression = true 可减少 30% 以上带宽消耗。
  • KCP 协议:在网络环境极差(如移动网络)下,配置 transport.protocol = "kcp" 能显著降低卡顿。
  • 多用户:通过 common 配置中的 user 字段区分多个客户端,方便在 Dashboard 查看。