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

前言

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

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

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

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

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

最终预期的结果

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

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

设备选择和采购

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

  • 一台硬路由,要可以刷入支持设置静态路由,静态 DHCP 的系统(OpenWRT 、爱快、ROS 等)
  • 一台可以部署 Docker 容器的机器,例如一台小型 ARM 主机(玩客云,x905 电视盒子等)
  • 一台低功耗 x86 小主机(最好支持 AES 硬解)

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

硬路由-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 口进行连接。

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

注:

  • 如果有条件可以将网关机接上屏幕开机测试一下,看看能不能正常启动开机看到日志。
  • 系统测试稳定之后,可以尝试用 PE 将 ISO 镜像写入到系统内置磁盘里,这样就可以不插 U 盘启动了,不过这样后面更新会稍微麻烦点。

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 以内可以随便买。

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