零基础搭建家庭公网服务器

如何自建公网服务器:从零搭建家庭服务器的完整指南

月租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

```

  1. 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

```

测试无误后,再执行上述禁用密码登录的步骤。

  1. 安装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

```

配置完成后,后台爆破的告警数量会立刻大幅下降。

  1. 保持系统更新

```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

相关推荐
dust_and_stars4 小时前
Streamlit vs Gradio 完整对比
服务器·python
BJ_Bonree4 小时前
聊点技术 | 从“统一接入“到“统一调度“:重塑可观测平台的数据底座
运维·人工智能·可观测性
AOwhisky4 小时前
学习自测与解析:Redis系列第一期与第二期核心知识点详解
运维·数据库·redis·学习·云计算
流浪0014 小时前
Linux系统篇(五):Linux 进程控制全解:fork、exec、wait 核心原理与实战
linux·运维·服务器
从入门到放弃-咖啡豆4 小时前
记录一次docker部署过程和一些常用的docker指令
运维·docker·容器
DianSan_ERP4 小时前
架构师视角:电商大促高并发下的订单API限流与防漏单架构演进
java·运维·网络·安全·微服务·架构·自动化
不会就选b4 小时前
Linux之make,makefile
linux·运维·服务器
腾讯蓝鲸智云4 小时前
【运维自动化-监控平台】初识蓝鲸监控
运维·自动化·云计算·sass·paas
日取其半万世不竭4 小时前
新服务器买完 24 小时内要做什么?安全加固清单
运维·服务器·安全
code monkey.4 小时前
【Linux之旅】HTTP 协议解析:从请求格式到构建 Web 服务器
linux·服务器·网络·http