浏览器不支持(未启用)JavaScript,本页面的某些功能无法正常使用

家庭路由和组网分流方案

Divider Line

花了很多时间解决家庭路由问题。

最一般的用途上,电信运营商提供光猫,光猫兼路由功能,上门安装的师傅包办了,稍微大户一点的家庭,会需要路由器,乃至AP、交换机,这些产品都是出厂配置好了的,照着说明书几步就搞定。

难在想要自定义路由,想要有软件的功能。

我实际需求中得路由器上解决的,包括并不限于:

  1. 网络中转和分流
  2. 异地组网
  3. 网络监控和上网保护
  4. 游戏加速器
  5. 网络容灾(这个范围很广,例如路由器一级的ddns、内网穿透)

不在路由上解决行不行?可以,但通常更复杂,使用起来更麻烦,也有更多不可预知的故障。举例来说:网络中转和异地组网,这些本质上要接管全局的网关流量,如果不用路由器上的透明化方案,那得在每个设备上都安装客户端(如果有相应软件的话),并且有些功能可能无法使用,例如24小时在线的服务,这很重要,例如家里的NAS服务器掉线了,在外地可以登录到路由器检查情况,并重新唤醒设备。

既然网关上的软件功能必不可少,针对不同的路由拓扑又产生了很多不同的实施方案,这里不探讨各种方案,而是直接给出我认为目前家庭(包括个人)或小型办公环境最合适的理由:

  1. 光猫拨号而非路由器拨号。
    理由很简单,为网络容灾。既然路由器需要折腾,那么它的稳定性将会受到影响,在网络故障时,紧急换到光猫上网,况且光猫还带IPTV功能,没必要占用路由器的接口。
  2. 使用AP而非多级路由。
    需要多台路由器的话,共享同一WIFI和局域网能极大的优化网络的复杂性,而AP组网是目前大部分路由器都具有的功能,从而减少网络配置和局域网内调用服务和资源所花费的时间。
  3. 使用硬路由而非软路由做主路由
    硬路由有WIFI和网口,出故障时方便调试,只读的系统便于快速恢复,内部软件环境也较为简单,不容易因为断电或做了什么操作导致故障,这对主网关来说很重要。
  4. 在主路由器上安装涉及到网络拦截的软件而非旁路。
    这方面我摸索了较多时间才得出这个结论,这需要软件的安装和使用经验,举例来说:tailscale是一款内网穿透和异地组网软件,如果把它安装在本地服务器或AP上作为旁路由模式给其他设备使用,的确它可以作为出口节点或者子网通告的中转节点,但无法以透明代理的方式使用,也就是说假设你在旁路由上安装了tailscale,外地可以连接上并用它访问家里的局域网,但是如果想要在家里访问外地的taiscale网络,则必须在本地设备上也另外安装tailscale,我尝试了很多种方式也无法做到这种分流。

为什么会产生那么多的方案,一个重要的原因,就是路由器的自定义软件相关功能做得很差,首先大部分路由器出厂的系统无法安装插件,现在流行的路由器玩法基本上都是在破解出厂的基础上进行的,首先破解SSH(或者telnet),然后刷固件;另一方面,路由器可用的存储空间(闪存)很小,通常只有十几MB到几百MB,而我上述提到的两款软件,加起来就要100MB,再算更新所需要的空间,150MB才算够用的,而闪存是板载的,基本上告别了扩展性。

厂商可能更多的考虑路由器的稳定性、功耗、安全合规以及产品差异化策略,高端的路由器也可以有这些东西,但从自定义软件的角度来说性价比就低,高端路由器明显针对那些有特殊需求且不愿意折腾的用户,例如游戏玩家、办公环境。

极客们也可以选择扩展性丰富的工控机、小主机作为路由,但前面的结论说了,软路由不适合做主路由,而且性能过剩,性价比不高。

