主题
🚇 内网穿透: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 = 8444bash
# 启动客户端
./frpc -c frpc.tomlfrp 代理类型
| 类型 | 用途 | 原理 |
|---|---|---|
| tcp | TCP 端口转发(最常用) | 一对一端口映射 |
| udp | UDP 端口转发 | DNS/VPN/游戏 |
| http | HTTP 代理 | 自动识别域名,多站点共用一个端口 |
| https | HTTPS 代理 | 同上,加密版本 |
| stcp | 安全 TCP(加密) | 服务端看不到数据内容 |
| xtcp | P2P 直连(打洞) | 不经过服务端中转,更快 |
安全加固
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 加密)
加载练习题中...