搭建家庭服务器

背景

有如下需求:

  1. 记录小孩生活状态的视频和照片(视频容量大,数量多)
  2. 不想存云盘,因为既要额外花钱又存在隐私问题
  3. 外网可访问(带权限管理),缓解两边老人对孙子的相思之苦

已知条件有:

  1. 丐版的 m1 的 macmini
  2. 4T 的硬盘

正文

第 1、2 点需求搭一个家庭服务器即可,可以是媒体服务器,也可以直接 NAS 。我不想把阵仗搞大了,一个媒体服务器足够了。

对比了半天最后选择了 jellyfin ,不过本文不打算记录 jellyfin 的搭建、配置和使用,这些网上都有。我这里就记一下是如何解决第 3 点需求的。

运营商

我家用的是号称千兆带宽的电信网络 ,为了让脑洞天花板更高,早些时候就已经让电信那边把家里的网络改成桥接模式了。这次我从自家的路由器上看到 wan ip 依然是一个内网 ip,我就知道所谓的千兆带宽其实是共享的,家里的设备至少经过了两层 NAT 了。

不过这个也不能怪运营商,ipv4 确实比较紧缺。打了个 10000 咨询了下如何搞个公网的 ipv4 ,被告知加钱就能解决。

目前我家是 259 的套餐,要拥有公网 ip 的话,需要升级到 299 的套餐,最后再额外花费 100 选购一个公网 ip 服务。也就是说要从每月 259 加价到每月 399。

不过电信的一个技术小哥给我提供了另一个重要的信息: 公网的 ipv6 是免费的

我在路由器上开启了 ipv6 功能,自己上机器用 ifconfig 看了下,确实直接就能拿到公网的 ipv6 ,不过这个 ipv6 经过我测试发现每次机器重启都会不一样,所以这是一个动态的公网 ipv6 。如果不能固定的话,每次机子重启,网站就会失效了。对此也有解决办法,接一个 ddns 服务应该就可以解决,了吧?

ddns

首先想到的就是 noip.com ,上去注册了帐户,挑了个好记的域名,然后一通操作后发现它居然不能设置 AAAA 记录!?这么大一个网站居然不支持 ipv6 ……

然后是 dyndns.com ,它倒是支持 ipv6 ,但它的问题是其 client 端识别不出本机的 ipv6 地址…… ifconfig 都不会使吗?

最后实在不行,颇不情愿的去注册了个国内的花生壳,最后到了设置那步才发现就我这点蚊子大的需求居然也要收费,而且是按流量收费的,行吧,白上传一波他人的实名认证,他认倒霉

自己动手,丰衣足食

第三方服务都不大靠谱,那就自己手动实现一个简易的 ddns 吧。

流程测试

先测下流程能否跑通,我把子域名 media.specer.org 的 AAAA 记录设为本机的 ipv6,结果死活不通,本机 tcpdump 抓包一个都没有,感觉在 cloudflare 那层就已经失败了。

本以为这工程理论上就不行的时候,抱着试一试的态度,直接把我的另一个托管到 godaddy 的闲置域名的主域名的 AAAA 记录设为本机时,发现又可以了。不太清楚为啥子域名不行而主域名就可以,反正理论已经可行,下面就开干吧

服务配置

本来打算让 jellyfin 使用 80 端口的。后来才知道 macos 禁止使用 1024 以下的端口,除非使用 root 权限或做一次端口映射。我不想把事情搞复杂了,选择了做端口映射,参考了 网上的文章 后,以失败告终。

不知道是什么原因,很是奇怪,我抓包抓 80 端口确实有数据,但是抓 8096 (jellyfin 的默认端口)就是没数据

折腾一下午,一无所获,最后一咬牙一跺脚,直接用 root 权限启动 jellyfin ,最后发现屁事没有,非常顺利,外网直接就可以访问本机 jellyfin

手动更新 AAAA

现在就需要写个开机自启动的脚本来把最新的 ipv6 更新到 DNS 上去。为了温习下旧技能,这次就用 go 简单写了个脚本,先获取本机 ipv6 地址,然后调用 godaddy 的 openapi 更新 AAAA 记录,最后设置成开机启动。一切顺利,测试也 OK

结尾

由于一些老的路由器还不支持 ipv6 ,所以我爸妈家的 wifi 依然无法访问本机服务器,但是开流量就行,因为现在的手机默认都是支持 ipv6 的。先这样凑合用吧,下次回老家再给他们弄个新的路由器。