于是折中的方案来了:在现有的硬路由器上刷开源的openwrt路由固件,有许多路由器可以破解,有些还提供官方的支持,例如我刚买的cudy tr3000这款,而openwrt的特点是系统存在于只读的分区,并且提供一个可写的overlay,适合用来安装插件,并且系统配置丰富当然缺点是比一般路由系统更复杂需要学习成本。

官方的openwrt固件非常简陋,例如tr3000上有USB接口,但官方固件甚至没有提供相应的功能,需要自己安装依赖包启用,官方也不会改出厂的分区设置,简而言之,官方固件没有定制,只是针对支持的设备做了适配,于是有了各种各样的第三方固件,网上讨论的主要也是各种定制的固件包,传来传去,我的看法是,为安全和稳定性起见,最好用官方的固件,并且教程优先参考官方的,openwrt初上手很复杂,主要是看不懂它的各种参数,其实熟悉之后需要设置的就那么几项。

接下来,我将介绍Openwrt使用无线中继上网方案;改U盘作为系统读写分区,两台openwrt 组AP;安装配置openclash和tailscale插件。

Openwrt将U盘扩展为默认读写分区

完全参照官方教程:[OpenWrt 维基]Extroot 配置

最好使用新的U盘,按教程格式化,如果要从已有的/overlay分区迁移(新系统不需要),则把它复制出来,安装完之后再复制到U盘的分区里去。

安装完之后可以在UI界面的系统-挂载点看到U盘。原有的闪存空间(这里的挂载点显示为/dev/ubi0_2)则被挂载到新的分区。

另外需要注意的一点U盘挂载后不要尝试使用 opkg upgrade 进行升级,因为分区可能会更改 UUID,因此 extroot 安装可能会失败。

Openwrt使用无线中继上网方案

有线联网很简单,wan口插上网线就行(除非拨号否则不需要配置)。而无线中继是将其中一个无线模块(建议5G)连别的WIFI,并且创建自己的无线网络。有线中继和无线中继并用,可以实现网络容灾。

在网络-无线那里,在radio0(2.4G)或radio1(5G)那里点扫描,它将搜索附近的WiFi热点,找到想要连接的那个,点击加入网络,它会自动匹配工作频率(模式、信道、通道宽度),当前是客户端模式,了解一下即可,这些不要改,直接保存。

系统将自动创建一个wwan接口,在网络-接口那里,可以看到IP地址,这时候如果上游有ipv6(如果是PD模式的化最好),还可以创建一个接口:协议 DHCPv6,设备指向之前创建的@wwan接口,其他不用管,保存即可。可以看到该接口成功获得了ipv6并分配了一个给lan口,如果没有,那可能跟上游配置有关,需要更多的手动配置,具体网上有更多教程。

系统自带的wanwan6接口是给上游有线连接用的,可以删掉或者禁用——编辑——禁用该接口并取消选中开机自动运行。

这时候如果路由器和电脑有线连接的化就可以上网了。

接下来开启WIFI。回到网络-无线界面。

启用radio0和radio1下的WiFi,无线网卡连了上游热点之后仍然可以创建自己的WiFi网络,模式选择 接入点 AP,其他默认。

在某个频段(例如5G)连了上游WiFi,创建自己同样频段的无线接入点时,工作频率让它默认就好了,它会和上游一致。

如果创建的接入点WIFI处于处于无法启用的状态或者连不上:

  • 有些路由器可能需要手动选择国家代码——可以选AU-Australia 澳大利亚,默认的可能会没信号。
  • 如果没信号的话,可以尝试手动调整工作模式(2.4G推荐N,5G推荐AX)和通道宽度(2.4G 推荐20MHz,5G推荐80MHz)。
  • 有些终端设备(例如小米的某些智能家居产品)无线网卡较旧,只支持旧的加密算法,因此需要在无线安全中改用WPA-PSK/WPA2-PSK Mixed M的加密方式,而非默认的WPA2-PSK/WPA3-SAE Mixed Mode

多台路由器组AP

