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

延期了 3 年的事,这一周全部干完了,把家庭网络重新梳理了一遍

  •  1
     
  •   sampeng · 2025 年 6 月 25 日 · 2952 次点击
    这是一个创建于 219 天前的主题,其中的信息可能已经有所发展或是发生改变。
    首先说在前面,生命在于折腾哈。其实本身没啥意义,因为现阶段都是千兆大带宽,早就不是当年小水管了。这不折腾没啥意义。

    装修完后,就一直没弄,网络拓扑非常简单,光猫拨号->华为 Q6-〉 nas 等一堆设备。

    因为是华为 Q6 子母设备,怎么说呢。其实完全够用了。每个房间我都放了子路由。全屋零死角上网。说实话,家庭用,300M 内网能稳定其实体感上没什么区别。这一套用了 3 年,也没管他,我也不用天天重启路由,也还不错,挺稳定的。

    什么契机重新折腾呢?之前是所有的设备我需要啥,就在光猫开一个端口映射,再再在华为 Q6 上开一个端口映射。NAT 类型惨不忍睹不说他,也没啥影响。但是这一顿操作很烦躁,因为没 vpn ,是我家里电脑弄了个 ToDesktop 。也不是不能用。包括明日方舟挂机啊,minecraft 私服维护啊,巴拉巴拉的。ToDesktop 卡得我云里雾里,有时候还干脆连不回去,只能干看着。我忍了 2 个星期,忍不了了。自建 rustdesktop 。会好很多,但是也不太行,只能说比 ToDesktop 好一点点。

    这是用的别扭的原因。第二个原因。我的 tr 开在外网天天被人猜密码,猜着猜着就自己关了。搞的我很烦躁。也就是说其实我公开的服务和端口,都一天到晚被人猜密码和扫描。于是开始折腾 vpn ,本来搞的 openvpn ,也不是不能用,但是不稳定,还是因为 nat 的缘故。vpn 回去可以,但我还有需求是从家里访问公司我自己的电脑做一些操作。再折腾,搞零信任网络,对比了一翻,netbird 符合我的需要。搞了两天,爽,确实非常爽,在公司网络体验跟在家没区别,ssh 是毫无卡顿的,甚至我一天 ssh 到家里,第二天来上班,这个 ssh 都还没断过。远程 code 着绝对是最佳体验。我公司 mac studio 用屏幕共享回家的 mac mini 。可以开启高性能模式,和在家没区别,稍微有点点卡顿,但能接受。比 xxDesktop 的解决方案绝对是秒杀。

    但我有技术洁癖,其实也就 ping 不稳,偶尔卡顿,我看了一下,我所有的节点都是走的中转,也就是我自建的 nas 上的 stun 服务做的中转。研究了一下,还是因为 NAT 的原因,太烂了,光猫和路由器啥功能都没。

    一咬牙,搞都搞了,就一步到位家里网络大折腾。

    我的需求就很简单了

    * pt 等自建服务
    * 自动梯子
    * 广告拦截
    * nat 要干净,把家里的设备危险和不危险的隔离开(一堆 IoT 设备,都是连华为 Q6 上的,我就这一个 wifi 设备)。
    * 自建 dns ,公司回家用家里的 dns ,因为我测试过,在公司的 dns 要 20-25ms ,还是没拦截的。我 vpn 回家只要 10-15ms 。。

    开始翻吃灰的垃圾:

    * mikrotik 的 RB4011 。
    * R6S

    开始组网:

    mikrotik 作为主路由,R6S 是二级路由,华为 Q6 也是二级路由。pc ,游戏机,macmi ,nas 直接挂在主路由下。
    也就是:
    Work_Vlan: pc+macmini+apple tv
    NAs_Vlan: 只接 NAS 。
    Laod_Vlan: OpenWrt 的 R6s ,其实装 ubuntu 更合适一点,因为我没有再在底下挂设备的需求。但我懒的折腾了,又不是不能用。
    Q6_Vlan: 华为 Q6 那个母路由,ps5 dmz 出来。

    没有做太多复杂的东西,主要是以下几点

    * Q6_Vlan 只能访问其他 Vlan 的指定端口,因为这是一个娱乐设备接入点,我就简单点,我核心需求是不要访问其他设备的 22 等危险端口就好了。其他 Vlan 无所谓,直接互通就好。有需求再加。
    * 和网络有关的什么广告拦截,dns ,梯子,都在 OpenWrt 上。R6S 。这点需求跟闹着玩一样。只要固件没 bug ,随便浪。
    * 梯子我没有用各种教程的旁路由的模式,我也是反对旁路由模式的,访问所有东西都要经过旁路由再主路由出去,非常的奇怪。研究了一下,routeros 直接策略路由非国内 ip 到 openwrt 上。openwrt 规则出去。用了 1-2 天,基本没误会的,因为所谓梯子,作为研发,核心需求就 google ,youtube 和 github 。其他其实不怎么用。这样家庭设备国内正常使用就完全没这个 openwrt 什么事。看了一天,openwrt 一天也就处理 100-300M 流量。

    还缺一个。。用 grafana 监控所有设备。。啊哈哈哈哈哈。懒得弄了,这就是真的是闲的蛋疼。

    RouterOS 的 nat 是把我折腾够呛,真的不是弄一遍 NAT ,我都不知道各种 tcp/udp 的细节。为了 netbird 可以支持设备 p2p ,我折腾了 2 天整的。最后搞明白 stun 协议是根据请求包的 dst 地址决定的。发卡回流 nat ,dst 地址已经变成了内网地址。

    现在效果:

    * 外网手机,ipad ,pc ,wg 连回家,延迟 10ms 。游戏,办公,改一些东西配置,延迟都没什么特别大的感觉。已经是彻底給我解决了远程回家卡成狗了。以前是群晖的反向穿透 quickconnect ,打开慢得 1 批。我要操作什么都要以群晖为跳板去其他设备。现在:目标 ip ,connect
    * 关闭所有外网端口,只留了 netbird 的管理口,这确实没办法,有漏洞我也只能认了。
    * 家里所有设备广告消失了,看了一下,dns 级的过滤比例大概在 10-20%。dns 延迟在 5ms 左右,增加 dns 这一套之前也是得 20ms 。。
    * 现在网页,网站,都是秒开了,app 里也转圈少了。
    * 主路由 cpu 维持在 10%以下,pt 跑 7-80MB 的时候 cpu 大概 30%。已经完全符合我需求了,当然,以后 2.5G 外网那是另一个故事。我终于掌握了家里网络的所有权,之前光猫和华为 Q6 我除了能改个 NAT 什么都别想做。


    哦。最后一句,改桥接,有个小故事。好像北京联通 FTTR 不让改桥接,我打电话到 10010 ,我刚说完,客服就说,不好意思先生,FT ,稍等,先生,我給您转給工程师。

    哈哈哈,我猜他就是像说 FTTR 不能改桥接,结果我不是。后面就很顺利了,远程就給我把光猫改桥接了。
    第 1 条附言  ·  2025 年 6 月 25 日
    一直对去广告拦截嗤之以鼻,觉得无端浪费性能和延迟。就是直觉上觉得会有很大延迟。今天在公司搞完了家里去广告和梯子,回家那腾讯视频试了一下。毫无延迟…体验就是约等于没有广告存在啊。确实家里得有这个玩意
    第 2 条附言  ·  2025 年 6 月 26 日
    我现在唯一没做的就是 ipv6.防火墙等东西还挺麻烦。。而且 routeros 祖传的 ipv6 不做硬 nat 和硬件加速。。先扔着再说
    24 条回复    2025-07-01 22:51:34 +08:00
    damichifan
        1
    damichifan  
       2025 年 6 月 25 日
    很强,非程序员看不太懂,回家不卡顿,是通过云服务器中转执行的吧
    sampeng
        2
    sampeng  
    OP
       2025 年 6 月 25 日 via iPhone
    @damichifan 不,p2p 意味着点对点。我中转也在家里。没有云服务器什么事。上行 40-70M ,不可能卡顿。除非运营商限流,那我没办法…
    vhus
        3
    vhus  
       2025 年 6 月 26 日
    建议:
    1.PT 下载设备最好是双网口(虚机的话稍微麻烦点),在光猫上单独接一路(光猫改桥接是必须的),然后 pppoe 拨号连接外网(实测目前电信/联通都支持多次 pppoe ),PT 下载最好不要走主路由,因为梯子不好配置,这样 ipv6 的 PT 也容易搞,配好防火墙,第二网卡配置到内网 IP ,去访问 NAS.
    2.家用的话路由没有必要搞两级,配置 Vlan 什么的意义也不太大,如果是带 wifi 的路由器就弄成桥接模式。
    3.在主路由上指定 adguard home 作为主 DNS 上面多设几个上游 DNS ,可以使用并行请求去加速 dns 解析。
    4.如果光猫已经桥接模式,那就配置好 ddns ,用 wireguard 回家,其它模式 vpn 速度都不可靠。
    vhus
        4
    vhus  
       2025 年 6 月 26 日
    比较悲催的是 mikrotik 官方自带的 ddns 已经不能使用了,更新包也要手动刷了。
    sampeng
        5
    sampeng  
    OP
       2025 年 6 月 26 日 via iPhone
    @vhus 巧了,我正准备这么做,我是群晖,有两个网口。就是因为梯子把整个群晖屏蔽了,还是非常难受。

    同理,ddns 是在群晖上继续服役。
    没办法,华为 q6 没办法改成桥接,网上有邪路,但漫游功能就没了…得不偿失。还好手机其实无所谓…按之前网络拓扑本来手机就都是两层。所以这次改造最主要是把 pc 、nas 、这些都直接挂路由下。
    谢谢建议。wg 回家确实香,就是不知道这种 vpn 可以用多久,感觉特征也很明显,迟早被干扰
    vhus
        6
    vhus  
       2025 年 6 月 26 日
    给你一个 dnspod 的 routeros ddns 脚本,在主路由上做 ddns 。弄个便宜的域名就行了。
    ###程序执行完需要较长时间,请耐心等待,不要反复执行,建议放在 PPP 模板里 ON-UP 使用###
    ###注意事项:子域名请尽量全部大于 3 位,如果子域名列表里同时存在 1.x.com11.x.com 记录时会出现误判###
    ###注意事项:使用 V4V6 同时更新的域名,顶级域名必须一致,否则会因为缓存域名 ID 导致后续更新失败###
    ###定义必须变量#####
    ###定义 DNSPOD 的 TOKEN###
    :local mytoken "XXX,XXX"
    ###定义自己的需更新域名(不需要更新的 IP 类型留空即可)###
    :global mydomains4 "域名 t"
    :global mydomains6 "域名 t"
    ###定义自己的需更新的拨号接口###
    :global myint "pppoe-out1"
    ###以下内容无需修改###
    ###预判断域名是否为双栈###
    :global v4putex ""
    :global v6putex ""
    :if ($mydomains4 = $mydomains6) do={:log error "检测到当前更新域名使用双栈。";:global v4putex "&offset=0&length=1";:global v6putex "&offset=1&length=1";}
    :if ([:len $mydomains4] >0) do={
    ###开始 IPV4 获取工作,可自行按需调整###
    :global mydomain41 [:pick $mydomains4 ([:find $mydomains4 "."] +1) [:len $mydomains4]]
    :global mydomain42 [:pick $mydomains4 0 [:find $mydomains4 "."]]
    :global myipv4 [/ip address get [find interface=$myint] address]
    :set myipv4 [:pick $myipv4 0 [:find $myipv4 "/"]]
    ###开始 DNSPOD 处理 IPV4 工作,以下请勿修改###
    :log error "DNSPOD 脚本执行 IPV4 更新开始"
    :do [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$mytoken&format=json&domain=$mydomain41&sub_domain=$mydomain42&$v4putex"]
    :delay 5s
    :global reprec [/file get [find name="Record.List"] contents]
    :if ([:len [:find $reprec "u7a7a"]] >0) do={
    /file remove [find name="Record.List"]
    :log error "DNSPOD 因为没有对应子域名,尝试自己 NEW 一个。"
    :global myipv4
    :do [/tool fetch url="https://dnsapi.cn/Record.Create" http-data="login_token=$mytoken&format=json&domain=$mydomain41&sub_domain=$mydomain42&value=$myipv4&record_type=A&record_line=%e9%bb%98%e8%ae%a4" keep-result=no]
    :delay 5s
    :do [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$mytoken&format=json&domain=$mydomain41&sub_domain=$mydomain42"]
    :delay 5s
    :global reprec [/file get [find name="Record.List"] contents]
    }
    :if ([:len [:find $reprec "u6210"]] >0) do={
    :global dnspodf [/file get [find name="Record.List"] contents]
    :global fdend [:find $dnspodf ("\"".$mydomain42."\"")]
    :global fdinfo [:pick $dnspodf 0 $fdend]
    :while ([:len [:find $fdinfo "{"]] > 0) do={
    :global fdinfo [:pick $fdinfo ([:find $fdinfo "{"] +1) [:len $fdinfo]]}
    :global fdinfo [:pick $fdinfo 6 [:len $fdinfo]]
    :global fdinfo [:pick $fdinfo 0 [:find $fdinfo "\","]]
    :global recordid $fdinfo
    /file remove [find name="Record.List"]
    :global myipv4
    :if ([:len [:find $dnspodf $myipv4]] >0) do={
    :log error ("DNSPOD 放弃更新,IPV4 没有变化。")
    } else={
    :do [/tool fetch url="https://dnsapi.cn/Record.Modify" http-data="login_token=$mytoken&format=json&domain=$mydomain41&record_id=$recordid&sub_domain=$mydomain42&value=$myipv4&record_type=A&record_line=%e9%bb%98%e8%ae%a4"]
    :delay 5s
    :global reprec [/file get [find name="Record.Modify"] contents]
    /file remove [find name="Record.Modify"]
    :if ([:len [:find $reprec "u6210"]] >0) do={
    :log error ("DNSPOD 更新 IPV4 成功。当前 IPV4 为:".myipv4)
    } else={
    :log error "DNSPOD 更新 IPV4 失败"
    }}}
    :log error "DNSPOD 执行脚本 IPV4 更新完毕"}
    :if ([:len $mydomains6] >0) do={
    ###开始 IPV6 获取工作,可自行按需调整###
    :global mydomain61 [:pick $mydomains6 ([:find $mydomains6 "."] +1) [:len $mydomains6]]
    :global mydomain62 [:pick $mydomains6 0 [:find $mydomains6 "."]]
    :global myipv6 [/ip address get [find interface=$myint] address]
    :set myipv6 [:pick $myipv6 0 [:find $myipv6 "/"]]
    ###有的朋友这里 V6 使用 release 会有问题,可更换为 renew 尝试,和运营商有关###
    /ipv6 dhcp-client renew [find interface=$myint]
    :delay 3s
    :global myipv6 [/ipv6 dhcp-client get [find interface=$myint status=bound] prefix]
    :set myipv6 [:pick $myipv6 0 [:find $myipv6 "/"]]
    ###开始 DNSPOD 处理 IPV6 工作,以下请勿修改###
    :log error "DNSPOD 脚本执行 IPV6 更新开始"
    :do [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$mytoken&format=json&domain=$mydomain61&sub_domain=$mydomain62&$v6putex"]
    :delay 5s
    :global reprec [/file get [find name="Record.List"] contents]
    :if ([:len [:find $reprec "u7a7a"]] >0) do={
    /file remove [find name="Record.List"]
    :log error "DNSPOD 因为没有对应子域名,尝试自己 NEW 一个。"
    :global myipv6
    :do [/tool fetch url="https://dnsapi.cn/Record.Create" http-data="login_token=$mytoken&format=json&domain=$mydomain61&sub_domain=$mydomain62&value=$myipv6&record_type=AAAA&record_line=%e9%bb%98%e8%ae%a4" keep-result=no]
    :delay 5s
    :do [/tool fetch url="https://dnsapi.cn/Record.List" http-data="login_token=$mytoken&format=json&domain=$mydomain61&sub_domain=$mydomain62"]
    :delay 5s
    :global reprec [/file get [find name="Record.List"] contents]}
    :if ([:len [:find $reprec "u6210"]] >0) do={
    :global dnspodf [/file get [find name="Record.List"] contents]
    :global fdend [:find $dnspodf ("\"".$mydomain62."\"")]
    :global fdinfo [:pick $dnspodf 0 $fdend]
    :while ([:len [:find $fdinfo "{"]] > 0) do={
    :global fdinfo [:pick $fdinfo ([:find $fdinfo "{"] +1) [:len $fdinfo]]}
    :global fdinfo [:pick $fdinfo 6 [:len $fdinfo]]
    :global fdinfo [:pick $fdinfo 0 [:find $fdinfo "\","]]
    :global recordid $fdinfo
    /file remove [find name="Record.List"]
    :global myipv6
    :if ([:len [:find $dnspodf $myipv6]] >0) do={
    :log error ("DNSPOD 放弃更新,IPV6 没有变化。")
    } else={
    :do [/tool fetch url="https://dnsapi.cn/Record.Modify" http-data="login_token=$mytoken&format=json&domain=$mydomain61&record_id=$recordid&sub_domain=$mydomain62&value=$myipv6&record_type=AAAA&record_line=%e9%bb%98%e8%ae%a4"]
    :delay 5s
    :global reprec [/file get [find name="Record.Modify"] contents]
    /file remove [find name="Record.Modify"]
    :if ([:len [:find $reprec "u6210"]] >0) do={
    :log error ("DNSPOD 更新 IPV6 成功。当前 IPV6 为:".myipv6)
    } else={
    :log error "DNSPOD 更新 IPV6 失败"
    }}}
    :log error "DNSPOD 执行脚本 IPV6 更新完毕"}
    sampeng
        7
    sampeng  
    OP
       2025 年 6 月 26 日 via iPhone
    @vhus 这个有点牛逼…
    vhus
        8
    vhus  
       2025 年 6 月 26 日
    @sampeng 华为 Q6 我没用过,既然是光猫配置应该都差不多,获取到超级密码应该能改桥接吧,我认为 app 的功能用处不太大。如果能改桥接用 routeros 接管 pppoe 和 dhcp 和主路由 就方便很多了。
    wangclack
        9
    wangclack  
       2025 年 6 月 26 日
    广告拦截什么方案,麻烦展开港一港啊,自己折腾的感觉没你的效果好。
    sampeng
        10
    sampeng  
    OP
       2025 年 6 月 26 日
    @wangclack 广告都是差不多的方案,但其实还是有广告,app 里的现在都学聪明了。我试了几个过滤方案都没什么用。我测试了一下,明显网页看视频如果开了广告过滤,就让你用 app 。可能是先试的网页,觉得效果不错。但实际用 app 。该开机广告还是开机广告。。哎。。。
    hackroad
        11
    hackroad  
       2025 年 6 月 26 日
    上海电信 wirguard 会限速 5Mbps ,北京居然没事。。。
    maybeonly
        12
    maybeonly  
       2025 年 6 月 26 日
    vlan 是有利弊,不过我自己实践的话还是有必要用,因为在一定情况下可以简化配置。
    好处:
    * 结合 ap 的 ssid ,将不同策略的东西丢进不同的 vlan ,例如国产 iot 和 bt 不需要走梯子
    * 可以指定个别 vlan 去个别特殊出口,如“北美直通车”
    * 个别 vlan 可以自定义 ipv6 ,例如针对 iot 的不给 v6 ,默认 vlan 的 fd 开头私有地址,针对 bt 的下发特定 wan 口的 pd 地址(以及对应的路由)

    坏处:
    * 配置稍微有点麻烦,不过比起在同 vlan 配置不同策略那是简单多了
    * 如果需要在交换机上做个别 vlan 的 access 口,需要交换机支持不说,时间长了有插错的风险

    现状是除了默认还用了 3 个 vlan 。虽然除了自定义 v6 其他都已经在默认 vlan 实现。
    sampeng
        13
    sampeng  
    OP
       2025 年 6 月 26 日
    @maybeonly 同意你的考虑,我也是这么考虑的,我一开始是用 address list 来逻辑建的。但是还是麻烦,还是 vlan 比较干净,逻辑比较清晰。反正只配一次,家里就那么几个设备。10 个口也插不错。
    ToDyZHu
        14
    ToDyZHu  
       2025 年 6 月 26 日
    R6s 感觉不还是旁路由吗,只不过在 routeOS 中提前分流了一下,然后是不是需要在 routeOS 中指定 DNS 为 OpenWrt 的地址呢?
    sampeng
        15
    sampeng  
    OP
       2025 年 6 月 26 日
    @ToDyZHu 我理解他不是把网关指向过去。提前分流的好处是,其实内网 99%的流量都不需要经过 openwrt 。1%那是我晚上回家查东西工作之类的。dns 其实可指可不指。我是为了有个 dns 过滤。
    zsneoks
        16
    zsneoks  
       2025 年 6 月 26 日
    pt 绕过梯子的问题直接给 pt 容器一个单独的 ip ,然后过滤掉它不行吗? ddns 的话直接起个 ddns-go 容器就 ok 了吧。都是几分钟的问题?
    zsneoks
        17
    zsneoks  
       2025 年 6 月 26 日
    另外回家的问题,我是直接在家里随便 nas 或哪里挂个 ss server ,直接直连了。
    sampeng
        18
    sampeng  
    OP
       2025 年 6 月 27 日 via iPhone
    @zsneoks pt 没用容器,直接套件,容器有点问题,懒得查了,就直接部署的。
    至于回家用 ss ,就是仁者见仁 智者见智了。
    其实主要目的是为了折腾,其次是两层 nat 玩游戏,转发 port 都不方便。就是为了这点醋包的饺子
    piero66
        19
    piero66  
       2025 年 6 月 27 日
    arm64 官方卖的 routeros 可以安装 zerotier ,用 zerotier 一键回家就行了
    MYDB
        20
    MYDB  
       2025 年 6 月 27 日 via iPhone
    同意楼上的,给下载器起个 macvlan 容器
    sampeng
        21
    sampeng  
    OP
       2025 年 6 月 27 日 via iPhone
    我现在还有个问题没解决,策略路由是排除在 fasttrack 之外的。肉眼可见的影响主路由 cpu…没想到有什么好的办法
    zsneoks
        22
    zsneoks  
       2025 年 6 月 27 日
    @piero66 zerotier 速度太难受了。直连之后爽多了。
    Cruzz
        23
    Cruzz  
       2025 年 6 月 30 日
    之前折腾过,发现,什么 vpn ,什么零信任,都不如自己在家搭一个 ss 。客户端分组加上家里设备的域名/ip 规则,无缝使用。还不用安装其他的代理工具。
    likeflower
        24
    likeflower  
       2025 年 7 月 1 日
    @vhus IP Cloud 可以用啊,只是没备案的不常见域名,运营商 dns 有时候解析不了
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2309 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 07:07 · PVG 15:07 · LAX 23:07 · JFK 02:07
    ♥ Do have faith in what you're doing.