如果你长时间不在家,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
- 在 IPv6 -> DHCP Client 中新建
- 在 IPv6 -> Addresses 中分配一条给 bridge
- 配置 IPv6 -> Firewall
在 Mangle 中的 forward 链对 TCP & SYN 的链接做一次 Clamp to PMTU,解决 IPv6 包过大的问题。
由于 PD 会自行生成一条可用配置所以你并不需要额外的操作。
配置 DNS
首先你需要记住运营商给你自动分配的 DNS,比如电信 (61.132.163.68,202.102.213.68),在后面的步骤中可能有所作用。
为了使旁漏油能够热插拔,我们不能简单的用 DHCP 选项更改网关与 DNS,这样当旁路宿主宕机时家用设备都会失联。
- 配置静态 DNS
你需要将一些国内能访问到的关键服务加入静态 DNS 并 FWD 到 223.5.5.5 中,避免 DNS 在切换时造成某些问题。
这里我加入了以下域名,做参考:
- api.day.app (Bark 通知)
- api.cloudflare.com (DDNS 服务使用)
- 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;
}
}
}
未完待续
累了,明天再继续写