V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mouyase
V2EX  ›  宽带症候群

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

  •  
  •   mouyase · 100 天前 · 10170 次点击
    这是一个创建于 100 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原文地址: 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 以内可以随便买。

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

    98 条回复    2024-09-21 11:45:54 +08:00
    qzydustin
        1
    qzydustin  
       100 天前   ❤️ 1
    有一个疑问,搭建 Paopao dns 目的是什么?直接用运营商+污染的交给服务器不行吗
    walkbox
        2
    walkbox  
       100 天前
    哎 技术值好几百 羡慕有技术的人
    michaeljackson
        3
    michaeljackson  
       100 天前
    太复杂了,果断不看了
    Charkey
        4
    Charkey  
       100 天前   ❤️ 1
    牛的,我的折腾就只有一个 iStoreOS
    Cheons
        5
    Cheons  
       100 天前 via Android
    只用最简单的,需要的设备单独跑服务
    mouyase
        6
    mouyase  
    OP
       100 天前 via Android
    @qzydustin DNS 抗污染+国内外数据包自动分流
    molezznet
        7
    molezznet  
       100 天前
    adguard + 缓存为什么关闭, 我挺喜欢用缓存的,之后解析不是更快吗? 爱快我记得也有缓存的功能。
    mouyase
        8
    mouyase  
    OP
       100 天前 via Android
    @molezznet 因为上游用了 PaoPaoDNS ,它自己有缓存,并且 FakeIP 是不能用缓存的,可能会导致地址解析错误
    mouyase
        9
    mouyase  
    OP
       100 天前 via Android
    @molezznet 补充一句,FakeIP 解析可以认为是无延迟
    xiaoke
        10
    xiaoke  
       100 天前
    比 op 少一个 adguard ,用了近一年 ,纵享丝滑
    mouyase
        11
    mouyase  
    OP
       100 天前 via Android
    @xiaoke 我用 ADG 就是为了分设备分流,家人的有些设备有一些工作需求不能走海外
    ixinshang
        12
    ixinshang  
       100 天前
    为什么你的 DHCP/DNS 有这么多选项? 是自编译的吗? 看到其他的一些没这么多选项。
    mouyase
        13
    mouyase  
    OP
       100 天前
    @ixinshang 这是 OpenWRT 的官方镜像,没有使用第三方编译的固件。我推荐的设备也是可以直接刷官方镜像的(稍微有一点麻烦)。
    xiaoke
        14
    xiaoke  
       100 天前
    @mouyase 分流我用 Routeros 实现,不同客户端指定不同的 DNS ,
    xdeng
        15
    xdeng  
       100 天前
    这么长的文章 你们看完了?
    ronyin
        16
    ronyin  
       100 天前
    太复杂,一般家庭用不上。。
    mouyase
        17
    mouyase  
    OP
       100 天前
    @xiaoke 是玩 ROS 的狠人,佩服佩服(那个鬼东西对于我来说还是有点难用了
    xdzhang
        18
    xdzhang  
       100 天前
    @xdeng 瞟了几眼,太长了。我就群辉里一个 openwrt 做旁路由很多年了非常稳定,哪有这么复杂。
    niaohongC
        19
    niaohongC  
       100 天前
    高技术力折腾
    mouyase
        20
    mouyase  
    OP
       100 天前
    @xdzhang 请问你是怎么解决 NAT 降级和网关分流的呢
    mouyase
        21
    mouyase  
    OP
       100 天前
    @niaohongC 其实没有啥技术含量,PaoPao 系列是其他大佬的开源项目,我只是针对家里的环境踩了一点点坑选了几个比较划算的设备部署了一套方案而已。
    xuhengjs
        22
    xuhengjs  
       100 天前
    这种只能对应 dns 污染,ip 被封的还是没戏
    mouyase
        23
    mouyase  
    OP
       100 天前
    @xuhengjs
    P 被封谁都没戏,但是这套方案可以让你 IP 被封的时候,国内&不走代理的设备完全不受影响。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    https://github.com/IrineSistiana/mosdns/discussions/837
    mouyase
        39
    mouyase  
    OP
       100 天前
    @MrLonely

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

    参考
    https://github.com/kkkgo/PaoPaoGateWay/discussions/26
    yyysuo
        41
    yyysuo  
       100 天前
    @mouyase 哦,明白了。那刚才我说的那个问题,我的科学网关是 sing-box puer 版本,偶发的会出现我前帖说的问题,所以干脆把 dns 网关 主路由 3 合一了,本质上也是 fakeip 分流,分流用 mosdns ,就规避了这个问题。泡泡网关用的是 mihomo ,不知道有没有在防火墙规则中添加规则,防止电报 IP 这种再发回到主路由。
    nilai
        42
    nilai  
       100 天前
    对于纯 ip 的应用, 在路由表上有没有简便的方法?

    目前的方式是不是这样子的? 通过抓包应用---->得到对应的纯 ip 的详细信息---->主路由添加纯 ip 目标到 fake 网关


    有没有简单一点,不需要得到应用的纯 ip , 能否在主路由中写路由表类似 0.0.0.0/0 下一跳指向 fake 网关(网段可能没这么大)
    johnyoung24
        43
    johnyoung24  
       100 天前 via Android
    @Charkey +1🤣
    yyysuo
        44
    yyysuo  
       100 天前
    @nilai 目前已知的,就电报 IP 、netflix ip 、国外 dnsip 、fakeip 共 4 种需要设置路由表,加起来就几十个路由条目吧,如果全劫持,就要排除内网网段等 IP ,反而更麻烦,直接粘给你算了。


    table inet singbox {
    set local_ipv4 {
    type ipv4_addr
    flags interval
    elements = {
    28.0.0.0/8,
    8.8.8.8/32,
    8.8.4.4/32,
    1.0.0.1/32,
    1.1.1.1/32,
    9.9.9.9/32,
    8.41.4.0/24,
    23.23.189.144/28,
    23.246.0.0/18,
    34.195.253.0/25,
    37.77.184.0/21,
    38.72.126.0/24,
    45.57.0.0/17,
    52.24.178.0/24,
    52.35.140.0/24,
    54.204.25.0/28,
    54.213.167.0/24,
    64.120.128.0/17,
    66.197.128.0/17,
    69.53.224.0/19,
    103.87.204.0/22,
    108.175.32.0/20,
    185.2.220.0/22,
    185.9.188.0/22,
    192.173.64.0/18,
    198.38.96.0/19,
    198.45.48.0/20,
    203.75.84.0/24,
    203.198.13.0/24,
    203.198.80.0/24,
    207.45.72.0/22,
    208.75.76.0/22,
    210.0.153.0/24,
    91.108.56.0/22,
    91.108.4.0/22,
    91.108.8.0/22,
    91.108.16.0/22,
    91.108.12.0/22,
    149.154.160.0/20,
    91.105.192.0/23,
    91.108.20.0/22,
    185.76.151.0/24,
    95.161.64.0/20
    }
    }

    set local_ipv6 {
    type ipv6_addr
    flags interval
    elements = {
    2001:b28:f23d::/48,
    2001:b28:f23f::/48,
    2001:67c:4e8::/48,
    2001:b28:f23c::/48,
    2a0a:f280::/32,
    2607:fb10::/32,
    2620:10c:7000::/44,
    2a00:86c0::/32,
    2a03:5640::/32,
    fc00::/18
    }
    }

    set router_ipv4 {
    type ipv4_addr
    flags interval
    elements = {
    28.0.0.0/8,
    8.8.8.8/32,
    8.8.4.4/32,
    1.0.0.1/32,
    1.1.1.1/32,
    9.9.9.9/32
    }
    }

    set router_ipv6 {
    type ipv6_addr
    flags interval
    elements = {
    fc00::/18
    }
    }

    chain singbox-tproxy {
    meta l4proto udp meta mark set 1 tproxy to :7895 accept
    }

    chain singbox-mark {
    meta mark set 1
    }

    chain mangle-prerouting {
    type filter hook prerouting priority mangle; policy accept;
    ip daddr @local_ipv4 meta l4proto udp ct direction original goto singbox-tproxy
    ip6 daddr @local_ipv6 meta l4proto udp ct direction original goto singbox-tproxy
    }

    chain mangle-output {
    type route hook output priority mangle; policy accept;
    ip daddr @router_ipv4 meta l4proto udp ct direction original goto singbox-mark
    ip6 daddr @router_ipv6 meta l4proto udp ct direction original goto singbox-mark
    }

    chain nat-prerouting {
    type nat hook prerouting priority dstnat; policy accept;
    ip daddr @local_ipv4 meta l4proto tcp redirect to :7899
    ip6 daddr @local_ipv6 meta l4proto tcp redirect to :7899
    }

    chain nat-output {
    type nat hook output priority filter; policy accept;
    ip daddr @router_ipv4 meta l4proto tcp redirect to :7899
    ip6 daddr @router_ipv6 meta l4proto tcp redirect to :7899
    }
    }
    ssgooglg
        45
    ssgooglg  
       100 天前
    感觉很复杂的样子 我直接路由器刷了 clash 配置下规则就好了。
    bobryjosin
        46
    bobryjosin  
       100 天前 via Android
    Openwrt+Routeros
    op 跑在 pve 里面,ros 是硬件 rb5009
    op 用 passwall tproxy 模式,dns 分流 dnsmasq chinadns-ng+adguard
    ros 和 op 走 vrrp ,op 离线 ros 切主路由。
    原本准备换 ccr 用 bgp 拉全表 as 分流,后来想想上个网而已,就不整这么复杂了。
    mouyase
        47
    mouyase  
    OP
       100 天前
    @nilai

    如果这样做,就相当于把对所有 IP 的请求全部导向了旁路网关,这和我们想要的结果(国内外分流)是相违背的。

    目前的做法是,设备要访问一个网站,会先向 PaoPaoDNS 请求解析地址,PaoPaoDNS 根据分流规则,分别到递归服务器和 FakeIP 上去解析。如果是国外的应用,会返回 FakeIP 。这样设备就会访问 FakeIP 。由于创建了静态路由表,所以 FakeIP 的请求流向了 PaoPaoGateWay 旁路网关。从而实现经由网关访问对应的网站。

    但是 IP 应用由于没有 DNS 这一步,导致网络请求直接从普通网关流出而没有流向旁路网关。

    所以需要对其 IP 设置静态路由表。
    Charkey
        48
    Charkey  
       100 天前
    @johnyoung24 我发现服务 passwall 有时候需要重启下才能正常,不知道什么原因
    yyysuo
        49
    yyysuo  
       100 天前
    @bobryjosin 有个电报群的群友,之前大部分是你这个方案,现在全改 fakeip 网关了。
    mouyase
        50
    mouyase  
    OP
       100 天前
    @ssgooglg
    直接路由 Clash 难受就难受在一炸全炸
    bobryjosin
        51
    bobryjosin  
       100 天前
    @yyysuo 我不想污染原本的 dns 解析,有时候根据 realip 能判断一些服务是否有效,fakeip 的入侵性太强了,而且我还有一部分 v4 和 v6 的段要走三层隧道,也不太可能维护两套 dns ,个人习惯问题 fakeip 不太适合我。
    yyysuo
        52
    yyysuo  
       100 天前
    @bobryjosin 入侵性太强不太理解,对于一个域名获取对应的 ip ,不管是真的还是假的,只有可达不可达两种状态,科学网关挂了,不管真假,都不会可达的,结果并没有不同,现在的 fakeip ,ttl 基本上给 1 ,没什么残余的影响;另外典型的 fakeip 网关,客户端的 dns 和网关都应该是主路由,不经过 dns 的 ip 直接发起来的连接,默认是直连的。
    povsister
        53
    povsister  
       100 天前
    @yyysuo
    扶墙 != 无法直连访问

    例如 Github 这种只是被劣化+间歇性 SNI 阻断,所以扶墙是为了改善体验。
    Fakeip 要配合 FakeDNS ,DNS 自带不可控 cache ,很容易被各种奇怪的客户端软件缓存解析结果。
    而且,扶墙梯重启的时候,不一定会保存之前的域名-IP 映射关系,那之前被客户端缓存的 IP 在重启后的梯子看来就是无效的。
    综上,fakeip 问题很多,虽然其大幅度降低了拓扑配置门槛,也省掉了一个 DNS RTT (可以直接将域名送往远程服务器落地再解析),但我个人也拒绝 fakeip 的方案。
    bobryjosin
        54
    bobryjosin  
       100 天前
    @yyysuo 比如我要判断一个网站是否用了 cf ,用了哪家 cdn ,如果返回的是 realip ,我能快速根据 ip 段判断,直接用浏览器插件就可以看,全是 fakeip 就不行了,还有很多类似的场景,所以说是个人习惯问题。
    mouyase
        55
    mouyase  
    OP
       100 天前
    @bobryjosin

    我猜你是把 FakeIP 这个操作和 Clash 的 FakeIP 模式绑定到一起了。实际上这两者并没有什么强关联。

    Clash 是把所有网络请求全都引入到自身,然后在根据配置,选择 Real-IP 解析模式或者 FakeIP 解析模式。

    如果是 Clash 的 FakeIP 解析,会把所有的网址全部解析为 FakeIP ,所以才会有你所谓的入侵性太强的问题,实际上这是 Clash 的问题而不是 FakeIP 的问题。

    这套方案 DNS 是先在 PaoPaoDNS 上处理,而 PaoPaoDNS 只有国外(需要代理)的地址,才会送到 Clash 的 FakeIP 解析,其他的地址都是用递归服务器解析到真实 IP 的。而需要代理的地址,真实 IP 并不具备什么意义。如 @yyysuo 所说,只有可达和不可达两种状态。
    mouyase
        56
    mouyase  
    OP
       100 天前
    @povsister
    @bobryjosin

    现在这个方案默认是将所有国外 IP 全部送去 FakeDNS 解析,也就是所谓的大陆白名单,但是如果你们的使用场景是有直连需求,那你们的方案应该是黑名单模式。那只把需要代理的地址送去 FakeDNS 解析就好了。
    mouyase
        57
    mouyase  
    OP
       100 天前
    @povsister
    @bobryjosin

    需要 Real-IP = 可以直连 = PaoPaoDNS 直接解析
    不能直连 = 可以使用 Fake-IP = PaoPaoDNS 使用 FakeIP 解析

    这俩似乎并不冲突,而且在这个方案中也已经兼容了,只不过配置是需要修改一下的
    povsister
        58
    povsister  
       100 天前
    @mouyase
    不管黑白,fakeip 总要污染一边,你只能说两害相权取其轻。但结果都是一样的,你选一边牺牲掉吧。
    何况,这个黑白名单也不是 100%准确的,github 这种灰色的你到底怎么算,只能两边都牺牲掉。
    mouyase
        59
    mouyase  
    OP
       100 天前
    @povsister
    那这个时候问题就出现了,github 这种灰色的,是否能取到 Real-IP 呢,能取到说明可以直连,不能取到说明连不上,那走 Fake-IP 又有什么问题呢?

    现在应该不存在什么方案可以在直连失败的时候自动切代理,检测到可以直连再自动关代理吧?

    理论上不应该都是黑名单/白名单模式吗?
    johnyoung24
        60
    johnyoung24  
       100 天前 via Android
    @Charkey 换 clash 吧,passwall 和 ssrp 我用着也偶尔出现小问题
    yyysuo
        61
    yyysuo  
       100 天前
    @povsister 理论上如此,实际上你说的这些问题,基本上不存在了,特别是 fakeip 网关这个方案,体验极好,当然个人喜好是没有问题的,实在无聊的时候体验下,可能会有新的认识。
    povsister
        62
    povsister  
       100 天前   ❤️ 1
    @mouyase
    哥们。。你是来分享方案的,对于别人指出的一些问题要正视。我和#51 都是认可 fakeip 的优点,不接受缺点,所以最终不采用 fakeip 方案。在这一点上,你也没必要按着别人头非要按你方案来吧。。
    既然如此,来,这是我自用的方案,比你这个更胜一筹,全真 IP ,内网设备无需任何配置,自动容灾,单臂旁路由随便插拔不残留任何污染,你接受下?
    https://github.com/povsister/v2ray-core

    @yyysuo
    体验上来说确实,省掉 DNS 一个 RTT 的体验是非常好的,还可以直接跳过 DNS 分流这种麻烦的步骤。
    而且我提个你们可能都忽视的点,FakeIP 可以非常完美的应对“多个域名套同一个 CDN IP ,但是要针对不同域名走不同代理出口”这样的 case ,全真 IP+不嗅探流量的情况下,刚提到的 case 按域名精准分流是不可能解决的。何况后面 ECH 一普及,你想嗅探都没门咯。
    yyysuo
        63
    yyysuo  
       100 天前
    @mouyase 不在列表中的,带本地的 ecs ip 去 8888 解析,解析之后是国外 ip 再发 fakeip ,这个逻辑加上,体验就非常棒了,不知道泡泡 dns 有没有这么搞。
    mouyase
        64
    mouyase  
    OP
       100 天前
    @povsister

    我只是没能理解。
    你分享的方案我也会仔细研究的,人外有人天外有天,学无止境我是懂的。也许我研究了你分享的方案,自然就理解你的想法了。
    yyysuo
        65
    yyysuo  
       100 天前
    @povsister 大佬来喽,之前就拜读过你的方案了,说实话,太高深了,v2 上能搞明白搞定的也不多吧,我也有个整套的方案(小白写的小白版本),大佬要部署也是分分钟,无聊试下呢? https://github.com/IrineSistiana/mosdns/discussions/837

    dns 分流部分借助 mosdns:
    1:国内域名列表的国内 dns 解析
    2:国外域名列表的直发 fakeip
    3:不在列表中的,带拨号的公网 IP 作为 ecs 发到 8888 ,返回国外 ip 的,丢弃,发 fakeip ,是国内 ip 就接受(很提升体验,借助谷歌 ecs 分流)。

    openwrt 防火墙部分
    只劫持电报 ip 、奈飞 ip 、8888 等国外 dns 、fakeip 去到 sing-box tproxy/redirect 入站。
    povsister
        66
    povsister  
       100 天前
    @yyysuo
    👍千人千面,只要你个人觉得满足需求的就是好方案。就跟有人喜好 fakeip 一把梭,有人痛恨 fakeip 从而对我开发的方案欣喜若狂一样。

    但我无法接受 fakeip 所以可能不会尝试,其他方面的配置思路是和你一样的:预定义域名列表内的域名走国内外分流,未知域名通过多次 DNS 回退查询选择更合适的响应。
    mouyase
        67
    mouyase  
    OP
       100 天前
    @povsister

    刚刚看了一圈你的方案,有点牛逼的,讲道理是很想部署一下试试的。

    但是方案里面主路由用的是 ROS ,这个东西自己玩不太转,也不太好安利。并且硬路由不是很好搞。这东西能替换成 iKuai 或 OpenWRT 吗?
    yyysuo
        68
    yyysuo  
       100 天前
    @mouyase 我第一看大佬的方案的时候,看哭了。
    yyysuo
        69
    yyysuo  
       100 天前
    @mouyase 你来玩我的方案啊,openwrt 的,半小时搞定。
    mouyase
        70
    mouyase  
    OP
       100 天前
    @yyysuo 其实也没太看懂所以……我是真的菜。
    povsister
        71
    povsister  
       100 天前
    @mouyase
    ikuai 我不清楚没用过,openwrt 应该问题不大。
    核心是依赖 OSPFv2 以及 policy routing (直观点说就是 linux 下 ip rule 那个东西)
    mouyase
        72
    mouyase  
    OP
       100 天前 via Android
    @povsister 有个疑问,这个方案,是不是还是需要黑白名单?只不过没有用 Fake-IP 而且返回 Real-IP 之后再去连接的?
    povsister
        73
    povsister  
       100 天前 via iPhone
    @mouyase
    要不要黑白名单,想怎么去分流完全取决于你怎么配置。
    我只是开发并提供了一套机制。示例配置是 gfw 黑名单走 proxy ,其他域名直连+dns 回退防止 dns 污染。如果想黑名单无条件走海外 DNS+ECS ,自行改下配置即可。

    是的,无论黑白,返回均为真实 ip ,是否要连接取决于客户端自己,需要代理访问的真实 IP 会由 DNS Route 机制自动完成透明代理的搭建,真正访问时就是无感通过透明代理访问。
    eastcukt
        74
    eastcukt  
       100 天前 via Android
    nb ,没一个星期折腾不下来
    bobryjosin
        75
    bobryjosin  
       100 天前
    @yyysuo 楼上的那位老哥把我想说的说清楚了,fakeip 对于常规端口,优势非常明显,之前放弃 fakeip 的其中原因是游戏的 udp 数据包,会出现数据包不通过代理核心,虽然这个可以通过静态路由解决,但是 tproxy 能更无感的解决这个问题,且不需要去查日志重写规则,根据 ip 拦截转发到核心非常精准,我还遇到过有些服务会去校验 PTR 记录,这时候返回 fakeip 是肯定不行的,理论上配置重写 dns 可以解决这个问题,但很麻烦。
    bobryjosin
        76
    bobryjosin  
       99 天前
    说到底,fakeip 不是很优雅,因为破坏了域名->DNS->IP 这个关系,不过这确实适用普通上网环境,更进阶的比如专线这种三层直通网络,fakeip 就有局限了。
    yyysuo
        77
    yyysuo  
       99 天前 via iPhone
    @bobryjosin 游戏通过 ip 直连种确实不好弄,不玩游戏不知道有没有 ip 直连的
    Dk2014
        78
    Dk2014  
       99 天前 via Android
    4 月就在用这套了,唯一的缺点就是 gateway 必须跑在 x86 机器上,直接断了用 arm 设备跑的念想
    县城有 5600g 的 all in boom 倒没问题,老家就不好搞了,有个闲置的 nanopc-t4 也没啥用处

    另外我 gateway 也是走 suburl 加了 subconvert 规则的,没有单纯的走全局,方便针对不同服务调节点
    mouyase
        79
    mouyase  
    OP
       99 天前
    @Dk2014 其实理论上是可以把 gateway 换成普通的 clash 的,从而支持 arm 。
    mouyase
        80
    mouyase  
    OP
       99 天前
    @yyysuo 外服游戏本身也最好还是用加速器吧,靠代理打游戏本身就费点劲。
    chenbin36255
        81
    chenbin36255  
       99 天前
    物理机安装 ikuai x64
    自带虚拟机+docker
    可以做到 ikuai+paopaogateway+paopaodns 一体化
    爱快自带 http 服务 可以放 gateway 配置 custom.yaml 节点配置拉取
    mouyase
        82
    mouyase  
    OP
       99 天前 via Android
    @chenbin36255 iKuai 的虚拟机性能比较差,Docker 也比较难用。低价的 iKuai 开的虚拟机肯定是不如物理机的性能强的。不过我就是你说的这样部署的,网络设施都在一起,比较好维护。
    yyysuo
        83
    yyysuo  
       99 天前 via iPhone
    @Dk2014 mihomo 和 sing box 跑裸核就好了,就是 ipt 或者 nft 的事儿
    bitfly
        84
    bitfly  
       99 天前 via Android
    直接 openwrt & xray & ADH(最新版)里 对域名进行分流解析就好了
    还可以设置多个国内的 doh/dot 来分担解析压力
    搞那么多干啥呢
    mouyase
        85
    mouyase  
    OP
       99 天前
    @bitfly 如果你这么认为,那一定是没有经历过一炸全炸
    neroxps
        86
    neroxps  
       99 天前 via iPhone
    同方案,在没有 PaoPaoDNS 我是用别人写的 coredns 读 clash 配置的插件来工作,正常运行 3 年了
    yyysuo
        87
    yyysuo  
       99 天前
    @neroxps https://t.me/+bzSRf6dtG3lhYWVl https://t.me/buaizheteng 来玩,fakeip 网关爱好者大本营。
    chenbin36255
        89
    chenbin36255  
       99 天前
    @mouyase #82 那可以用 pve 做底层 其实是一样的
    rulagiti
        90
    rulagiti  
       99 天前
    看不得这些乱七八糟的,mosdns+iptables 手搓
    RoccoShi
        91
    RoccoShi  
       99 天前
    真折腾啊。。
    Dk2014
        92
    Dk2014  
       99 天前 via Android
    楼上没搞明白啊,这套配置优点在于可以做成非侵入式的
    只要你不走 paopaodns ,默认就是主路由的 dns 和网关
    只有 dns 换到 paopaodns 了,那就会把国外域名全部解析到 fakeip ,然后由主路由的路由表转到 gateway 的 clash 上面去
    要下发 dns ,主路由不能是国产那些原厂系统,换成 op 和 ros 都可以做到
    我家里就是只有我的设备走 paopao ,父母手机和一些 iot 设备都是默认 dns 和网关,这样即使挂了也不会影响到他们
    byuan04
        93
    byuan04  
       99 天前
    买个 n5105 4 口 2.5G .... 准系统才 350...
    ynxh
        94
    ynxh  
       99 天前
    有没有简单点的,卧槽
    Xymmh
        95
    Xymmh  
       99 天前 via Android
    过于复杂了,immortalwrt+homeproxy+smartdns+zerotier 就完美实现了我的需求
    hsczy
        96
    hsczy  
       97 天前 via Android
    大佬咨询一下。您的 openwrt 是作为旁路由还是主路由?
    ChaosAttractor
        97
    ChaosAttractor  
       97 天前
    AdguardHome 的全部功能就是一个 DNS 转发器+DNS Filter+前端,刨除前端部分,dnsmasq 都能实现过滤,而 mosdns/knot-resolver 则健壮的多
    此外旁路由...非对称路由警告, 入站流量不能 Conntrack 警告
    mouyase
        98
    mouyase  
    OP
       97 天前
    @hsczy #96
    主路由

    @ChaosAttractor #97
    AdguardHome 仅为了给局域网设备分配不同的上游 DNS ,以及去广告使用。上游 DNS 是 PaoPaoDNS 方案(基于 unbound 和 mosdns)。
    旁路网关仅作为出国转发使用,入站流量不会经过旁路网关。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2735 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 12:20 · PVG 20:20 · LAX 04:20 · JFK 07:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.