首先主路由要用静态地址,选一个和上游网关(一般是光猫 192.168.1.1)不一样的ipv4地址,例如192.168.30.1,ipv4 子网掩码 255.255.255.0,启用DHCP服务器。这些一般都是默认配好了的。

AP路由器先不连主路由,而是lan口有线连电脑(Openwrt系统默认没有启用WiFi),进入后台(默认192.168.1.1),改lan接口(静态协议)的IPv4地址,要和主路由同一网段并不一样的IP,并且不要和主路由的DHCP地址范围冲突(默认是100~255区间)在示例中是 192.168.30.2。

保存应用,进到新IP页面,继续编辑lan接口,IPv4子网掩码 255.255.255.0,ipv4网关选上游路由器地址(示例192.168.30.1),在高级设置中使用自定义DNS服务器也填这个地址。然后在DHCP服务器-常规设置中选择忽略此接口。

重点来了,lan接口的DHCP服务器-IPv6设置同样要禁用,禁用RA服务、DHCPv6服务和NDP代理。否则配置完之后这台AP路由器会连不上,有些客户端如Windows默认ipv6优先,如果开了DHCPv6,会无法访问AP路由器。

删除或禁用系统自带的wanwan6接口,禁用——编辑——禁用该接口并取消选中开机自动运行。

wan物理接口就浪费了,如果也想把它当作lan口利用起来(AP路由器相当于一台交换机),在接口,设备中,配置lan接口的设备(br-lan),在网桥端口将 wan口的设备(以太网交换机,ech0)也选上。

保存并应用,然后让主路由的lan口连这台AP的任一lan口,如果上一步把wan口也并入lan的话,也可以插wan口,然后就可以上网了,并且正常访问到主路由和AP的页面,如果访问不到AP,重启一下。

有可能IP地址冲突,注意是否在主路由的DHCP地址范围,有没有关闭AP的DHCP和DHCPv6。

还有一种AP方式,先让下级路由连主路由,主路由会自动给它分配一个DHCP地址,然后在下级路由lan口协议改为DHCP客户端,其他和前面的设置一样。这样创建的AP地址不固定,不妨碍上网,如果想要固定,可以在主路由中为它创建静态地址分配,网络——DNCP/DNS——静态地址分配——绑定MAC地址和IP,不过这种情况要填AP路由器的物理地址,也就是WAN口的地址(或者在路由器的外壳上可以看到),lan口的地址每次重启可能会随机变动。

AP路由上的一些服务没用可以关了:dnsmasq、firewall、odhcpd,在系统-启动项禁止启动就行。

无线漫游

在每台AP路由器的WIFI接入点的接口配置中启用802.11r 快速切换,移动域输入一个4字符的十六进制。其他默认。

每个AP路由器创建和主路由同名并且密码及加密方式一致的WIFI接入点,802.11r的移动域也要相同,工作模式和通信宽度最好也一样。信道如果附近热点密集(在状态-信道分析可查看附近的热点状态,选一个较少重叠的)则使用不一样的避免干扰,如果附近热点不多则可以一样,漫游切换速度更快。

安装插件

先提一点:官方的openwrt没有中文,需要自己安装中文包(搜索zh-cn)。

你的网络环境可能无法连接到openwrt默认的软件源地址,不建议修改软件源。要么先连一个无障碍的热点网络,要么在SSH中操作——使用临时代理。

在系统——管理权页——SSH访问页,指定端口和接口:

记得给路由器配置密码,并避免远程主机访问SSH端口。

随便一个终端登录SSH:ssh -p 22 asus-root@192.168.30.1

执行以下命令:

export http_proxy="http://代理IP:端口"
export https_proxy="http://代理IP:端口"
export ALL_PROXY="http://代理IP:端口"
opkg update
## 接下来可以安装各种opkg插件包
opkg install xxx
# 取消临时代理
unset http_proxy https_proxy ALL_PROXY

注意有些插件安装完之后可能需要重启系统才会生效,例如tailscale。

安装Tailscale(可选自建中继服务)

