只花不到 150 元,部署一套可能是最佳体验的家庭网络系统

53 天前
 mouyase

原文地址: https://yojigen.tech/30.html

前言

哪个男孩不想要一个可以自由驰骋互联网的网络呢?

关于家中的互联网建设这一块,已经不知道有多少博主聊过,自己也是来来回回折腾了很多种方案。

最近终于找到了我直到目前为止我认为可能是最完美的方案——PaoPaoDNS+PaoPaoGateWay 。然后就在自己家的软路由系统里部署了起来,目前也是稳定用了一个月感觉非常的舒适。

但是我家里面用的是软路由+虚拟机的方案,本身全套机器下载价格要 400 元左右了,而且机器也是做了一点点硬改,没有改机能力的人恐怕用起来也会比较麻烦。

于是我就在想,能不能用比较便宜的方案,和较低的功耗,用一些市面上常见的设备来实现这一套方案呢?

最终预期的结果

在尽可能保证正常网络不会受到影响的情况下,实现网内透明代理,以用于科学上网。

附赠功能: 去广告,虚拟局域网组网等

设备选择和采购

于是经过我的思考,最后做出了如下的设备方案:

以上设备各位读者可以根据自身的经济条件和现有的设备来决定如何选择,比如全放进虚拟机里之类。而我这次选择的设备是下面这几个。

硬路由-JCG Q30 Pro: 59 元

这个价格不算特别的大众,这是一台天线坏掉的机器,而我的家里面因为还有三个其他的无线路由器当做 AP 使用,所以我不需要无线网络功能。

这台机器的芯片是联发科的 mt7981 ,内存是 256m(也有 512m 的版本),性能较好,可以轻松跑满千兆。而且这款机器还是被 OpenWRT 和 immortalwrt 官方支持的型号,可以直接刷主线版的固件,这样也可以避免一些网上所谓的“大神”编译的固件中的各种坑。

机器怎么刷机我这里就不说了,网上有一些现成的资料,在这里说会导致教程太过于复杂,而且也许你的设备也不需要刷机,对吧。

其实我个人目前比较推荐的机器是爱快 IK-Q3000 ,不用刷机就能享受官方的爱快的系统固件,机身自己支持 AX3000 ,如果没有其他无线组网,一台机器就能解决大部分人家中的路由和 WiFI 了。现在这个机器京东售价 159 ,同样所谓 mt7981 芯片的机器,他也就比别的机器贵了 20-30 。30 块钱买个免刷机带售后的爱快系统我觉得还是挺香的。(不过不清楚这台机器有没有硬件转发,如果没有的话还是不要用了)

ARM 主机-玩客云: 28 元

玩客云算是我们垃圾佬应该非常熟悉的一个东西了,他本身是一个拿来做 PCDN 的所谓的“挖矿”设备,后续随着 PCDN 的收益越来越低,运营商对 PCDN 的打击等等原因,现在网上有着大量的机器在流通。而且由于存世量多,玩的人也多,这机器在价格便宜的同时,机器的玩法也开发的比较全面,很多系统都能刷入进去。

我们这里选择给它刷入 Armbian ,以用来部署 Docker 容器,刷机方法大家也可以参考网络资料。

X86 小主机-中兴 CT321G2: 本人购入 79 元,咸鱼现价 50 元

这个小机器是之前无意中发现的,机身外壳的做工还不错,虽然是塑料但是很厚实。这个机器由于只有一个千兆网口,不好做软路由,且只有一个无法更换 4g 硬盘,所以对于垃圾佬来说,可玩性就有点差了,导致价格一直不高。但是这台机器的 CPU 是小主机里面不太常见的 AMD GX-218GL ,这块 CPU 性能和 J1900 差不太多,功耗也都是在 10w 左右,但是他有一个 J1900 没有的优势: 支持 AES 硬解。

大家都知道 AES 硬解意味着什么,加上小尺寸,低功耗,所以这台机器非常适合拿来做我们的网关机。

注意: 这个机器只有 VGA 输出,需要你准备支持 VGA 的显示器和线,或者转换线。

系统搭建

主网络

首先要保证你的网络是正常的,你需要了解如何使用你的路由器正确的设置上网功能。 我这里以最常见的网络地址作为演示,你可以根据你的需求来设置自己的网段。

路由器 IP: 192.168.1.1
DHCP 范围: 192.168.1.101-192.168.1.200
局域网段: 192.168.1.0/24
子网掩码: 255.255.255.0
网关机 IP: 192.168.1.2
Docker 容器机 IP: 192.168.1.3

