使用 Debian 搭建软路由
Doveccl

前段时间入手了一台四网口 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
2
3
4
5
6
7
8
9
10
11
auto lo
iface lo inet loopback

auto eno1
iface eno1 inet manual

auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
bridge-ports enp2s0 enp4s0 enp5s0

双网卡的话 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
2
3
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.accept_ra=2

配置 NAT

因为 Debian 11 自带了 nftables 所以直接编辑 /etc/nftables.conf 追加以下内容

1
2
3
4
5
6
table ip nat {
chain postrouting {
type nat hook postrouting priority srcnat;
oifname { ppp0 } masquerade
}
}

然后再 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
2
3
4
5
6
7
8
9
10
interface ppp0 {
send ia-pd 0;
};

id-assoc pd 0 {
prefix-interface br0 {
sla-len 0;
ifid 0;
};
};

双网口机器的话 br0 换成 lan 接口名,然后手动创建服务 /etc/systemd/system/dhcp6c.service

1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Wide DHCPv6 Client
After=network-online.target

[Service]
ExecStart=/usr/sbin/dhcp6c -Df ppp0
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target

这样 systemctl enable --now dhcp6c 就可以保证它能够开机自启并失败重试了(因为 ppp0 的创建会比较晚,如果不能失败重试大概率会因为找不到 ppp0 而直接 fail),不出意外的话再次 ip a 应该能看到 lan 口对应的 IPv6 前缀了

DHCP / SLAAC 服务搭建

首先 apt install -y dnsmasq,然后再编辑 /etc/dnsmasq.conf

1
2
3
4
5
6
7
interface=br0
port=53
server=223.5.5.5
server=119.29.29.29
enable-ra
dhcp-range=192.168.1.100,192.168.1.255
dhcp-range=::1001,::10ff,constructor:br0

同样的如果双网口 br0 改成对应 lan 接口名,然后 systemctl enable --now dnsmasq,再把电脑上的之前手动分配的 IP 改成全部自动获取应该就能看到路由器分配的 v4 和 v6 地址了。上面的配置写法告诉 dnsmasq 在通告里启用 M 和 O 标记用于分配 Stateful 地址,如果希望同时使用 Stateless 地址在 constructor:br0 后面加上 ,slaac 即可。上面例子里只启用有状态地址分配是为了能够固定设备 IP 的后缀:

1
2
dhcp-host=11:22:33:44:55:66,192.168.1.10,[::10a] # device1
dhcp-host=77:88:99:aa:bb:cc,192.168.1.15,[::10f] # device2

接下来

这里还是推荐重启一下机器,确保一下所有路由基础功能都已经 OK。当然如果仅仅止步于此那么一台硬路由足够了,既然选择使用软路由,自然是需要有更多的折腾(比如透明代理,再比如媒体服务器,智能家居控制中心等),这个在后续文章里记录

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
总字数 24.2k 访客数 访问量