Skip to content

🚇 内网穿透:frp 实战

家里服务器没有公网 IP?frp 帮你把内网服务暴露到公网

为什么需要内网穿透

你的电脑(内网 192.168.1.100)
    │ 没有公网 IP,外面访问不到
家里的路由器(NAT)
    │ 有公网 IP
互联网用户 → 不知道怎么连进来

有了 frp:

你的电脑 ─── frp 客户端 ──→ frp 服务器(有公网 IP)←── 互联网用户

frp 服务器做中转,外面访问 frp 服务器的端口 → frp 转发到你内网的电脑。


架构

┌─────────────────┐         ┌──────────────────┐
│  frps(服务端)   │  ◄───→  │  frpc(客户端)    │
│  124.222.126.171 │  长连接  │  内网机器          │
│  端口: 7000(控)  │         │  端口: 无要求       │
│  端口: 8898(转发)│         │                    │
└─────────────────┘         └──────────────────┘

        │ 用户访问 124.222.126.171:8898
        │ → frps 转发 → frpc → 内网服务

安装(服务端 + 客户端)

bash
# 下载最新版
wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
tar -xzf frp_0.61.0_linux_amd64.tar.gz
cd frp_0.61.0_linux_amd64

# 两个文件:
# frps + frps.toml → 服务端(放公网服务器)
# frpc + frpc.toml → 客户端(放内网机器)

服务端配置(frps.toml)

放在公网服务器上:

toml
# frps.toml
bindPort = 7000           # frp 控制端口(客户端连这个)

# 管理面板(可选)
webServer.port = 7500
webServer.user = "admin"
webServer.password = "yourpassword"

# Token 认证(必配!)
auth.token = "your_strong_token_here"
bash
# 启动服务端
./frps -c frps.toml

# 或 systemd 服务
sudo tee /etc/systemd/system/frps.service << 'EOF'
[Unit]
Description=frp server
After=network.target

[Service]
Type=simple
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable --now frps

客户端配置(frpc.toml)

放在内网机器上:

toml
# frpc.toml
serverAddr = "124.222.126.171"   # frps 服务器公网 IP
serverPort = 7000                 # frps 控制端口
auth.token = "your_strong_token_here"   # 跟 frps 一致

# 代理1:SSH 远程登录内网机器
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222       # 外面通过 124.222.126.171:2222 连 SSH

# 代理2:HTTP Web 服务
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8898
remotePort = 8898       # 外面通过 124.222.126.171:8898 访问

# 代理3:HTTPS Web 服务
[[proxies]]
name = "web-https"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8444
remotePort = 8444
bash
# 启动客户端
./frpc -c frpc.toml

frp 代理类型

类型用途原理
tcpTCP 端口转发(最常用)一对一端口映射
udpUDP 端口转发DNS/VPN/游戏
httpHTTP 代理自动识别域名,多站点共用一个端口
httpsHTTPS 代理同上,加密版本
stcp安全 TCP(加密)服务端看不到数据内容
xtcpP2P 直连(打洞)不经过服务端中转,更快

安全加固

toml
# frps.toml 安全配置
auth.token = "强随机字符串"          # 必配!防未授权连接
allowPorts = [
  { start = 2000, end = 3000 },
  { single = 8898 }
]                                     # 限制可用的转发端口范围
bash
# frps 不要以 root 运行
sudo useradd -r -s /bin/false frp
sudo chown -R frp:frp /opt/frp
sudo systemctl edit frps
# 加 User=frp

常见问题

内网服务暴露后,nginx 怎么配?

nginx
# 外网域名指向公网服务器
# 公网服务器上配 nginx 反代到 frps 转发端口
server {
    server_name service.sirenzhuli.cn;
    listen 443 ssl;
    # ... SSL 证书 ...

    location / {
        proxy_pass http://127.0.0.1:8898;   # frps 转发端口
        proxy_set_header Host $host;
    }
}

frp 延迟高怎么办?

  • 使用 xtcp 类型直连,不走服务端中转
  • 服务端选近的(同城腾讯云 vs 国外服务器)

🎯 本章要点

  • frps 放公网服务器(固定 IP),frpc 放内网机器
  • auth.token 必配——否则谁都能连你的 frp 服务器
  • tcp 类型最通用:remotePort → frps 转发 → frpc → localPort → 内网服务
  • 配合 nginx 反代,内网服务可以有独立域名 + HTTPS
  • frp 只做传输,数据安全靠应用层(HTTPS/SSH 加密)
加载练习题中...

有问题或补充?欢迎留言