网关机

首先要准备一下 PaoPaoGateWay 的系统镜像,由于是在物理机运行,所以需要全网卡驱动的支持。官方 Github 上的镜像是默认不带全网卡驱动的,需要我们用官方的 docker 来定制一下 ios 镜像。 定制方式非常简单,随便找一台 x86 的装有 docker 的机器(官方容器不支持 arm),运行下面两条命令,就能在当前目录获得一个具有全部网卡的 ios 镜像了。

docker pull sliamb/ppgwiso:fullmod
docker run --rm -v .:/data sliamb/ppgwiso:fullmod

如果你不方便定制,也可以下载我定制好的镜像文件(记得解压)。

paopao-gateway-x86-64-custom-364b136.zip

准备一个写磁盘的工具,Rufus 、balenaEtcher 、UltraISO 之类的都可以,我这里使用 Rufus 。 准备一个 U 盘,将镜像文件写入到 U 盘里。

然后将 U 盘插入 x86 小主机,在 Bios 里设置为从 U 盘启动系统,通电自动启动系统,最后用网线将网口和路由器的 Lan 口进行连接。

这样网关机这里就算设置完成了。

注:

Docker 机

首先搭建好 Docker 环境,这里根据不同的设备和系统会有不同的方法,请根据网络上的教程自行操作。

创建目录 DNS ,并且在其中创建docker-compose.yaml文件,用于配置容器。

docker-compose.yaml文件内容参考如下。

services:
  paopaodns_china:
    image: sliamb/paopaodns:latest
    container_name: PaoPaoDNS-China
    restart: always
    volumes:
      - ./PaoPaoDNS-China:/data
    networks:
      dns:
        ipv4_address: 172.30.1.10 # IP 地址为 Docker 内网分配地址,用于内网访问
    environment:
      - TZ=Asia/Shanghai
      - UPDATE=weekly
      - DNS_SERVERNAME=PaoPaoDNS-China
      - DNSPORT=53
      - CNAUTO=no

  paopaodns _global:
    image: sliamb/paopaodns:latest
    container_name: PaoPaoDNS-Global
    restart: always
    volumes:
      - ./PaoPaoDNS-Global:/data
    networks:
      dns:
        ipu4_address: 172.30.1.20 # IP 地址为 Docker 内网分配地址,用于内网访问
    environment:
      - TZ=Asia/Shanghai
      - UPDATE=weekly
      - DNS_SERVERNAME=PaoPaoDNS-Global
      - DNSPORT=53
      - CNAUTO=yes
      - CNFALL=yes
      - CN_TRACKER=yes
      - USE_HOSTS=no
      - IPU6=no
      - SOCKS5=192.168.1.2:1080 # IP 地址为网关机的 IP 地址
      - SERVER_IP=192.168.1.3 # IP 地址为本台宿主机的 IP 地址
      - CUSTOM_FORWARD=192.168.1.2:53 # IP 地址为网关机的 IP 地址
      - AUTO_FORWARD=yes
      - AUTO_FORWARD_CHECK=yes
      - USE_MARK_DATA=yes
      - HTTP_FILE=yes
    ports:
      - "5304:5304/udp"
      - "5304:5304/tcp"
      - "7889:7889/tcp"

  adguard_home:
    image: adguard/adguardhome:latest
    container_name: AdGuardHome
    restart: always
    depends_on:
    - paopaodns_china
    - paopaodns_global
    volumes:
    - ./AdGuardHome:/opt/adguardhome/work
    - ./AdGuardHome:/opt/adguardhome/conf
    networks:
      dns:
        ipv4_address: 172.30.1.2 # IP 地址为 Docker 内网分配地址,用于内网访问
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "53:53/udp"
      - "53:53/tcp"
      - "80:80/tcp" # 如果不是使用 80 端口作为网页端口则需要添加对应的端口映射
      - "3000:3000/tcp" # 安装成功后可以删除

networks:
  dns:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.30.1.0/24
          gateway: 172.30.1.1

解释一下这个配置文件。

这个配置文件定义了三个容器。

两个 PaoPaoDNS ,用来作为 AdguardHome 的上游 DNS ,其中一个容器没有做特殊的配置,仅当做本地递归 DNS 服务器使用。而另一台则添加了分流相关的设置,用于对需要出国的设备进行 DNS 分流处理。

