为什么需要家庭服务器:我之前开发的web 应用都是部署在 vercel 上,长时间以来,十几个应用的用量都没有超过 vercel 的免费额度,但近两个月, 高校分布可视化平台 这个应用的访问量突增,用量已大幅超出免费额度。升级了 pro plan 之后,包含的每月 20刀 的默认额度也 cover 不住了,还产生了不少额外费用。
VPS 价格贵,配置低。通常优惠的都是 2C 2G,跑不了几个业务。而且往往只能申请一次。
- 用来做什么:主力业务肯定不行,目前用来部署 umami 做统计分析等。
所需硬件及配置
我购买的迷你主机配置为:J1900 8+256G 。虽然 CPU 性能很差,但足够大的内存能支撑我部署很多玩具应用了。我是在淘宝 科比特迷你电脑小主机 这家店买的,价格只需 387 元,再加上转接头也不到 400 元,让客服预装 ubuntu server 26 ,答复说 26 装不下,只能装 24 ,就很智障。
整个过程额外引入的硬件有:
- 一根网线
- 一台迷你主机
- DP 转 HDMI 转接头(我购买的迷你主机没有 HDMI口,只有DP,而显示器又没有 DP 口,所以需要用到转接头)。
效果和试用体验
硬件功耗真很低,几乎感受不到什么发热量。
家庭服务器如何实现公网访问
ipv6 DDNS + ipv4 frp 。
使用 DDNS 动态解析域名到 IPv6 地址
虽然公网 ipv4 对于家庭宽带用户基本是不可指望的,但 ipv6 地址却是触手可及的,于是可以将域名解析到公网 ipv6 地址,用户最终使用 ipv6 访问服务。
根据我有限的经验,移动基本是默认开启ipv6的,电信似乎则不然。虽然 ipv6 可能会变,但可以定时自动根据 ipv6 地址更新域名解析。这个我几年前就写过 shell 脚本实现过,我最近才知道这种技术叫做 DDNS ,还了解到有一个叫 DDNS-GO 的工具可以很方便地配置实现这个功能,试了下果然 一分钟就配好了,比自己折腾脚本要方便多了。
无线路由器之前已经改成桥接模式,网关直接获取 ip 地址,基本不会变。
获取运营商光猫超级管理员密码
为了确保 ipv6 开启,可能需要获取运营商光猫的管理员密码,以进行一些配置,比如关闭一些防火墙项等。
当然可以直接联系售后说明需求,但如若不成功,就需要自己尝试获取了。我使用的移动光猫是 HG6145D 这个型号,在这里也把我的经验分享出来。
HG6145D 如何获取超级管理员密码
超管账号的获取我主要参考这篇了获取: https://www.zhihu.com/question/427364972/answer/2848107230?share_code=55SKDgYEOzdi&utm_psn=2050505866416223818
但还是有些出入,打开 telnet 还需要带上 key 这个参数
- 开启设备 telnet 连接:设备Telnet 默认是关闭的,需要用带 MAC 的特殊 URL 开启,浏览器地址栏访问:http://192.168.1.1/cgi-bin/telnetenable.cgi?telnetenable=1&key=AABBCCDDEEFF(替换 key= 后面为你的 MAC)
- 登录 Telnet Windows 先开启 Telnet 功能[^1],然后:telnet 192.168.1.1
- 用户名:admin
- 密码:Fh@ + MAC 后6位(大写)
bashload_cli factoryshow admin_pwd
会显示 CMCCAdmin / 超级密码,可登录网页管理页。
安装 DDNS-GO
我的域名基本都使用了 Vercel 的域名解析服务器,ddns-go支持 Vercel API,这让我喜出望外, ddns-go 安装过程:
- 下载并解压:访问 ddns-go Releases 页面查看最新版本。这里以 v6.0.0 为例(请根据实际情况替换版本号):
bash# 创建并进入安装目录mkdir -p /opt/ddns-go && cd /opt/ddns-go# 下载对应架构的包wget https://github.com/jeessy2/ddns-go/releases/download/v6.0.0/ddns-go_6.0.0_linux_x86_64.tar.gz# 解压文件tar -zxvf ddns-go_6.0.0_linux_x86_64.tar.gz
- 安装为系统服务:ddns-go 提供了自带的服务安装命令,非常方便:
bash# 安装并启动服务sudo ./ddns-go -s install
- 其他常用管理命令:
- 卸载服务:sudo ./ddns-go -s uninstall
- 启动服务:sudo systemctl start ddns-go
- 停止服务:sudo systemctl stop ddns-go
安装成功后, ddns-go 都会默认在后台监听 9876 端口。如果你的 Ubuntu 开启了防火墙,需要允许 9876 端口通行:
bashsudo ufw allow 9876/tcp
这之后进入 Web 界面配置,打开浏览器,访问对应服务器的9876 端口,在 web 界面中选择DNS 服务商(我使用的是 Vercel),填写对应的 Token/Secret Key。后,在 IPv6 的 Domains 栏输入你的域名,点击保存,右上角会立刻显示解析日志,提示是否解析成功。
使用 FRP 转发云服务器公网 ipv4 流量到内网服务器
ipv6 虽好,能轻易让家庭服务器达到远远大于低价 VPS 的上行带宽,但问题在于覆盖不全。许多网络环境下,ipv6 通信仍然不受支持。经过我的实践,尽管中国移动蜂窝网络大多都支持,但例如我在单位使用的电信的宽带也好,还有许多国内外的云服务器也罢,都不支持访问 ipv6 地址。这就意味着,如果域名只解析 ipv6 地址,部署服务后,访问会非常受限,不仅是没法作为生产环境供一般用户使用,就算只是自己个人使用,也非常不便,没太大意思。
所以还是得支持 ipv4。但由于公网 ipv4 地址是不可得的,这样就必然需要第三方服务器做中转实现内网穿透,带宽就很受限,这就是为什么虽然 ipv6 不能全覆盖,我也要解析的原因。
听说 cloudflare 虽然好用,但由于服务器在国外,会比较慢,于是我选择了使用国内云服务器安装 FRP 来做内网穿透。建立隧道,将端口映射到公网云服务器的端口。
FRP(Fast Reverse Proxy)是一个反向代理内网穿透程序。其远离是:
- 内网 frpc 主动连接公网 frps,注册本地服务;
- 外网用户访问云服务器公网地址 / 端口;
- frps 通过已建立的隧道,把请求转发到内网设备,实现双向通信。
安装部署过程解决国内网络环境问题。
配置、使用过程中,安装 ddns-go 、拉取 docker 镜像等过程,国内都会遇到网络访问障碍。可参考 为服务器配置科学上网 这篇教程,通过安装 Mihomo ,来解决网络环境问题。
查看所有监听端口
ss -tulnp
释义
-t:TCP 端口
-u:UDP 端口
-l:仅监听状态
-n:数字格式(不解析域名/端口名)
-p:显示对应进程
ubuntu 防火墙开放端口1. 查看防火墙状态```bashsudo ufw status
没启用会显示 inactive。
- 启用防火墙(如未启用)
bashsudo ufw enable
注意:远程服务器先放行 ssh(22 端口)再 enable,否则可能断连。
- 开放一段端口(示例:7000–10000)
-
只放 TCP:
bashsudo ufw allow 7000:10000/tcp -
TCP+UDP 都放:
bashsudo ufw allow 7000:10000
- 只允许特定 IP 访问这段端口(更安全)
bashsudo ufw allow from 192.168.1.0/24 to any port 7000:10000
- 删除这条规则(不用时)
bash# 按编号删(推荐)sudo ufw delete 编号# 或直接删规则sudo ufw delete allow 7000:10000/tcp
- 下载软件包需要知道自己 CPU 的CPU 架构,Linux 命令:
uname -m
x86_64:64位 x86 架构(主流电脑/服务器)i686/i386:32位 x86aarch64/arm64:ARM64(树莓派、国产ARM服务器、手机类)armv7l:32位 ARMriscv64:RISC-V 架构
或者使用 lscpu查看详细硬件信息:
重点看这两行:
Architecture: # 架构(x86_64 / aarch64 等)CPU op-mode(s): # 支持32/64位模式
sudo ufw status
- sudo vi /etc/nginx/sites-available/umami 为什么我加了这个配置文件但不生效 ,还要 nginx
sudo ln -s /etc/nginx/sites-available/umami /etc/nginx/sites-enabled/查看所有监听端口ss -tulpn
[^1] windows 默认不启用 telnet 功能,可使用 PowerShell 管理员执行 dism /online /Enable-Feature /FeatureName:TelnetClient 开启

