如何利用 IPv6 免费把家里电脑变成服务器

以下为文字版:

简介

今天给大家分享的是如何利用 IPv6 免费把家里面的电脑变为服务器。我们家里电脑与服务器最大的区别就是服务器有一个公网 IP,可以公网访问其服务,当我们给家里面电脑用上 IPv6 公网 IP 时,使家里面电脑运行的服务,可以被公网访问,那它就可以当服务器用。

先说一下,家里面电脑做服务器不太适合的场景:

  1. 搭建网站,因为现在像 GithHub Pages、Cloudflare Pages 和 Vercel,它们都提供托管网站的功能,并且免费稳定,是完全没有必要用家里面的电脑做服务器来搭建网站的。我的网站 https://depp.wang 就是托管的 GitHub 的 Pages 上的
  2. 如果你是想远程控制家里面的电脑,也没有必要通过这种方式,我更建议你用 Tailscale 实现,再使用屏幕共享的方式去控制,使用这种方式的话,你可以完全关闭你的防火墙,会更安全。当然,如果你家里有 IPv6 公网 IP 就更好了,你可以直接让 Tailscale 建立这种点对点直连,延迟更低,体验更好。

那哪些场景可以用呢?我举 2 个例子:

  1. 比如你经常有远程控制家里面的电脑的需求,但又不方便使用 Tailscale 的时候
  2. 比如你需要一台云服务器接口联调,比如说我跟微信公众平台做接口联调。这种情况用自己的电脑性能会更好,也会更方便

这些场景就比较适合把家里面的电脑当服务器来用,其它的场景你可以探索一下,可玩度还是挺高的。

前置要求

如果你想把家里面的电脑当服务器来用的话,还是有一点前置要求的。

1、IPv6 公网 IP

首先,需要你有一个公网 IP,现在 IPv4 公网 IP 都需要收费,但如果你的宽带是电信的话,你可以免费获得 IPv6 公网 IP,电信宽带都有 IPv6 公网 IP,只是默认关闭了,只要你的路由器支持 IPv6,只要在路由器上面设置开启一下就行。移动和联通宽带我因为没有用过,不确定,你可以问下客服,应该是已经支持了的。

2、防火墙可配置

其次,因为你需要对外提供服务,所以你就需要防火墙配置指定 IP 可被公网访问,而光猫防火墙默认是关闭了的,我们是配置不了光猫的防火墙的,所以我们只让光猫做光信号转电信号,而不使用其拨号,这样它就没有防火墙。像有的路由器,它是支持防火墙配置的,比如华硕的一些路由器,但大多数路由器都不支持,所以如果你的路由器不支持的话,要想配置防火墙,你要么就换个路由器,要么就买个软路由,要么给你让路由器刷个 OpenWRT 系统,但给路由器刷这个 OpenWRT 系统,也是需要路由器满足一定要求的。我用的小米路由器,我没有刷这个 OpenWRT 系统,我买了个软路由,软路由是电犀牛的 R68s,我用了几个月了,使用下来还是比较稳定,我个人还是比较推荐的。

因为主题原因,这里我就展开如何开启 IPv6 和折腾软路由了,可以先网上搜索一下。后面我会专门出一期教程来专门讲这个。

所以前置要求也可以说是需要你宽带支持 IPv6,你路由器支持 IPv6,你路由器防火墙可配置(或者你有一个软路由)。

PS:关于光猫防火墙的说明。我使用 admin 用户的账号密码登录我的光猫后台(admin 密码找宽带师傅要),发现我光猫的防火墙无法关闭,防火墙也无法配置,你可以登录你的光猫后台看一下是否可以配置防火墙。即使可以配置防火墙,也还面临着公网 IP 变化需手动修改配置的问题,而使用光猫确实是没有使用软路由方便的。

3、域名 / Cloudflare(可选)

我们还可以进一步通过在 Cloudflare 上设置域名解析实现域名访问。如果你只想通过 IP +端口的方式访问的话,当然也就不需要域名了,也不需要使用 Cloudflare 了,所以域名与 Cloudflare 是可选的。注意,使用 IPv6 公网 IP + 端口访问的话,你访问网络也是需要支持 IPv6 的,现在手机网络默认就有 IPv6,如果使用电脑接的网络不支持 IPv6 访问,可以连接手机热点。使用这种方式,我强烈建议你要开启来源 IP 白名单配置,因为如果你的公网 IP 泄露的话,可能会被 DDoS 攻击,虽然我们用的软路由或者是路由器它有一定的 DDoS 防护,但也不能应对大规模的攻击,可能会被打穿。如果你不方配着来源 IP 白名单的话,那我就强烈建议你要用域名的方式访问,因为用域名的话,我们用 Cloudflare,可以使用它的 DDoS 防护,这样就更安全。

现在域名也比较便宜,几块钱你就能买一年,Cloudflare 也是可以免费注册使用的。域名的话,你也可以在这个Cloudflare 上面购买,因为它的价格基本上是最低的,也没有一些第一年便宜第二年贵的套路。

当然,使用 Cloudflare 实现域名访问,其实也还是有一个缺点,因为它是国外公司的产品,在国内访问托管在上面的域名的时候,可能不是很稳定,所以可能有的同学访问就会比较慢。

配置步骤

配置 IP + 端口访问

获取电脑 IPv6 公网 IP

首先需要获取一下电脑的 IPv6 公网 IP,我们可以通过这个命令来获取自己的电脑的 IPv6 公网 IP,这个 240C::6666 是一个 IPv6 公共 DNS 地址。

240 开头就是公网 IP,红色就是我的 IPv6 公网 IP。

防火墙配置只有电脑 IP 可外网访问

