如何自建公网服务器:从零搭建家庭服务器的完整指南
月租2000+的云主机用不起?手把手教你用闲置电脑搭建属于自己的公网服务器
目录
· 一、为什么选择自建公网服务器?
· 二、两种主流方案对比:你需要哪一个?
· 三、方案一详解:有公网IP时的直接发布方案
· 四、方案二详解:无公网IP时的FRP内网穿透方案
· 五、一步一步教你部署FRP内网穿透
· 六、安全加固:让公网服务器更安全
· 七、合法性与风险警示
· 八、常见问题排查
· 九、写在最后
---
一、为什么选择自建公网服务器?
云服务器的成本之所以高,是因为它包含了硬件、运维、带宽、电力等多重费用。相比之下,自建方案的优势非常明显:
1. 成本极低:利用闲置旧电脑或迷你主机,硬件成本可控制在500元以内,电费每月仅需几元到十几元。
2. 数据完全掌控:敏感信息存储于本地,避免第三方服务商的数据泄露风险。
3. 自由度高:配置随心所欲,想装什么系统、跑什么服务都由你说了算。
4. 技术成长:通过实操掌握Linux系统管理、网络穿透、安全加固等核心技能。
二、两种主流方案对比:你需要哪一个?
自建公网服务器的核心挑战是:你的家庭宽带大概率没有公网IP。根据你的实际情况,有两种不同方案可供选择。
方案一:有公网IP → 直接端口映射
适用条件:你的宽带拥有动态公网IP(电信和联通用户相对容易申请,移动用户较难)。
工作原理:在路由器上设置端口转发,将外网访问指向你内网的服务设备,再配合DDNS(动态域名解析)绑定一个固定的域名。
优点:成本最低(无需额外购买云服务器)、速度最快(直达家中)、延迟最低。
缺点:公网IP越来越难申请,政策逐年收紧;家宽上行带宽普遍较低(通常20-50Mbps),不适合高并发场景。
方案二:无公网IP → FRP内网穿透
适用条件:无论你有没有公网IP,都可以用这套方案。
工作原理:准备一台价格极低的云服务器(月付20-50元)作为“中转站”,FRP在其中运行服务端(frps),在你家中运行客户端(frpc)。当外网用户发起请求时,流量先到达云服务器,再经由隧道安全、快速地转发至你家里的设备中。
优点:适应所有网络环境、配置灵活、支持多协议、可扩展性强。
缺点:每月需要支付云服务器租金(约20-50元),但远低于月租2000+的昂贵方案。
我的建议:如果你只想自用、不想折腾公网IP申请,直接选择方案二(FRP内网穿透)。这也是本文的重点内容。
三、方案一详解:有公网IP时的直接发布方案
3.1 如何判断自己是否有公网IP?
进入路由器后台,找到WAN口状态,查看获取的IP地址:
· 如果IP是100.64.x.x ~ 100.127.x.x范围,说明你在运营商的大内网中,没有公网IP。
· 如果是其他公网IP段,再去访问 https://mao.fan/mynat 测试NAT类型,两者一致则说明你有公网IP。
3.2 没有公网IP怎么办?
如果有公网IP的需求,可以致电运营商客服(电信10000、联通10010),说明你因“远程办公”、“NAS搭建”等需求申请公网IP。如果遇到推诿或拒绝,可以尝试通过工信部投诉渠道推动处理。
需要特别注意:部分地区申请公网IP可能需要额外收费。根据最新用户反馈,北京电信公网IP约10元/月,移动公网IP约20元/月。申请时务必说明仅用于自用,切忌提及任何商业用途。
3.3 配置DDNS与端口转发
如果有了公网IP,需要完成以下三步:
1. 设置端口转发:登录路由器管理后台,找到“端口转发”(或“虚拟服务器”)功能,将外网特定端口映射到内网服务器的IP和端口上。
2. 部署DDNS服务:由于家庭宽带的公网IP是动态变化的,需要一个DDNS(动态域名解析)服务来绑定固定域名。免费的DDNS服务有花生壳、DuckDNS等。在路由器中登录DDNS账号,一个固定的域名就会和你的动态公网IP自动绑定在一起。
3. 测试外网访问:通过手机4G/5G网络访问 http://你的域名:你设置的端口,如果可以打开服务器页面,说明配置成功。
四、方案二详解:无公网IP时的FRP内网穿透方案
4.1 什么是FRP?
FRP(Fast Reverse Proxy)是一个高性能的反向代理应用,可以帮助我们将内网服务安全、便捷地暴露到公网。它采用C/S架构,包含服务端(frps)和客户端(frpc)两个核心组件。
工作原理:公网服务器上运行服务端,内网设备上运行客户端,两者之间建立一条加密隧道。外网请求先到达服务端,再通过隧道转发到内网客户端,最后返回响应数据。
核心特性:
· 多协议支持:TCP/UDP/HTTP/HTTPS全协议穿透
· 负载均衡:支持多客户端轮询分发请求
· 健康检查:自动检测失效客户端并移除
· 加密通信:可选TLS加密保障数据安全
4.2 FRP的四类代理模式
FRP支持四种代理模式(Proxy Type),你可以根据需求灵活选用:
模式 参数 type 适用场景 特点
TCP穿透 tcp SSH、远程桌面、数据库、游戏联机 配置最简单,通用性最强
HTTP/HTTPS穿透 http/https 网站、博客、API服务 支持域名路由,可复用端口
安全TCP穿透 stcp 不想公开给所有人访问的服务 服务端只负责牵线,不中转数据
P2P穿透 xtcp 大文件传输、视频流 建立P2P直连后不经过中转服务器
4.3 部署前需要准备什么?
1. 一台云服务器(中转站):配置要求很低,1核CPU、512MB内存即可满足FRP转发需求。国内主流厂商(阿里云、腾讯云)经常有新人特惠活动,甚至能以1-3折的价格入手,预算可以控制在月付几十元以内。不在意网络延迟的话,也可以选择DigitalOcean、Vultr等国际厂商的廉价实例。
2. 一台内网设备:可以是闲置的旧电脑、迷你主机(如Intel NUC、树莓派4B),甚至是你日常使用的主力机。
4.4 如何选择操作系统?
· 服务端(云服务器):建议使用Linux(如Ubuntu Server LTS版或CentOS),资源占用极低、稳定高效,支持90%以上的开源服务。
· 客户端(内网设备):自由度更高,Linux、Windows、macOS都可以,只要能运行FRP客户端就行。
对于刚接触Linux的朋友,建议选择Ubuntu 22.04 LTS或更新版本,它的社区文档最丰富,遇到问题容易找到解决方案。
五、一步一步教你部署FRP内网穿透
5.1 在云服务器上部署FRP服务端
第一步,先确认你的云服务器架构。SSH连接到服务器,在终端输入以下命令来查看系统架构:
```bash
uname -m
```
· 输出 x86_64:下载 frp_0.61.2_linux_amd64.tar.gz
· 输出 aarch64 或 arm64:下载 frp_0.61.2_linux_arm64.tar.gz
第二步,下载并解压FRP:
```bash
# 下载最新版本(当前最新为0.61.2)
wget https://github.com/fatedier/frp/releases/download/v0.61.2/frp_0.61.2_linux_amd64.tar.gz
# 解压缩
tar -xzvf frp_0.61.2_linux_amd64.tar.gz
# 进入解压目录
cd frp_0.61.2_linux_amd64
```
解压后会得到四个主要文件:frps(服务端程序)、frps.toml(服务端配置文件)、frpc(客户端程序)、frpc.toml(客户端配置文件)。在服务端上,我们只保留frps相关的文件即可。
第三步,配置服务端 frps.toml 文件:
```toml
# 服务端监听配置
bindAddr = "0.0.0.0" # 监听所有网卡地址
bindPort = 7000 # 客户端连接端口
# 认证设置(务必替换为自己的强密码)
auth.method = "token"
auth.token = "你的强密码" # 服务端与客户端需保持一致
# 虚拟主机配置(用于HTTP代理)
vhostHTTPPort = 7002
# 仪表盘配置——方便监控服务状态
[webServer]
addr = "0.0.0.0" # 监听所有IP,以便远程访问
port = 7500 # 面板访问端口
user = "admin" # 面板登录用户名
password = "你的面板密码" # 面板登录密码(务必修改)
# 日志配置
[log]
to = "/var/log/frps.log" # 日志输出位置
level = "info" # 日志级别
maxDays = 3 # 日志保留天数
```
这个配置中,bindPort = 7000 是客户端连接服务端的核心端口。port = 7500 是管理面板的端口,配置完成后可以通过 http://你的云服务器IP:7500 访问面板,查看连接状态和流量统计。
第四步,开放云服务器防火墙端口:
```bash
# Ubuntu/Debian 使用 ufw
sudo ufw allow 7000/tcp # 客户端连接端口
sudo ufw allow 7500/tcp # 管理面板端口
sudo ufw allow 7002/tcp # HTTP虚拟主机端口(如需HTTP穿透)
```
第五步,启动服务端:
```bash
# 前台启动(测试用)
./frps -c frps.toml
# 后台启动(正式用)
nohup ./frps -c frps.toml > /var/log/frps.log 2>&1 &
```
第六步,设置开机自启(推荐使用systemd方式):
```bash
# 创建服务文件
sudo nano /etc/systemd/system/frps.service
```
```ini
[Unit]
Description=FRP Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/你的FRP目录/frps -c /你的FRP目录/frps.toml
[Install]
WantedBy=multi-user.target
```
```bash
# 重新加载systemd配置并启用服务
sudo systemctl daemon-reload
sudo systemctl enable frps.service # 设置开机自启
sudo systemctl start frps.service # 立即启动
```
5.2 在内网设备上配置FRP客户端
第一步,根据你的操作系统下载对应的FRP客户端版本:
· Windows:下载 frp_0.61.2_windows_amd64.zip
· macOS:下载 frp_0.61.2_darwin_amd64.tar.gz
· Linux:下载 frp_0.61.2_linux_amd64.tar.gz
第二步,创建客户端配置文件 frpc.toml(注意服务端和客户端的配置文件不能混用):
```toml
# FRP客户端配置
serverAddr = "你的云服务器公网IP" # 服务端地址
serverPort = 7000 # 服务端端口(与bindPort一致)
auth.token = "你的强密码" # 与服务端设置的token一致
# 启用TLS加密传输(强烈推荐)
transport.tls.enable = true
# 代理规则1:SSH远程访问
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
# 代理规则2:Web服务(比如你运行的Python Flask应用)
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 5000 # Python服务运行的端口
remotePort = 6001
# 代理规则3:远程桌面(Windows)
[[proxies]]
name = "rdp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3389
remotePort = 6002
```
第三步,启动客户端:
```bash
# Linux/macOS
./frpc -c frpc.toml
# Windows(在命令行中)
frpc.exe -c frpc.toml
```
如果看到类似 login to server success 和 start proxy success 的日志信息,说明连接成功,隧道已经打通。
5.3 在Windows上设置客户端开机自启
如果你想在Windows上让FRP客户端随系统自动启动,有几种方法可选:
方法一(简单直观):创建一个 start_frpc.bat 批处理脚本,写入以下内容后放入“启动”文件夹(shell:startup):
```batch
@echo off
cd /d "你的FRP目录路径"
start /min frpc.exe -c frpc.toml
exit
```
方法二(更专业):使用Windows任务计划程序设置开机任务,可以无窗口、静默运行。
5.4 编写一个Python测试程序
为了确认整个流程配置成功,我们来写一个最简单的Flask应用作为测试。
首先安装Flask并创建应用文件 app.py:
```python
from flask import Flask
import datetime
app = Flask(__name__)
@app.route('/')
def home():
return f"Hello from Home Server! Current time is: {datetime.datetime.now()}"
@app.route('/test')
def test():
return "Python script is working!"
if __name__ == '__main__':
# host必须绑定为'0.0.0.0',端口要与FRP配置中的localPort一致
app.run(host='0.0.0.0', port=5000)
```
然后运行测试程序:
```bash
python3 app.py
```
在本地浏览器访问 http://127.0.0.1:5000,看到欢迎语即说明本地程序运行正常。
5.5 最终验证:从外网访问
关闭手机的Wi-Fi,只使用4G/5G蜂窝网络(模拟外部网络环境),在手机浏览器中输入:
```
http://你的云服务器公网IP:6001
```
如果你看到的画面和本地的 http://127.0.0.1:5000 一致,说明FRP内网穿透已经成功了!🎉
5.6 可选:配置管理面板监控
FRP提供了网页版管理面板,可以帮助你实时监控连接状态。在服务器上启动FRP后,访问 http://你的云服务器IP:7500,输入你在 frps.toml 中设置的用户名和密码即可登录。
面板上可以看到当前有多少客户端在线、每个代理的连接数、流量统计等信息,非常方便运维管理。
5.7 进阶:使用Docker部署FRP
如果你熟悉Docker,使用容器部署FRP会更简洁,环境和依赖隔离也更干净:
```bash
# 启动服务端
docker run --restart=always --network host -d \
-v /etc/frp/frps.toml:/etc/frp/frps.toml \
--name frps snowdreamtech/frps
# 启动客户端
docker run --restart=always --network host -d \
-v /etc/frp/frpc.toml:/etc/frp/frpc.toml \
--name frpc snowdreamtech/frpc
```
Docker镜像的优势在于多架构支持(amd64、arm32v6、arm32v7、arm64v8等)、轻量级部署,以及配置变更后易于重启管理。
六、安全加固:让公网服务器更安全
将服务器暴露到公网后,安全性必须放在首位。互联网中的扫描器、攻击脚本无处不在,服务器的SSH端口(默认22)每天可能被成千上万次尝试登录。以下是必不可少的安全措施:
6.1 Linux云服务器基础安全配置
1. 配置UFW防火墙
Ubuntu系统默认安装了UFW(Uncomplicated Firewall),我们只开放必要的端口:
```bash
# 启用UFW并设置默认策略
sudo ufw default deny incoming # 默认拒绝所有入站流量
sudo ufw default allow outgoing # 默认允许所有出站流量
# 只开放必要端口
sudo ufw allow 22/tcp # SSH(如果你修改了端口,替换为你的SSH端口)
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 7000/tcp # FRP服务端端口
# 启用防火墙
sudo ufw enable
sudo ufw status verbose
```
2. SSH安全加固——这是最重要的一项!
公网服务器的SSH端口每天都会遭到大量脚本式的暴力破解尝试。请按照以下步骤强化SSH安全:
```bash
# 编辑SSH配置文件
sudo nano /etc/ssh/sshd_config
```
在配置文件中修改或添加以下内容:
```bash
Port 22222 # 修改默认22端口,改为一个不常用的端口
PermitRootLogin no # 禁止root直接远程登录
PasswordAuthentication no # 禁用密码登录,只允许密钥登录
MaxAuthTries 3 # 每连接最多尝试3次认证
AllowUsers 你的用户名 # 仅允许指定用户登录
```
修改完成后重启SSH服务:
```bash
sudo systemctl restart sshd
```
特别提醒:在禁用密码登录之前,务必先配置好SSH密钥登录并测试成功,否则你会把自己锁在服务器外面!
生成SSH密钥的方法(在本地电脑执行):
```bash
ssh-keygen -t ed25519 -C "your_email@example.com"
```
然后将公钥复制到服务器:
```bash
ssh-copy-id -p 22222 用户名@服务器IP
```
测试无误后,再执行上述禁用密码登录的步骤。
3. 安装fail2ban自动封禁暴力破解IP
即使启用了SSH密钥认证,攻击尝试依然会消耗日志空间和系统资源。fail2ban可以自动封禁恶意IP:它实时扫描日志,识别重复失败的登录尝试后,自动向防火墙下发规则临时封禁恶意IP。
```bash
# 安装fail2ban
sudo apt update && sudo apt install fail2ban -y
```
创建自定义配置文件:
```bash
sudo nano /etc/fail2ban/jail.local
```
```ini
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 # 白名单(可加入你信任的IP)
bantime = 1h # 封禁1小时
findtime = 10m # 10分钟内统计失败次数
maxretry = 5 # 失败5次触发封禁
[sshd]
enabled = true
port = 22222 # 你的SSH端口
logpath = %(sshd_log)s
```
启动并启用fail2ban:
```bash
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
```
配置完成后,后台爆破的告警数量会立刻大幅下降。
4. 保持系统更新
```bash
sudo apt update && sudo apt upgrade -y
# 开启自动安全更新
sudo dpkg-reconfigure --priority=low unattended-upgrades
```
6.2 内网设备安全注意事项
1. 最小开放原则:在防火墙中只开放你真正需要暴露的端口。不要为了方便直接把DMZ打开,那相当于把整台电脑暴露在公网之下。
2. 强密码策略:所有登录账户杜绝弱密码(不要用password、123456、admin这类常见密码),建议使用12位以上的随机密码。
3. 定期检查服务状态:通过FRP管理面板监控连接情况,发现异常可以及时处理。
七、合法性与风险警示
这是自建公网服务器时必须认真对待的一环。技术本身是中性的,关键在于你如何使用它。
7.1 明确禁止的行为:千万不要碰PCDN
PCDN(P2P内容分发网络)是指利用家庭宽带的上行带宽进行商业流量贩卖的行为。常见的PCDN产品包括“赚钱宝”、“网心云”、“京东云无线宝”等设备。
这些行为属于违法行为。依据《中华人民共和国电信条例》,普通家庭用户无PCDN业务经营资质,擅自开展属违法,可被追责。
运营商已经在严厉打击PCDN。2025年以来,相关部门已对京东云、网心云等PCDN头部资源厂商,以及字节跳动、阿里、爱奇艺等PCDN头部客户进行了约谈,要求限期停止相关业务。
一旦被运营商检测到家庭宽带持续高上行流量、公网可访问设备等特征,便会判定为PCDN使用,处置措施包括限速、断网(“局停”)、要求签署承诺书等。
简单来说:用你的宽带去“挖矿”、卖流量给别人——绝对不行!
7.2 严格遵守的行为:家庭宽带不能用于商业目的
几乎所有家庭宽带合同中,都明确规定“不得用于商业用途”。运营商认为,用户通过PCDN获取收益已构成商业行为。中国的宽带定价机制下,家庭宽带价格远低于企业专线,这种行为会直接冲击运营商的核心收入。
如果你只是个人自用(如远程访问家里的NAS、回家调试代码、偶尔运行测试脚本等),通常不会有什么问题。但如果将服务向公众开放运营或收取费用,性质就完全不同了,不仅违反运营商协议,还可能涉及无证提供互联网信息服务的法律风险。
7.3 网络行为合规指引
· ✅ 允许:个人远程访问NAS文件、家庭监控、远程代码调试、偶尔测试Python脚本
· ❌ 不允许:PCDN流量贩卖、使用FRP访问境外受限网络、运营商业网站(需ICP许可证)、非法信息传播
八、常见问题排查
问题1:客户端日志显示 login to server error
· 检查云服务器防火墙是否开放了 bindPort(7000)
· 检查服务端和客户端的 auth.token 是否完全一致
· 检查云服务器的安全组规则(阿里云、腾讯云等厂商有独立的安全组设置)
问题2:能连上但服务访问不了
· 确认内网服务正常运行(curl http://127.0.0.1:端口 测试)
· 确认本地Python程序绑定了 0.0.0.0 而不是 127.0.0.1
· 检查客户端 frpc.toml 中的 localPort 是否与服务端口一致
· 确认外网访问时使用的是 remotePort 而不是 localPort
问题3:路由器重启后连接不上
· 确认客户端已配置开机自启(systemd或任务计划)
· 如果内网设备IP是动态分配的,建议设置静态内网IP
问题4:家里网络不稳定,客户端频繁掉线
· 在客户端配置中添加 transport.tls.enable = true 启用TLS加密
· 考虑在客户端配置中添加 transport.protocol = "kcp" 使用KCP协议,它在高丢包率网络环境下表现更好
问题5:公网访问速度慢
· 公网访问性能主要取决于云服务器带宽和你家庭宽带的上行带宽。家庭宽带的上行带宽通常远低于下行带宽(比如500M下行、30M上行是常见的),这是瓶颈所在。
· 对于大文件传输场景,可以尝试使用 type = "xtcp" P2P模式,建立直连后不再经过中转服务器。
九、写在最后
自建公网服务器这件事,做起来并不复杂。它最吸引人的地方在于:你可以用极低的成本获得相当强大的服务器性能,同时享受完全掌控数据的安心感。
通过FRP内网穿透,你可以在任何地方访问家中的服务器,运行你的Python程序、托管网站、备份文件……这个方案特别适合这几类朋友:想低成本搭建个人NAS的玩家、需要远程调试代码的开发者、技术爱好者做实验和学习,以及希望完全掌控自己数据的人。
如果你在部署过程中遇到问题,我的建议是:
1. 仔细检查日志:FRP的日志输出非常详细,大部分问题都能从日志中找到线索
2. 从最简单的场景开始:先测试纯TCP穿透(比如SSH),成功后再逐步增加HTTP、HTTPS等复杂配置
3. 善用管理面板:FRP的Web面板可以提供丰富的调试信息
4. 搜索社区:GitHub上的FRP Issues和各大技术社区已经解答过绝大多数问题
希望这份详尽的教程能够帮助你顺利搭建属于自己的公网服务器。如果在操作过程中遇到任何困难,欢迎随时留言交流!
本文中涉及的所有命令行操作,请务必替换其中的IP地址、端口号、密码等为你的实际配置。安全第一!
------
延伸阅读:
【当下,云厂商提供的云主机,会禁止用云主机公网ip,再加“内网穿透”方式,在家另设主机么?】→看看Ai如何回答?
https://chat.deepseek.com/share/x467vbq9gljpae891v