安装Tailscale的教程参考openwrt的官方教程:[OpenWrt Wiki] Tailscale

tailscale up 有几个参数:

  • --advertise-routes=192.168.50.0/24:可以公布本地局域网给异地组网的设备,也就是异地可以访问本地局域网的设备。注意不能在多给节点通告同一个子网,会冲突导致无法访问网关。
  • accept-routes:接受其他节点的局域网公告。
  • --accept-dns=false,不使用Tailscale的MagicDNS,它可以让设备以域名访问你tailscale 而不用tailscale为设备分配的ip,不过它可能和openclash冲突(DNS劫持)故取消。
  • --advertise-exit-node:将此路由器节点作为异地设备的出口节点,意味着非本局域网的设备也能当作本局域网设备访问外网。
  • --reset:启动时重置之前的设定。

自建Tailscale Derp 中继服务,免域名并使用自定义端口

官方的tailscale中继服务器都在国外,没用线路优化,访问速度太慢了,自建节点的话可以在自己的高品质线路vps用域名的方式,但延迟必然比较高,或者用国内云服务厂商的,过去也需要域名,而国内域名需要备案,比较麻烦,又非官方的用ip自签名的方法,据说最近tailscale也支持了,只不过没有写在教程里。

服务器上80和443端口被nginx占用了,tailscale要求开放:

  • 端口 80 (HTTP): Tailscale DERP 服务器需要此端口,且不能更改。这通常用于 Let's Encrypt 的 HTTP-01 验证,或者可能是一些初始探测。
  • 端口 443 (HTTPS/DERP over TLS): Tailscale DERP 服务器默认使用此端口,但可以通过 DERPNode.DERPPort 更改。
  • 端口 3478 (STUN): Tailscale DERP 服务器默认使用此 UDP 端口,但可以通过 DERPNode.STUNPort更改。

