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

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

装修完后,就一直没弄,网络拓扑非常简单,光猫拨号->华为 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 不能改桥接,结果我不是。后面就很顺利了,远程就給我把光猫改桥接了。
2220 次点击
所在节点    宽带症候群
24 条回复
damichifan
18 天前
很强,非程序员看不太懂,回家不卡顿,是通过云服务器中转执行的吧
sampeng
18 天前
@damichifan 不,p2p 意味着点对点。我中转也在家里。没有云服务器什么事。上行 40-70M ,不可能卡顿。除非运营商限流,那我没办法…
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
18 天前
比较悲催的是 mikrotik 官方自带的 ddns 已经不能使用了,更新包也要手动刷了。
sampeng
18 天前
@vhus 巧了,我正准备这么做,我是群晖,有两个网口。就是因为梯子把整个群晖屏蔽了,还是非常难受。

同理,ddns 是在群晖上继续服役。
没办法,华为 q6 没办法改成桥接,网上有邪路,但漫游功能就没了…得不偿失。还好手机其实无所谓…按之前网络拓扑本来手机就都是两层。所以这次改造最主要是把 pc 、nas 、这些都直接挂路由下。
谢谢建议。wg 回家确实香,就是不知道这种 vpn 可以用多久,感觉特征也很明显,迟早被干扰
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
18 天前
@vhus 这个有点牛逼…
vhus
18 天前
@sampeng 华为 Q6 我没用过,既然是光猫配置应该都差不多,获取到超级密码应该能改桥接吧,我认为 app 的功能用处不太大。如果能改桥接用 routeros 接管 pppoe 和 dhcp 和主路由 就方便很多了。
wangclack
18 天前
广告拦截什么方案,麻烦展开港一港啊,自己折腾的感觉没你的效果好。
sampeng
18 天前
@wangclack 广告都是差不多的方案,但其实还是有广告,app 里的现在都学聪明了。我试了几个过滤方案都没什么用。我测试了一下,明显网页看视频如果开了广告过滤,就让你用 app 。可能是先试的网页,觉得效果不错。但实际用 app 。该开机广告还是开机广告。。哎。。。
hackroad
18 天前
上海电信 wirguard 会限速 5Mbps ,北京居然没事。。。
maybeonly
18 天前
vlan 是有利弊,不过我自己实践的话还是有必要用,因为在一定情况下可以简化配置。
好处:
* 结合 ap 的 ssid ,将不同策略的东西丢进不同的 vlan ,例如国产 iot 和 bt 不需要走梯子
* 可以指定个别 vlan 去个别特殊出口,如“北美直通车”
* 个别 vlan 可以自定义 ipv6 ,例如针对 iot 的不给 v6 ,默认 vlan 的 fd 开头私有地址,针对 bt 的下发特定 wan 口的 pd 地址(以及对应的路由)

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

现状是除了默认还用了 3 个 vlan 。虽然除了自定义 v6 其他都已经在默认 vlan 实现。
sampeng
17 天前
@maybeonly 同意你的考虑,我也是这么考虑的,我一开始是用 address list 来逻辑建的。但是还是麻烦,还是 vlan 比较干净,逻辑比较清晰。反正只配一次,家里就那么几个设备。10 个口也插不错。
ToDyZHu
17 天前
R6s 感觉不还是旁路由吗,只不过在 routeOS 中提前分流了一下,然后是不是需要在 routeOS 中指定 DNS 为 OpenWrt 的地址呢?
sampeng
17 天前
@ToDyZHu 我理解他不是把网关指向过去。提前分流的好处是,其实内网 99%的流量都不需要经过 openwrt 。1%那是我晚上回家查东西工作之类的。dns 其实可指可不指。我是为了有个 dns 过滤。
zsneoks
17 天前
pt 绕过梯子的问题直接给 pt 容器一个单独的 ip ,然后过滤掉它不行吗? ddns 的话直接起个 ddns-go 容器就 ok 了吧。都是几分钟的问题?
zsneoks
17 天前
另外回家的问题,我是直接在家里随便 nas 或哪里挂个 ss server ,直接直连了。
sampeng
17 天前
@zsneoks pt 没用容器,直接套件,容器有点问题,懒得查了,就直接部署的。
至于回家用 ss ,就是仁者见仁 智者见智了。
其实主要目的是为了折腾,其次是两层 nat 玩游戏,转发 port 都不方便。就是为了这点醋包的饺子
piero66
16 天前
arm64 官方卖的 routeros 可以安装 zerotier ,用 zerotier 一键回家就行了
MYDB
16 天前
同意楼上的,给下载器起个 macvlan 容器

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

https://ex.noerr.eu.org/t/1141046

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

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

© 2021 V2EX