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

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

  •  1
     
  •   sampeng · 18 天前 · 2215 次点击
    首先说在前面,生命在于折腾哈。其实本身没啥意义,因为现阶段都是千兆大带宽,早就不是当年小水管了。这不折腾没啥意义。

    装修完后,就一直没弄,网络拓扑非常简单,光猫拨号->华为 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 条附言  ·  18 天前
    一直对去广告拦截嗤之以鼻,觉得无端浪费性能和延迟。就是直觉上觉得会有很大延迟。今天在公司搞完了家里去广告和梯子,回家那腾讯视频试了一下。毫无延迟…体验就是约等于没有广告存在啊。确实家里得有这个玩意
    第 2 条附言  ·  17 天前
    我现在唯一没做的就是 ipv6.防火墙等东西还挺麻烦。。而且 routeros 祖传的 ipv6 不做硬 nat 和硬件加速。。先扔着再说
    24 条回复    2025-07-01 22:51:34 +08:00
    damichifan
        1
    damichifan  
       18 天前
    很强,非程序员看不太懂,回家不卡顿,是通过云服务器中转执行的吧
    sampeng
        2
    sampeng  
    OP
       18 天前 via iPhone
    @damichifan 不,p2p 意味着点对点。我中转也在家里。没有云服务器什么事。上行 40-70M ,不可能卡顿。除非运营商限流,那我没办法…
    vhus
        3
    vhus  
       18 天前
    建议:
    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  
       18 天前
    比较悲催的是 mikrotik 官方自带的 ddns 已经不能使用了,更新包也要手动刷了。
    sampeng
        5
    sampeng  
    OP
       18 天前 via iPhone
    @vhus 巧了,我正准备这么做,我是群晖,有两个网口。就是因为梯子把整个群晖屏蔽了,还是非常难受。

    同理,ddns 是在群晖上继续服役。
    没办法,华为 q6 没办法改成桥接,网上有邪路,但漫游功能就没了…得不偿失。还好手机其实无所谓…按之前网络拓扑本来手机就都是两层。所以这次改造最主要是把 pc 、nas 、这些都直接挂路由下。
    谢谢建议。wg 回家确实香,就是不知道这种 vpn 可以用多久,感觉特征也很明显,迟早被干扰
    vhus
        6
    vhus  
       18 天前
    给你一个 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
       18 天前 via iPhone
    @vhus 这个有点牛逼…
    vhus
        8
    vhus  
       18 天前
    @sampeng 华为 Q6 我没用过,既然是光猫配置应该都差不多,获取到超级密码应该能改桥接吧,我认为 app 的功能用处不太大。如果能改桥接用 routeros 接管 pppoe 和 dhcp 和主路由 就方便很多了。
    wangclack
        9
    wangclack  
       17 天前
    广告拦截什么方案,麻烦展开港一港啊,自己折腾的感觉没你的效果好。
    sampeng
        10
    sampeng  
    OP
       17 天前
    @wangclack 广告都是差不多的方案,但其实还是有广告,app 里的现在都学聪明了。我试了几个过滤方案都没什么用。我测试了一下,明显网页看视频如果开了广告过滤,就让你用 app 。可能是先试的网页,觉得效果不错。但实际用 app 。该开机广告还是开机广告。。哎。。。
    hackroad
        11
    hackroad  
       17 天前
    上海电信 wirguard 会限速 5Mbps ,北京居然没事。。。
    maybeonly
        12
    maybeonly  
       17 天前
    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
       17 天前
    @maybeonly 同意你的考虑,我也是这么考虑的,我一开始是用 address list 来逻辑建的。但是还是麻烦,还是 vlan 比较干净,逻辑比较清晰。反正只配一次,家里就那么几个设备。10 个口也插不错。
    ToDyZHu
        14
    ToDyZHu  
       17 天前
    R6s 感觉不还是旁路由吗,只不过在 routeOS 中提前分流了一下,然后是不是需要在 routeOS 中指定 DNS 为 OpenWrt 的地址呢?
    sampeng
        15
    sampeng  
    OP
       17 天前
    @ToDyZHu 我理解他不是把网关指向过去。提前分流的好处是,其实内网 99%的流量都不需要经过 openwrt 。1%那是我晚上回家查东西工作之类的。dns 其实可指可不指。我是为了有个 dns 过滤。
    zsneoks
        16
    zsneoks  
       17 天前
    pt 绕过梯子的问题直接给 pt 容器一个单独的 ip ,然后过滤掉它不行吗? ddns 的话直接起个 ddns-go 容器就 ok 了吧。都是几分钟的问题?
    zsneoks
        17
    zsneoks  
       17 天前
    另外回家的问题,我是直接在家里随便 nas 或哪里挂个 ss server ,直接直连了。
    sampeng
        18
    sampeng  
    OP
       16 天前 via iPhone
    @zsneoks pt 没用容器,直接套件,容器有点问题,懒得查了,就直接部署的。
    至于回家用 ss ,就是仁者见仁 智者见智了。
    其实主要目的是为了折腾,其次是两层 nat 玩游戏,转发 port 都不方便。就是为了这点醋包的饺子
    piero66
        19
    piero66  
       16 天前
    arm64 官方卖的 routeros 可以安装 zerotier ,用 zerotier 一键回家就行了
    MYDB
        20
    MYDB  
       16 天前 via iPhone
    同意楼上的,给下载器起个 macvlan 容器
    sampeng
        21
    sampeng  
    OP
       16 天前 via iPhone
    我现在还有个问题没解决,策略路由是排除在 fasttrack 之外的。肉眼可见的影响主路由 cpu…没想到有什么好的办法
    zsneoks
        22
    zsneoks  
       16 天前
    @piero66 zerotier 速度太难受了。直连之后爽多了。
    Richared
        23
    Richared  
       13 天前
    之前折腾过,发现,什么 vpn ,什么零信任,都不如自己在家搭一个 ss 。客户端分组加上家里设备的域名/ip 规则,无缝使用。还不用安装其他的代理工具。
    likeflower
        24
    likeflower  
       12 天前
    @vhus IP Cloud 可以用啊,只是没备案的不常见域名,运营商 dns 有时候解析不了
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3152 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:05 · PVG 08:05 · LAX 17:05 · JFK 20:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.