AdguardHome ,用于提供本地 DNS 服务,给不同的客户端配置不同的上游 DNS ,以及去广告(虽然是他的本职,但是这里反而成了附赠的功能了)。

注: 爱快官方之前在论坛中提到,系统更新到 3.7.12 后,DHCP 设置将支持对不同的客户端配置不同的 DNS ,所以用爱快系统的可以根据需求不使用 AdguardHome 。

接下来启动容器。

docker compose up -d

容器正常启动后,则可以使用本机 IP:3000访问 AdguardHome 的安装页面了,设置一下用户名和密码,以及 WebUI 的端口(建议 80)即可。

网络配置

因为我文章里是使用的 OpenWRT 作为路由系统,所以这里也是用 OpenWRT 来演示。

启动网关机和 Docker 容器机,让他们的信息出现在你的路由器里面。

首先要固定一下 IP 。

打开 网络→DHCP/DNS→静态地址分配,将网关机的 IP 固定为192.168.1.2,将 Docker 机的 IP 固定为192.168.1.3

然后将 DHCP 默认的 DNS 设置为192.168.1.3(如果需要输入两个地址就都填一样的)。

接下来要设置网内设备的 DNS 。

打开 网络→接口→lan→DHCP 服务器→高级设置,在 DHCP 选项中添加。

6,192.168.1.3

这个值就是你的 Docker 机的 IP 。

然后重启一下网关机和 Docker 机,让他们可以获取到新的 IP 和 DNS 。

接下来网页打开 AdguardHome 的后台http://192.168.1.3,在 DNS 设置中,将上游 DNS 设置为172.30.1.10,并且关闭缓存。

这时我们可以试一下我们的 DNS 能否正常使用。

nslookup whoami.03k.org 192.168.1.3
服务器:  Unknown
Address:  192.168.1.3

非权威应答:
名称:    whoami.03k.org
Address:  123.234.123.234 #连接权威 DNS 服务器的 IP=你的宽带 IP

返回的地址如果是你的公网 IP 网段,就说明递归 DNS 已经生效了。

接下来是设置静态路由,我们回到 OpenWRT 的界面。

打开 网络→路由→静态 IPv4 路由,添加一条新的静态路由,类型unicast,目标11.0.0.0/8,网关192.168.1.2

最后要屏蔽掉对 FakeIP 的 NAT 。

打开 网络→防火墙→通信规则,添加一条新的规则,源区域为lan,目标区域为wan,目标地址为11.0.0.0/8,操作为丢弃

注:

如果有使用一些纯靠 IP 访问的软件(例如网飞、Telegram),还需要把他们的 IP 端也设置相同的静态路由和通信规则中,比较长这里我就不写了,有需求的可以自行添加。

到这里网络路由相关内容设置完毕。

网关配置

网关配置文件在 Docker 机器的DNS/PaoPaoDNS-Global目录中的ppgw.ini

#paopao-gateway

# mode=socks5|ovpn|yaml|suburl|free
# default: free
# free: 直接出站不走代理
# socks5: 使用 socks5 代理出站
# ovpn: 使用 ovpn 代理出站
# yaml: 使用 yaml 配置文件,yaml 配置文件在同目录下,文件名参考下面的 yamlfile
# suburl: 使用订阅地址,最常见的应该就是这种了
mode=suburl

# Set fakeip's CIDR here
# default: fake_cidr=7.0.0.0/8
# FakeIP 的网段,如果要修改,请修改成看似是外网的空 IP 网段
fake_cidr=11.0.0.0/8

# Set your trusted DNS here
# default: dns_ip=1.0.0.1
# 这里需要和 Docker 机,也就是 DNS 的 IP 匹配
dns_ip=192.168.1.3
# default: dns_port=53
# If used with PaoPaoDNS, you can set the 5304 port
# 这是网关获取配置的端口,如果没有修改过端口映射,请使用默认值
dns_port=5304

# Clash's web dashboard
# 这是网页管理面板的端口和密码
clash_web_port="80"
clash_web_password="clashpass"

# default:openport=no
# socks+http mixed 1080
openport=no

# default: udp_enable=no
udp_enable=no

# default:30
sleeptime=30

# socks5 mode settting
# default: socks5_ip=gatewayIP
# 这里需要填入网关 IP ,用于开启局域网内的 socks5 代理
socks5_ip="192.168.1.2"
# default: socks5_port="7890"
socks5_port="7890"

