如果你长时间不在家,AIB (All in boom) 的服务模式可能并不是一个好的选择,虽说有很多手段对虚拟机中的服务进行优化,但当遇到一些突发情况如 断电/小孩出击 时可能会发生 宿主机爆炸 等意外场景。此文章对此架构进行了优化,将漏油器分离以维护稳定的远程访问,同时通过旁路 OSPF 的方式保有卵漏油的动态插拔。

漏油器选型

一个稳定的外置嗯漏油器是很重要的,由于要做动态旁路,那么首选是 RouterOS。在家用宽带多为千兆的情况下,最具性价比的选择便为千兆漏油器 + 2.5G 交换机(Optional)了。现今推荐的型号如下 (性能升序):

  • RB750Gr3 (MMIPS MT7621A,小黄鱼250r)
  • RB760iGS (硬件同上,但多一个光口, PoE)
  • RBD52G (ARM32 IPQ-4018, WiFi)
  • C52iG (ARM64 IPQ-6010, WiFi, PoE)

如果你颇有家资,也可以考虑:

  • RB4011iGS (ARM32 AL21400, PoE)
  • RB5009UPr (ARM64 88F7040, PoE)

博主穷所以只买了 RB750Gr3,由于小包处理能力不是很好,PT/BT 极限大约 50 MB/s,此时漏油器 CPU 占用约 50%,也够用的。正常测速在 800 Mbps+,接入 2.5G 交换机做内网也是个好的选择。如果是在学校寝室用,可考虑 RBD52G 或 C52iG,由于是 ARM 架构,也可以直接使用 Container 做些事情。

RouterOS 配置

自行配制好拨号/局域网后:

开启 fast-track

/ip firewall filter add chain=forward action=fasttrack-connection connection-state=established,related
/ip firewall filter add chain=forward action=accept connection-state=established,related

配置 IPv6

  1. 在 IPv6 -> DHCP Client 中新建

2024-04-06T03:14:56.png

  1. 在 IPv6 -> Addresses 中分配一条给 bridge

2024-04-06T03:17:30.png

  1. 配置 IPv6 -> Firewall

在 Mangle 中的 forward 链对 TCP & SYN 的链接做一次 Clamp to PMTU,解决 IPv6 包过大的问题。

2024-04-06T03:20:05.png

由于 PD 会自行生成一条可用配置所以你并不需要额外的操作。

配置 DNS

首先你需要记住运营商给你自动分配的 DNS,比如电信 (61.132.163.68,202.102.213.68),在后面的步骤中可能有所作用。

为了使旁漏油能够热插拔,我们不能简单的用 DHCP 选项更改网关与 DNS,这样当旁路宿主宕机时家用设备都会失联。

  1. 配置静态 DNS

你需要将一些国内能访问到的关键服务加入静态 DNS 并 FWD 到 223.5.5.5 中,避免 DNS 在切换时造成某些问题。

这里我加入了以下域名,做参考:

  • api.day.app (Bark 通知)
  • api.cloudflare.com (DDNS 服务使用)
  1. DNS 脚本 (加入 System -> Scripts)

use-default-dns

/ip/dns/set allow-remote-requests=yes cache-size=4096KiB servers=61.132.163.68,202.102.213.68 
/ip dns cache flush
:local BarkUrl "https://api.day.app/<your_token>"
/tool fetch http-method=post mode=https url="$BarkUrl" http-header-field="Content-Type: application/json; charset=utf-8" output=none http-data="{\"title\":\"Router / DNS Switch\",\"body\":\"Telecom Activate\"}"

use-sgw-dns (此处 servers 改为你旁路 IP)

/ip/dns/set allow-remote-requests=yes cache-size=4096KiB servers=192.168.5.254
/ip dns cache flush
:local BarkUrl "https://api.day.app/<your_token>"
/tool fetch http-method=post mode=https url="$BarkUrl" http-header-field="Content-Type: application/json; charset=utf-8" output=none http-data="{\"title\":\"Router / DNS Switch\",\"body\":\"Side Router Activate\"}"

dns-lease (用于将 DHCP Lease 能够得到解析)

RouterOS 这点上很烂,不如 dnsmasq,如果你是 ARM 架构可以考虑用 Container 运行 dnsmasq 取代自带的 DHCP/DNS 服务
:local DHCPtag
:local topdomain;
:local hostname;
:local hostip;
:local skip;
:local protected;
:local ttl
:local leaseServerName

:set DHCPtag "#DHCP"
:set leaseServerName "dhcp1"
:set topdomain "lan"

/ip dhcp-server
:set ttl [ get [ find name=$leaseServerName ] lease-time ]
  

/ip dhcp-server lease;
:foreach i in=[find where status="bound"] do={
  /ip dhcp-server lease;
  :if ([:len [get $i host-name]] > 0) do={
    :set hostname ([get $i host-name] . "." . $topdomain);
    :set hostip [get $i address];
    /ip dns static;
    :set protected false;
    :set skip false;
    :foreach di in [find] do={
      :if ([get $di name] = $hostname) do={
        :if ([get $di comment] = $DHCPtag) do={
            :if ([get $di address] = $hostip) do={
                :put ("Unchanged: " . $hostname . " : " . $hostip);
                :set skip true;
            } else={
                :put ("Removing: " . $hostname . " : " . $hostip);
                remove $di;
            }
        } else={
            :set protected true;
            :put ("Protected: " . $hostname . " : " . $hostip);
        }
      }
    }
    :if (!$skip && !$protected) do={
        :put ("Adding: " . $hostname . " : " . $hostip);
        /ip dns static add name=$hostname address=$hostip ttl=$ttl comment=$DHCPtag;
    }
  }
}

未完待续

累了,明天再继续写

Last modification:April 6, 2024
如果觉得我的文章对你有用,请随意赞赏