新网络,有点灵(一)
新网络,有点灵(一)
最近搬了新家,空出个小屋子没人用。正好屋子面积又小又有空调,很合适作为机房。于是搞了个机柜,买些洋垃圾[1],把业务从 workstation 都搬去机柜了。之前受限于面积,基本所有业务都由一台跟了我7年的忒修斯电脑承载——当然也有一台路由器。
过去十年来用的一直都是 Ubiquiti EdgeMax 系列路由器。从 ER-Lite 到 ER-X,再到 ER-Pro-8 和 ER-4,有那么一段时间还是挺好用的。随着 Ubiquiti 放弃 EdgeMax 产品线,很多功能开始逐渐灵车化了。在2023年的今天,这台古旧的 ER-Pro 已经难以满足多样的网络需求了。
业务
狡兔三窟,site 当然是不可能只有一个的。之前经过多方考察与实践,各 site 之间最终还是采用了 star topology 互联——所有的 site 都有 uplink 到云服务器(Azure 上海、阿里云杭州)上。Tunneling 采用 wireguard,毕竟距离短也没有出境,上行带宽跑满没啥问题。
苏州电信和杭州电信还是相当大方的,两边都可以拿到公网IP,所以IPSec曾经也是一个选择。但 EdgeOS 的实现过于灵车,VTI 一直没有支持,charon 在 BGP 跑起来之后也经常吃满CPU,就此作罢。
跨 site 之间有语音通讯的需求,所以网络内有一台PBX. 这台PBX有两条语音的 uplink,一条是电信的固定电话,一条是 Twilio 的 SIP Trunking. 电信由于语音IP网是一张 squatting 的大内网,配置更加灵车,在我一篇还没写完的文章里会有讲述。
本地的其它基础设施就都是些常见的服务了,存储、计算、家庭自动化,没有什么特别需要注意的配置。
子网划分上,基本延续了搬迁之前的设计。
- 访客网络独立于内部网络,采用单独的路由策略(直接从电信的口送出去),同时开启 client isolation
- 内部网络的路由策略是按运营商分流的。路由器BGP全表收进来,根据prefix的AS Path选择移动、电信或者BUNNY出口
- Infrastructure 和 device subnet 没什么特别的规则
- IoT subnet 是一个受限的内部网络里,只能访问 IoT gateway 或者其它 IoT 设备
- 考虑到会有些熟悉的朋友来玩,引入了一个 trusted guest 网络。Trusted guest 虽然使用了访客网络相邻的地址段,但路由策略和内部网络保持一致(可以看些奇怪的东西),同时添加了一些防火墙规则,只能访问内部网络的 infrastructure 段
- Management subnet 插了各个设备的 management port 和 iDRAC,没有什么特别的规则,除了一堆防火墙
实施
之前捡了台 Juniper NFX250 放在了美国。这些年受海关、航运等因素影响,一直没能送回国内。几番周折,最近终于拿到了手。NFX250 是个好东西,当你需要它是 MX150 的时候,它就是 MX150;当你需要它是 SRX 的时候,它就是 SRX。尤其是当我们有 vSRX 快乐密钥的时候,它可以给你带来更多快乐🤪。
这些年很流行一种旁路路由,试过之后不得不说这是一种好东西。毕竟路由器本身很难支持一些灵车(当然也有不灵的)协议。相比较与之前把所有的协议都放在 EdgeOS[2] 上跑,的确是增加了很多配置,也增加了失效的概率,但是提供了前所未有的 flexibility. 实施上一个基本的思路是所有的 tunnel 都在这个旁路上面打,然后路由器只负责路由。
具体到这里的方案上,vSRX作为防火墙与路由器,上联两条运营商的线路。旁边的 Debian 与 vSRX 建立三条虚链路,其中两条通过 vSRX 路由至上游运营商,即电信和移动。另一条作为 vSRX 的上游——由这台机器 tunnel 至 Bunny 网络。如果 tunnel 有很多个的话,甚至可以在这台机器上做 HA.
配置
NFX250 自身没有什么好配置的,interface fxp0
是 management ethernet,ge-0/*/*
和 xe-0/*/*
是前面板上我们会插的那些 port. set vlans
以后我们就可以 set interfaces ge-0/0/0 unit 0 family ethernet-switching vlan members
了。如果这个 vlan 会在 VNF 里用的话记得也 set vmhost vlans
.
VNF 的 qcow2 按照 Juniper的文档,可以选择放在 Host 的 /var/third-party/
下面。但是这个地方的存储空间没那么大,而且在 vjunos 里不能直接访问到,所以我还是建议放在 /var/public
下面。这个目录是 mount 在 vjunos 同名目录下面的。
如果我们想 cross connect 几台 VNF 的话,配置也是很简单的:
# name it to cc-br or whatever you want
# MTU max 2048
set vmhost vlans cc-br vlan-id none
set virtual-network-functions my-stupid-vnf-1 interfaces eth2 mtu 2048 mapping vlan members cc-br
set virtual-network-functions my-stupid-vnf-2 interfaces eth2 mtu 2048 mapping vlan members cc-br
按照上一篇文章的思路,我们可以添加两个 VNF,一个是 vSRX 路由器,一个是 Debian 的灵车隧道。可以选择把 Debian 装好以后送 qcow2 上去,也可以就地创建一个新的 qcow2 然后用 ISO 安装。至于 vSRX,可以把 Juniper 提供的 qcow2 直接送上去用。下面附上 Debian VNF 的示例配置:
image {
/var/third-party/debian.qcow2;
}
virtual-cpu {
0 {
physical-cpu 3;
}
1 {
physical-cpu 5;
}
count 2;
features {
hardware-virtualization;
}
}
interfaces eth2 {
description "CC to vSRX";
mtu 2048;
mapping {
vlan {
members cc-br;
}
}
}
memory {
size 2097152;
features {
hugepages {
page-size 1024;
}
}
}
storage hda {
type {
cdrom {
source {
file /var/public/debian-11.7.0-amd64-netinst.iso;
}
}
}
}
拓展阅读
饼干大师的文章里对 NFX250 有详细的描述。简而言之,这就是台路由器形状的小电脑。电脑里面是 Intel 的处理器、Intel 的万兆卡(摸不到)。万兆卡下联一个交换机,交换机接口就是前面板那些(能摸到)。如果是 NFX3 的话,系统会跑 Wind River Linux. 这个 Linux 一般也不需要访问,都是通过 vjunos 去控制它,即我们直接登录到 NFX250 上面对的那个系统。这个 vjunos 是一个 KVM guest. 如果我们需要增加其他的 virtual network functions 的话,也是作为 KVM guest 放上去。
基本的配置可以依照饼大师的文章来,内存硬盘可以都升级一番,但也有几点要注意。NFX250 有四个 DIMM 槽位,单条支持 mem 最大只支持 16G,即这台机器最大只能有 64G 内存——试了单条 32G 插上去不会 boot. 另外,如果 VNF 的 eth 不止一个的话(不算系统自带的那两个),最好还是可以进一下这个 host Linux 里面看一下 VNF domain XML,很有可能 VM 里面的 eth 编号和 vnf config 的 eth 编号不同———可能需要手动 match guest 和 config 里的 MAC——网络不通花了我非常多的时间才发现这个问题,一度以为是它的软件 bug(这个也应该算 bug 吧?应该算吧??)。
因为 host 里面是 libvirt,所以 virt-manager 是可以用的,也可以直接 VNC 连接它。这在安装 Windows Server 的时候会尤其有用,毕竟不用配置 unattended,也不用配置串口了。如果想 virt-manager 的话,需要做一些配置才能正常使用:
- 进入 Linux Host,把 SSH public key 放进去 (
.ssh/authorized_keys
),或者直接ssh-copy-id
- 在 Host 下
/etc/libvirt/qemu.conf
启用 libvirt/QMEU 的 VNC 功能vnc_listen=0.0.0.0
,需要重启 NFX250 以生效设置 - 启用 domain 的 VNC graphics (
autoport
也行,forwarding 的时候记得自己计算)
<graphics type='vnc' port='5900' autoport='no' listen='0.0.0.0' />
- 启用 SSH 和 VNC 的 port forwarding,因为 Host 没有直接暴露出来的地址,我们需要在 vjunos 里面做 forwarding
start shell user root
# Forward SSH, port 2222 to host 22
ssh -JU __juniper_private4__ -L 0.0.0.0:2222:localhost:22 [email protected] -NTf
# Forward VNC, port 5900 to host 5900
ssh -JU __juniper_private4__ -L 0.0.0.0:5900:localhost:5900 [email protected] -NTf
- hello virt-manager let's roll
# id_ecdsa or id_rsa
virt-manager -c 'qemu+ssh://root@NFX250-IP:2222/system?keyfile=id_ecdsa'
Windows 的安装会有额外的 virtio 驱动的问题,记得到 Fedora virt group 上下载驱动,将 ISO 挂上去以便在安装的时候加载驱动。