自签名的证书,就没有必要验证了,因此80端口可以禁用,而443端口可以改别的,那太好了。参考这篇文章:Tailscale 搭建derp中继节点,不需要域名,不需要备案,不需要申请证书(最新) - yafeng - 博客园,略作修改,步骤如下:

  1. Ubuntu或其他linux系统安装1.23以上版本go(通过apt upgrade的官方仓库里的版本太旧了,Ubuntu可以通过 snap install go --classic直接安装最新版。
  2. 国内环境需要为go设置代理:go env -w GOPROXY=https://goproxy.cn,direct
  3. 运行taiscale官方命令:go install tailscale.com/cmd/derper@latest
  4. 将安装的derper命令换到 usr/bin目录:sudo cp ~/go/bin/derper /usr/bin/·
  5. 用自己服务器的公网IP生成自签名证书:
## 切换到准备存放证书的目录
cd /ssl/derper
## 换成自己的IP
DERP_IP="12.12.12.12"
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout ${DERP_IP}.key -out ${DERP_IP}.crt -subj "/CN=${DERP_IP}" -addext "subjectAltName=IP:${DERP_IP}"
  1. 启动derper,其中禁用80端口和将https端口改为非443端口(例如3443):
  • derper --hostname="12.12.12.12" -certmode manual -http-port -1 -a :3443 -certdir ./
  1. 服务器开放https和stun端口(阿里云在安全组里面)
  2. 访问https://公网IP:3443查看是否启用成功,正常成功启用。
  3. 将derper创建为系统服务(参考13步)
  4. 到tailscale的网关页面的Access Controls里面添加一个配置:
"derpMap": {
    //"OmitDefaultRegions": true,  //加入这个会只用自己的节点
    "Regions": {
        "901": {
            "RegionID":   901,//大于900的树
            "RegionCode": "myipderp",//随便
            "RegionName": "My IP DERP Server",//随便
            "Nodes": [
                {
                    "Name":     "901a",//节点名称
                    "RegionID": 901,
                    "HostName":         "aliyun", //这个随便写
                    "IPv4":             "12.12.12.12", //改成自己的IP
                    "DERPPort": 3443, // *** 你设置的自定义 DERP HTTPS 端口 ***
                    // STUN 端口也可以自定义
                    // "STUNPort": 3478,               // STUN 端口 (默认可省略)
                    "InsecureForTests": true,
                },
            ],
        },
    },
},
  1. 到自己的taiscale节点终端可以检查一下自建服务器的状态(可以看到延迟低很多):
:~# tailscale netcheck

Report:
        * UDP: true
        * IPv4: yes, 123.123.123.123:13831
        * IPv6: no, but OS has support
        * MappingVariesByDestIP: false
        * PortMapping:
        * CaptivePortal: false
        * Nearest DERP: My IP DERP Server
        * DERP latency:
                - myipderp: 17.4ms  (My IP DERP Server)
                - tok: 145.5ms (Tokyo)
                - sfo: 185.4ms (San Francisco)
                - sin: 187.7ms (Singapore)
                - hkg: 190.6ms (Hong Kong)
                - lax: 199.7ms (Los Angeles)
                - sea: 207.1ms (Seattle)
                - den: 213.5ms (Denver)
                - nue: 224.8ms (Nuremberg)
                - dfw: 227.4ms (Dallas)
                - ord: 237.2ms (Chicago)
                - hnl: 238.5ms (Honolulu)
                - iad: 255.8ms (Ashburn)
                - tor: 263.1ms (Toronto)
                - mia: 263.9ms (Miami)
                - blr: 264ms   (Bangalore)
                - par: 265.8ms (Paris)
                - nyc: 266.5ms (New York City)
                - lhr: 266.8ms (London)
                - ams: 269.3ms (Amsterdam)
                - fra: 283.4ms (Frankfurt)
                - hel: 288.3ms (Helsinki)
                - waw: 289.2ms (Warsaw)
                - mad: 295.2ms (Madrid)
                - syd: 357.3ms (Sydney)
                - sao: 380.9ms (São Paulo)
                - dbi: 382.1ms (Dubai)
                - nai: 436ms   (Nairobi)
                - jnb: 441.1ms (Johannesburg)
  1. 其他检查命令:
  • tailscale status:查看网络中哪些设备是直连,哪些通过什么中继节点连接(优先自建的);
  • tailscale ping xxx:直接通过tailscale ping检查节点是否可以连通。
  1. 最后一步:将derper创建为系统服务:
  • 创建服务配置:nano /etc/systemd/system/derper.service
[Unit]
Description=Tailscale DERP Server
After=network.target # tailscaled.service 可以选择在 tailscaled 之后启动,如果需要验证客户端等
Wants=network.target # 确保网络在线后启动

[Service]
# User=derpuser # 建议使用一个专门的非 root 用户,如果报错,删除这一行(阿里云主机)
#WorkingDirectory=/path/to/where/you/want/derper/to/run/from # 可选,如果需要
#Environment="HOME=/path/to/user/home" # 如果需要指定 HOME 环境变量

# --- 修改这里的 ExecStart 命令 ---
ExecStart=/usr/bin/derper \
    --hostname="8.137.13.93" \
    -a :3443 \
    --http-port=-1 \
    --certmode=manual \
    --certdir="/ssl/derper" \
    --stun-port=3478

Restart=always # 进程退出时总是尝试重启
RestartPreventExitStatus=1
RestartSec=3  # 重启前等待 3 秒

[Install]
WantedBy=multi-user.target
  • 执行启动命令并检查:
sudo systemctl daemon-reload
sudo systemctl restart derper.service
sudo systemctl status derper.service
  • 如果不报错,则设置为开机自启:systemctl enable derper.service

嫌麻烦可以用公开的derp服务站,不保稳定和安全:搭建Tailscale中继节点|白嫖DERP中继节点|低调分享 - 爱墨迹

其他插件和注意事项

Divider Line
标签: 自托管
作者: 宁迦
日期:2025年05月02日

评论