# ovpn mode settting
# The ovpn file in the same directory as the ppgw.ini.
# default: ovpnfile=custom.ovpn
ovpnfile="custom.ovpn"
ovpn_username=""
ovpn_password=""

# yaml mode settting
# The yaml file in the same directory as the ppgw.ini.
# default: yamlfile=custom.yaml
# 这里是 yaml 模式时,网关获取的配置文件的文件名
yamlfile="custom.yaml"

# suburl mode settting
# 这里填入你的订阅地址
suburl="https://..."
# 这里是订阅自动更新时间
subtime=1d

# fast_node=check/yes/no
# check: 代表会自动检查下面的 URL 能否访问,如果不能访问则自动重启服务并重新拉取订阅
# yes: 代表会自动根据延迟切换到延迟最低的节点,同时具有 check 的功能
# no: 代表不检查延迟与连通性
fast_node=yes
test_node_url="https://www.youtube.com/generate_204"
ext_node="Traffic|Expire| GB|Days|Date"
cpudelay="3000"

# dns burn setting
# depend on fast_node=yes & mode=suburl/yaml
dns_burn=no
# If used with PaoPaoDNS, you can set the PaoPaoDNS:53
# 这里需要设置成 DNS 的 IP
ex_dns="192.168.1.3:53"

# Network traffic records
net_rec=no
max_rec=5000

更详细的参数解释,以及自定义规则等等,请参考官方的文档,如果没有特殊需求,按本文的配置即可。

配置设备 DNS

我的教程中的方案,是建立在网内只有一部分设备出国,另一部分正常用网的场景,所以需要针对不同的设备,设置不同的上游 DNS 服务器。

如果你没有这种需求,可以直接在网络配置那一步中,将上游 DNS 设置为172.30.1.20,就不用继续往下看了。

如果你也像我一样,只需要部分的设备走出国规则,那就还需要在多一步设置。

打开 AdguardHome 的后台http://192.168.1.3

打开客户端设置,添加客户端。

添加需要出国的设备的 IP 或者 IP 段,然后在下面的自定义上游的地方,将上游 DNS 设置为172.30.1.20,然后保存即可。

至此系统全部搭建完毕。

测试

可以使用 Speedtest ,分别选择国内和国外的测速节点,看一下带宽能否跑满。

可以在https://ip111.cn或者https://ip.skk.moe检查一下 IP 分流是否正常。

可以用 NatTypeTester 检查一下 Nat 等级。

总结

整套设备花费是 59+28+50=137 元,这里是没有计算 U 盘和交换机的价格。

U 盘作为一个搞机佬,我相信各位家里一定会有的,而交换机要看自己网内具体有多少需要网线的设备,所以我就没有算在内。

这里面路由器的价格可能会有一些上下波动,比如你需要一款可以跑满千兆的路由器,又不想刷机,所以可能买了我推荐的爱快 Q3000 ,那价格就一下多了 100 元了,但是你买了更好的路由器就算不玩这套系统,那也可以让网络体验变好,也是不亏。而如果你家的网络没有达到千兆,比如只有 500M 甚至 100M ,那你大可买一些 mt7621 的路由器,刷个 OP 或者爱快的固件,这种路由器咸鱼 50 以内可以随便买。

希望这篇文章可以帮助到一直想要一套舒适的网络的你。

9408 次点击
所在节点    宽带症候群
98 条回复
mouyase
52 天前
@niaohongC 其实没有啥技术含量,PaoPao 系列是其他大佬的开源项目,我只是针对家里的环境踩了一点点坑选了几个比较划算的设备部署了一套方案而已。
xuhengjs
52 天前
这种只能对应 dns 污染,ip 被封的还是没戏
mouyase
52 天前
@xuhengjs
P 被封谁都没戏,但是这套方案可以让你 IP 被封的时候,国内&不走代理的设备完全不受影响。

应该不存在代理 IP 被封还能流畅上网的方案存在吧。
cuicuiv5
52 天前
还是加点钱 all in boom 吧
iamwin
52 天前
整个一套搞那么复杂,还用 fakeip 来污染 dns 解析,透明代理你可以在网关设备的防火墙里面配置
openvpn 、wireguard 和其他你也可以直接在网关设备部署,AdguardHome 这东西你也可以直接在网关设备部署

完成你这些需求其实只需要一台物理设备,完全不需要 3 台设备和配置多个半虚拟机,你搞那么复杂,没太大的意义,徒增故障点
mouyase
52 天前
@iamwin