获得了 IPv6 公网 IP,我们还需要在我们防火墙里面配置指定 IP 可被公网访问,我在 iStoreOS 系统中配置,在「网络-防火墙-数据规则」里面配置我添加一条规则,配置我电脑的 IP 和端口 9090 可被公网访问,保存并应用。

让启动的应用服务可通过 IPv6 访问

我们有 IPv6 公网 IP,配置了防火墙,但此时应用服务也需要支持 IPv6 访问才行,我使用一个简单 Flask 项目来举例说明,下面创建一个简单的 Flask 项目,使其启动后可通过 http://[ipv6]:9090 来访问。

创建 Flask 项目:

mkdir flask-demo
cd flask-demo
python3 -m venv venv
. venv/bin/activate
pip3 install flask
vi app.py

app.py 代码:

#app.py
from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def index():
return 'Hello World!'

if __name__ == '__main__':
app.run(host='::', port=9090)

启动:

python app.py

启动结果:

我使用 telnet 命令和网页访问测试一下,我利用 Tailscale 使用屏幕共享控制另一台电脑测试,这台电脑是连的热点,所以是支持 IPv6 访问。

结果显示 telnet 与网页访问都没有问题。如果只想通过这种方式访问家里电脑的服务的话,那后面就不用看了。

配置域名访问

Cloudflare DNS 配置实现可域名 + 端口访问

可以通过 Cloudflare 配置域名解析实现可域名访问,因为现在的 80 和443 端口是被运营商封禁了的,你不能直接使用 80 与 443 端口。先配置实现域名 + 指定端口访问。

在 Cloudflare DNS 中配置 DNS 解析:

DNS 解析可通过 DNS Checker 来检测是否已生效,再用另一台电脑通过 ping6 来测试是否已生效,注意是 ping6 不是 ping,我就在这里踩坑了,一直用 ping,结果不通,以为 DNS 解析有什么问题,浪费不少时间。以下代表 ping 通了。

网页访问也没有问题:

目前就可以通过域名 + 端口访问了。

Cloudflare 配置实现不要端口直接域名访问

前面说这个 80 和 443 端口被运营商封禁了,但我们可以使用 Cloudflare 实现免端口访问。Cloudflare 可以通过配置端口转发的方式实现不要端口直接访问,相当于把 80/443 端口转发到指定端口。

首先,我们需要在 「规则 - Origin Rules」里面创建一个自定义规则。配置当访问二级域名 wx.depp.wang 时,请求转发到 9090 端口:

第二,在 DNS 解析这里打开这个代理状态:

我解释一下,为什么要打开,打开后,我们在访问域名的时候,它会先解析到 Cloudflare 的主机上,Cloudflare 在那个主机上面给做一个代理转发,转发到我们配置的公网 IP 和端口对应的服务上。这样就实现了直接域名访问。

DNS Checker 检测已生效后,通过 ping6 与网页测试。

都没有问题,说明我们配置成功。

解决 IPv6 公网 IP 变化问题

1、使用 DDNS 更新 DNS 解析的公网 IP

因为公网 IP 可能随着网络的变化而变化,根据你自己的 IP 变化的情况,你可以自己判断要不要使用 DDNS,它可以动态的把你的公网 IP 更新到 Cloudflare 的 DNS 上去,这样你不用自己手动更新 IP,如果你用的话,我推荐使用 ddns-go,如果使用 macOS,可以用 brew 安装,配置教程可以参考这篇文章

2、使用定时任务执行脚本更新防火墙配置的公网 IP

我写一个脚本 update-ipv6.sh,利用 crontab 定时执行脚本,脚本内容为先获取 IPv6 地址,再 SSH 登陆到 iStoreOS 中更新防火墙配置的公网 IP。iStoreOS 基于 OpenWRT,脚本应该也适用于 OpenWRT。

1、update-ipv6.sh 脚本,脚本内容根据你自己的情况来调整

#!/bin/bash
LOG_FILE=./cronjob.log
echo "Task started at: $(date)" >> $LOG_FILE

output=$(/sbin/ping6 -c 1 240C::6666)
ipv6=$(echo "$output" | grep -oE '([0-9a-f:]{1,4})+ --> ' | cut -d" " -f1)

echo "IPv6: $ipv6" >> $LOG_FILE

ssh -i ~/.ssh/id_rsa_own [email protected] <<EOF
uci set firewall.@rule[your rule number].dest_ip="$ipv6"
uci commit firewall
EOF

echo "END --------------- " >> $LOG_FILE

2、配置 crontab 定时执行脚本

# 查看规则配置
crontab -e

# 规则配置示例,`*/5 * * *` 代表每 5 分钟执行一下。根据自己需求调整
*/5 * * * * sh /Users/depp/update-ipv6.sh
  • 脚本需要位于当前用户下,不然可能无法执行

3、iStoreOS 中设置 SSH 登录

将公钥加到 iStoreOS 的 authorized_keys

ssh [email protected] 'cat >> /etc/dropbear/authorized_keys' < ~/.ssh/id_rsa.pub

iStore 命令行常用查看与修改防火墙命令:

# 查看所有防火墙配置
uci show firewall

# 查看指定名称的所有防火墙配置,示例:uci show firewall | grep "name='test'"
uci show firewall | grep "name='your rule name'"

# 修改第指定个规则 的 ip,示例:uci set firewall.@rule[10].dest_ip='240e:330:2d10:3704:842d:e5d6:da9:1c02'
uci set firewall.@rule[your rule number].dest_ip='new ip'

# 提交保存防火墙规则
uci commit firewall

评论默认使用 ,你也可以切换到 来留言。