前几天整了台 R86S 万兆版来当软路由,图的是这玩意儿够小并且有光口,这样就能自己整个猫棒多合一了。
先说说 R86S 万兆版的一些小遗憾:
首先规划一下使用。PVE 作为主系统。不用 ESXI 是因为我更熟悉折腾 Debian 系的 Linux。然后 PVE 可以安装各种虚拟机了。首先需要 OpenWRT 作为路由系统。这里我选择使用 LXC 形式安装,性能更好而且没有直通的烦恼。当然 LXC 不用网桥依然会独占整个设备的,所以感知不强。但是 LXC 少跑一个内核、少了层虚拟层、驱动由强大的 Debain 宿主管理,还是方便太多了。然后例牌装个 LXC 的 Privileged 的 Ubuntu 用来跑点 docker 服务。
/usr/bin/proxinstall
脚本(pve8 下是 /usr/share/perl5/Proxmox/Sys/Block.pm
),然后修改: } elsif ($dev =~ m|^/dev/[^/]+/hd[a-z]$|) {
return "${dev}$partnum";
} elsif ($dev =~ m|^/dev/nvme\d+n\d+$|) {
return "${dev}p$partnum";
+ } elsif ($dev =~ m|^/dev/mmcblk\d+$|) {
+ return "${dev}p$partnum";
} else {
die "unable to get device for partition $partnum on device $dev\n";
}
退出 shell 即可继续安装。
从 openwrt 官方下载 rootfs.tar.gz 直接导入 PVE 的 templates 中(可以下载导入功能)。
由于 PVE 默认不认 openwrt,所以无法从 uci 中创建容器。进入 PVE 的 shell,然后手动 cli 创建:
pct create 100 local:vztmpl/openwrt-21.02.3-x86-64-rootfs.tar.gz --rootfs local-lvm:8 --ostype unmanaged --hostname Openwrt --arch amd64 --memory 2048 --swap 0 -net0 bridge=vmbr0,name=eth0
其中 100
为 vmid;*-rootfs.tar.gz
为上传的 template 的文件名;:8
表示 rootfs 的大小为 8G;-net0 bridge=vmbr0,name=eth0
表示把容器内的 eth0
给桥接到 vmbr0
上;剩下的都很显然。不过需要注意这里的 ostype
不能省略。
编辑文件 /etc/pve/lxc/100.conf
,追加以下行:
features: mknod=1,nesting=1
lxc.include: /usr/share/lxc/config/openwrt.common.conf
lxc.cgroup.devices.allow: c 108:0 rwm
lxc.mount.entry: /dev/ppp dev/ppp none bind,optional,create=file
lxc.net.1.type: phys
lxc.net.1.link: enp4s0
lxc.net.1.flags: up
lxc.net.2.type: phys
lxc.net.2.link: enp2s0
lxc.net.2.flags: up
lxc.net.3.type: phys
lxc.net.3.link: enp3s0
lxc.net.3.flags: up
lxc.net.4.type: phys
lxc.net.4.link: enp4s0d1
lxc.net.4.flags: up
这里我把 eth0
以外的口都给「直通」给了容器(其实是共享了设备文件),并且允许容器使用 major=108,minor=0
的设备,这个设备其实是 ppp 设备(ls -l /dev/ppp
就能看到了)。另外引入了 openwrt.common.conf
,这个是 PVE 给 openwrt 的一些通用配置。
然后启动容器就能访问 192.168.1.1
了。
检查一下内核版本如果是 5.15+,并且发现 firewall 没有任何条目,这是 firewall 的一个 bug。具体可以看这封邮件。这个包加上了这封邮件的提交。装上即可。
拨 PPPoE 时候,我的猫棒使用的是透明 vlan 模式,所以需要在 openwrt 里指定 vlan。具体做法是在添加 PPPoE 接口时候手动输入物理接口:iface.vlan
。广东电信的上网 vlan 是 41、IPTV 是 45。另外如果拨号 IPTV 时候,由于电信不响应 LCP echo,所以需要关掉它。具体做法是在加入 option keepalive '0 5'
。
目前我的猫棒在一段时间零流量的情况下,会自动 ifdown 掉。需要设置手动猛 ping 它。这里写了个 init.rc
:
#!/bin/sh /etc/rc.common
# Ping pon stick
START=99
STOP=99
start() {
ping 192.168.0.1 >/dev/null 2>&1 &
echo $! > /var/run/ping_stick.pid
}
stop() {
if [ -f /var/run/ping_stick.pid ]; then
kill -9 $(cat /var/run/ping_stick.pid)
rm -f /var/run/ping_stick.pid
fi
}
不知为何我的 dnsmasq 在使用 smartdns 之后,它的 DHCP 不会广播 DNS 了,这里手动给 br-lan
设置一个:6,192.168.1.1
。