> 整个一套搞那么复杂,还用 fakeip 来污染 dns 解析,透明代理你可以在网关设备的防火墙里面配置
openvpn 、wireguard 和其他你也可以直接在网关设备部署,AdguardHome 这东西你也可以直接在网关设备部署

不知道你是否经历过一炸全炸的情况,在我这套配置里,OpenWRT 是完全作为一台普通的路由&网关设备存在的。旁路网关因为各种原因(IP 被封,程序故障)炸掉,是不会影响到国内网络访问的。

> 完成你这些需求其实只需要一台物理设备,完全不需要 3 台设备和配置多个半虚拟机,你搞那么复杂,没太大的意义,徒增故障点

我在文章里写了,设备可以根据你自己的情况选,你要是有服务器就开虚拟机咯。只不过我认为 150 元以内不存在可以满足这一切的服务器设备。150 元以内的软路由都很难跑满千兆网络。
iamwin
52 天前
@mouyase 我说的意思是你不仅不需要多台设备,也不需要任何虚拟机包括 docker 这种半虚拟机
你只需要一台 4567 代 i3i5 的电脑就能轻松跑满千兆,这种烂电脑几百块左右的多得是,很多人还有现成的老笔记本老办公机,为了压那一点点的成本去把整个网络配置搞复杂得不偿失
lower
52 天前
二手极路由,30 块钱,我觉得用起来很好😀
suisetai
52 天前
@xiaoke 问下 ros 实现复杂吗
mouyase
52 天前
@iamwin

> 我说的意思是你不仅不需要多台设备,也不需要任何虚拟机包括 docker 这种半虚拟机

如果想要部署递归 DNS 用于抗污染,那一定需要启动一个本地的 DNS 服务,那这个服务不用 Docker ,难道是直接部署在物理机上吗?部署难度和维护难度不考虑一下吗?

其次,如果想要做国内外网络分流,并且国外网络故障时,不影响国内网络,那一定需要两个网关。

市面上的单设备透明代理全部是靠修改路由表+全部流量转发到代理工具然后再用代理工具的分流方案。

这种方案一会导致代理挂掉国内网络也无法访问,二会导致全部流量多一层 NAT ,三还会导致和一些游戏加速器有冲突。

就是为了要避免上面的几个问题,所以最后才会出现两个网关一个 Docker 这样的部署形式。

形式是为了达成目的,如果你没有这些目的那自然也不需要这么复杂的形式。
mouyase
52 天前
@lower 根据我折腾网络这么多年的经验来说,极路由没办法实现这些东西。硬要说极路由应该连千兆带宽都很难跑满。
lower
52 天前
@mouyase 肯定是不行的,root 后能装 clash 基本满足我的需求了,其他肯定是搞不了
mouyase
52 天前
@lower 在单网关内部处理透明代理,就会导致一旦代理挂了,整个网络都会瘫痪,而且 NAT 会降级,对于一些 BT 软件,游戏联机之类的都不友好。

如果你用 NatTypeTester 检查 NAT 等级,一定不会是 FullCone.
SkywalkerJi
52 天前
这方案没算 ap 啊,推荐点便宜的 ap 。
mouyase
52 天前
@SkywalkerJi
确实是没算 AP ,因为很多家庭用主路由自己的无线网就足够了,我买的那个只是因为天线坏了所以没无线。

实际上现在就算是好的同款机器也只要 60 块钱左右了,一直在降价。

如果有其他的比如 MESH 或者 ACAP 的方案需求,那就不在本文的讨论范围内了。
xuanjiangsara
52 天前
给动手能力强的人点赞,就算现在用不到。这个思路过程写的清晰看着舒服
MrLonely
52 天前
楼主,我想 rss 订阅你的 blog ,但是好像找不到订阅链接呀。
yyysuo
52 天前
感谢分享,很好,我也有一套方案,只需要 openwrt 就行了,根源也是泡泡的方案,你可以看看。另外有个问题,屏蔽掉对 FakeIP 的 NAT 是什么作用,防止回环吗?比如电报 IP ,主路由静态到网关,如果网关发回到主路由,肯定就炸了,是为了防止这种情况吗?

https://github.com/IrineSistiana/mosdns/discussions/837
mouyase
52 天前
@MrLonely

加上了
mouyase
52 天前
@yyysuo
如果不屏蔽 NAT ,你在 Clash 里看到的来源 IP 将全部都是路由器的 IP ,这样不利于查看运行信息。

参考
https://github.com/kkkgo/PaoPaoGateWay/discussions/26

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1073554

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX