前段时间入手了一台四网口 x86 小主机,然后就开始折腾 All in Boom。一开始我尝试过 PVE + 爱快 + OpenWrt + Ubuntu,也尝试过直接在爱快中使用虚拟机装 OpenWrt + Ubuntu,甚至尝试过 Ubuntu + Openwrt in Docker。终结果都不太理想,所以决定下来直接在 Debian 里实现路由器常规功能,然以在 Docker 里实现各种附加需求
为什么选择 Debian 做路由器
网上能够搜到的大多数文章都是从 ESXi 或者 PVE 开始,且不说前者本身就是闭源收费软件,他的最新版本(8.x)目前似乎并没有方法集成螃蟹网卡驱动,所以直接放弃掉;选 PVE 吧,那他本质上就是个 Debian + KVM + LXC,虚拟机尽管可以 PCI 硬件直通仍然比不上裸机来的丝滑顺畅,再加上还有个我几乎用不上的 LXC(毕竟 Docker Hub 还算是个好东西),所以真还不如 Debian 然后自己装 qemu-kvm 来的痛快(其实我确实也这么试过);然后爱快虚拟机就更拉了,不能硬件直通导致我的硬盘读写速度不及网络带宽的一半
其实吧 Ubuntu 也没啥问题,甚至还自带了螃蟹网卡的驱动,就是吧它还自带一些额外的显卡驱动,让我在 4k 屏上看比蚂蚁还小的字快看瞎了,其次就是 netplan 用起来也并不那么顺手,再者吧就是 snap 我不喜欢(虽然可以卸载啦)
安装前的准备
因为装机意味着暂时性的断网,我又不想来回在弱电箱里把线接来接去,所以索性先下载好跟网络连接有关的依赖。对于 Debian 11 而言,除了下载 DVD installer 这个 iso 之外,还需要提前准备好 bridge-utils, libpcap0.8, ppp, pppoeconf 这几个 deb(libpcap0.8 是 ppp 的依赖,如果是双网卡机器那 bridge-utils 不需要),在写入移动盘后复制进去(还是推荐在 Windows 下用 Rufus 制作安装盘,dd 命令写特别是在 mac 里会导致后面无法复制文件),对于我这种螃蟹网卡的机器,除了上面的 deb 还需要额外准备一个 firmware-realtek 的包
Debian 安装过程
略,注意安装时勾选上 openssh server 和基本系统就行,另外就是如果选中文,之后进系统会有无中文字体而导致的乱码问题,虽然 ssh 后就无所谓,但在局域网弄好之前可能会比较折磨
组建局域网
首先 apt install ./*.deb
把之前准备好的 deb 都装好,然后 ip a
确定一下自己网卡的命名,像我的机器四个网口按顺序依次是 enp2s0
, eno1
, enp4s0
, enp5s0
,当然是选择与众不同的那一个作为 wan 口,其他的桥接起来,vim.basic /etc/network/interfaces
编辑一下文件
1 | auto lo |
双网卡的话 bridge-ports
那一行去掉然后 br0
改成对应 lan 接口名就行,之后 /etc/t.d/networking restart
重启一下网络,如果有需要 root 密码直接 ssh 的可能需要改一下 /etc/ssh/sshd_config
的配置,但我是提前准备好了 ~/.ssh/authorized_keys
就无所谓这个
之后选一个 lan 口连电脑上,ip 改成路由器同网段就好,不出意外的话应该就能 ssh 进去了,我一般都是直接用 root 用户,没有 GUI 的系统基本上乱搞不坏
公网连接 & 路由功能完善
一个基础的路由器需要实现拨号、DHCP 服务器、网关这三个基本功能,因为目前运营商基本都支持了 IPv6 所以与之相关的也需要进行一些额外的配置
配置拨号上网
这个比较简单,pppoeconf
之后按照提示操作就可以,除了输入账号密码基本上一路 yes 就行,不出意外的话再 ip a
就能看到名为 ppp0 的网卡以及运营商分配的 ip 了,这一步之后机器应该可以正常联网了,换用 清华源 这些也可以搞一下了
启用网关(IPv4 NAT 和 IPv6 转发)
开启转发
编辑 /etc/sysctl.conf
,追加内容
1 | net.ipv4.ip_forward=1 |
配置 NAT
因为 Debian 11 自带了 nftables 所以直接编辑 /etc/nftables.conf
追加以下内容
1 | table ip nat { |
然后再 systemctl enable --now nftables
启用 nftables,不出意外的话如果电脑上手动配置好了网关和 DNS 服务器,就已经可以上网了,但此时机器还拿不到 IPv6 地址,而且不可能所有设备都手动配置这些信息,所以需要 DHCP 服务器
IPv6-PD 获取
运行 apt install -y wide-dhcpv6-client
安装 dhcp6c,由于这个包最近一次更新是在 08 年,原来 init.d 那一套服务机制已经不太好使了,需要先手动 systemctl disable wide-dhcpv6-client
停掉老服务,然后编辑 /etc/wide-dhcpv6/dhcp6c.conf
文件
1 | interface ppp0 { |
双网口机器的话 br0
换成 lan 接口名,然后手动创建服务 /etc/systemd/system/dhcp6c.service
1 | [Unit] |
这样 systemctl enable --now dhcp6c
就可以保证它能够开机自启并失败重试了(因为 ppp0 的创建会比较晚,如果不能失败重试大概率会因为找不到 ppp0 而直接 fail),不出意外的话再次 ip a
应该能看到 lan 口对应的 IPv6 前缀了
DHCP / SLAAC 服务搭建
首先 apt install -y dnsmasq
,然后再编辑 /etc/dnsmasq.conf
1 | interface=br0 |
同样的如果双网口 br0
改成对应 lan 接口名,然后 systemctl enable --now dnsmasq
,再把电脑上的之前手动分配的 IP 改成全部自动获取应该就能看到路由器分配的 v4 和 v6 地址了。上面的配置写法告诉 dnsmasq 在通告里启用 M 和 O 标记用于分配 Stateful 地址,如果希望同时使用 Stateless 地址在 constructor:br0
后面加上 ,slaac
即可。上面例子里只启用有状态地址分配是为了能够固定设备 IP 的后缀:
1 | dhcp-host=11:22:33:44:55:66,192.168.1.10,[::10a] # device1 |
接下来
这里还是推荐重启一下机器,确保一下所有路由基础功能都已经 OK。当然如果仅仅止步于此那么一台硬路由足够了,既然选择使用软路由,自然是需要有更多的折腾(比如透明代理,再比如媒体服务器,智能家居控制中心等),这个在后续文章里记录