本文将在 Debian12 下虚拟一个 Openwrt 系统并安装 OpenClash 用于科学爱国
OpenWrt是一个用于嵌入式设备的开源Linux操作系统,常用于路由器
官方地址:https://openwrt.org/
本文实践不会讲的特别细,阅读前提是具备 Linux 经验以及 OpenWrt 使用经验
本文将用官方固件 + OpenClash 以确保网络安全
网络架构示意图:
@startuml
skinparam {
shadowing false
arrowColor #444444
arrowFontSize 10
defaultFontName "Arial"
BackgroundColor<<Router>> LightSkyBlue
BackgroundColor<<AP>> PaleGreen
BackgroundColor<<Device>> LightGoldenRodYellow
node {
borderColor #333333
borderThickness 1
roundCorner 10
}
rectangle {
borderColor #333333
borderThickness 1
roundCorner 15
}
}
rectangle "我的网络" {
entity "光猫\n<color:#00008B><b>192.168.1.1</b></color>" as modem <<Router>> #ADD8E6
entity "N100\n<color:#00008B><b>192.168.1.2</b></color>\n<color:#00008B><b>192.168.11.1</b></color>" as n100 <<Gateway>> #87CEFA
entity "虚拟机 OpenWRT\n<color:#00008B><b>192.168.11.2</b></color>" as openwrt <<Router>> #1E90FF
entity "服务器\n<color:#8B4513><b>192.168.11.3</b></color>" as server <<Device>> #FAFAD2
entity "无线AP 1\n<color:#006400><b>192.168.11.10</b></color>" as ap1 <<AP>> #98FB98
entity "无线AP 2\n<color:#006400><b>192.168.11.11</b></color>" as ap2 <<AP>> #90EE90
entity "无线AP 3\n<color:#006400><b>192.168.11.12</b></color>" as ap3 <<AP>> #7CFC00
entity "设备 A\n<color:#8B4513><b>192.168.11.100</b></color>" as deviceA <<Device>> #FFE4B5
entity "设备 B\n<color:#8B4513><b>192.168.11.110</b></color>" as deviceB <<Device>> #EEE8AA
entity "设备 C\n<color:#8B4513><b>192.168.11.120</b></color>" as deviceC <<Device>> #F0E68C
entity "设备 D\n<color:#8B4513><b>192.168.11.130</b></color>" as deviceD <<Device>> #FFD700
modem -[dashed]-> n100 : <color:#00008B><b>LAN</b></color>
n100 -[dashed]-> openwrt : <color:#00008B><b>LAN</b></color>
openwrt -[dashed]-> server : <color:#00008B><b>LAN</b></color>
openwrt -[dashed]-> ap1 : <color:#006400><b>LAN</b></color>
openwrt -[dashed]-> ap2 : <color:#006400><b>LAN</b></color>
openwrt -[dashed]-> ap3 : <color:#006400><b>LAN</b></color>
ap1 -[dotted]-> deviceA : <color:#FF6347><b>WiFi</b></color>
ap1 -[dotted]-> deviceB : <color:#FF6347><b>WiFi</b></color>
ap2 -[dotted]-> deviceC : <color:#FF6347><b>WiFi</b></color>
ap3 -[dotted]-> deviceD : <color:#FF6347><b>WiFi</b></color>
}
@enduml
1. 准备
KVM(Kernel-based Virtual Machine)是一个用于Linux内核的虚拟化技术,允许用户在Linux系统上运行多个虚拟机
KVM 通常与 QEMU 套件搭配使用,本文也是采用这套组合
1.1. KVM
Debian12 安装 KVM 方法如下:
sudo apt-get install kvm qemu-kvm bridge-utils virtinst libvirt-clients libvirt-daemon-system
Debian12 可以采用 Netplan 对网络进行管理,桥接也更方便
切换到 Netplan 的配置文件如下:
# 编辑 /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
# 这是对接光猫的 wan 口
enp1s0:
dhcp4: yes
dhcp6: yes
# 这 3 个是对接无线 ap 的 lan 口
enp2s0:
dhcp4: no
dhcp6: no
enp3s0:
dhcp4: no
dhcp6: no
enp4s0:
dhcp4: no
dhcp6: no
bridges:
br0:
interfaces:
- enp2s0
- enp3s0
- enp4s0
addresses: [192.168.11.1/24]
dhcp4: no
这样配置后,N100 的 IP 地址是 192.168.11.1
1.2. Openwrt虚拟机
OpenWrt 官方固件:https://downloads.openwrt.org/releases
每个固件的文件名包含了固件的大部分信息:
- x86-64:表示架构
- generic:表示通用版本,适用于广泛的硬件不针对特定设备
- ext4:指文件系统,可扩展,对应的还有
squashfs
表示只读系统 - combined:合并版,表示包含内核和根文件系统,对应的有
initramfs
表示只含内存版本用于调试 - efi:表示支持 EFI 启动
请选择合适自己的架构镜像下载,我的软路由是 X86 架构的 N100
所以使用的是 openwrt-24.10.1-x86-64-generic-ext4-combined-efi.img.gz
系统镜像
准备如下:
# 创建虚拟机镜像文件夹
mkdir /var/lib/libvirt/images && cd /var/lib/libvirt/images
# 下载合适的官方固件
wget https://downloads.openwrt.org/releases/24.10.1/targets/x86/64/openwrt-24.10.1-x86-64-generic-ext4-combined-efi.img.gz
# 解压固件
gzip -d openwrt-24.10.1-x86-64-generic-ext4-combined-efi.img.gz
# 将固件的大小增加 16G 方便后续安装第三方软件(重要,否则你的 OpenWrt 虚拟机只有 100M 大小的空间),这里是预处理,后面会再次调整
qemu-img resize -f raw openwrt-24.10.1-x86-64-generic-ext4-combined-efi.img +16G
创建 Openwrt 虚拟机:
virt-install \
--name OpenWrt \
--os-type=Linux \
--os-variant=generic \
--ram 1024 \
--cpu host \
--disk path=/var/lib/libvirt/images/openwrt-24.10.1-x86-64-generic-ext4-combined-efi.img,,format=raw,bus=virtio \
--network bridge=br0,model=virtio \
--graphics vnc,listen=192.168.11.1 --noautoconsole \
--import
要注意上述的命令中 \
后不可以跟有空格
N100 使用的 Debian 是无 GUI 版本,要借助 vnc 客户端进行下一步操作
在 macOS 上安装 tigervnc-viewer
:
brew install --cask tigervnc-viewer
请根据你的实际情况选择合适 vnc 客户端,然后输入 192.168.11.1
进行 vnc 远程
在打开远程界面后,按回车进入 OpenWrt 的 shell 界面,修改网络信息:
# 编辑 /etc/config/network
config interface 'loopback'
option device 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fd26:baa2:c67e::/48'
option packet_steering '1'
config device
option name 'br-lan'
option type 'bridge'
list ports 'eth0'
config interface 'lan'
option device 'br-lan'
option proto 'static'
# 修改 IP
option ipaddr '192.168.11.2'
# 指定 网关
option gateway '192.168.11.1'
option netmask '255.255.255.0'
option ip6assign '60'
重启网络:
/etc/init.d/network restart
使用 ssh 进行连接,然后更新仓库:
uci set network.lan.dns="223.5.5.5" # 替换为合适你的 DNS 服务器
uci commit network
/etc/init.d/network restart
顺手将 shell 成 zsh:
sh -c "$(wget -O- https://raw.githubusercontent.com/felix-fly/openwrt-ohmyzsh/master/install.sh)"
到这里 OpenWrt 的网络初始化完毕
此时可以将局域网内任意设备的网关更改为 192.168.11.2
然后测试网络
1.3. OpenWrt 扩容
由于 OpenWrt 是针对路由器进行定制化的,所以你会发现根目录大小只有 100M+
在创建虚拟机时,就已经预先增加给 OpenWrt 的磁盘 IMG 文件增加 16 个G
所以接下来把这部分大小调整给根目录,先安装必要的工具
进入 OpenWrt 的 shell 中,执行:
opkg update
opkg install parted losetup resize2fs
进行扩容:
# 打印出当前的磁盘,并确定你的根目录位于哪个设备下,通常是 /dev/sda2 或者 /dev/vda2
parted -l -s
# 将根目录的空间扩展至 100%
parted -f -s /dev/sda resizepart 2 100%
# 重启以应用配置
reboot
# 重启后,将根目录所在的设备挂载到 loop 中,对其进行动态调整(因为 /dev/sda2 已经挂载,你不能对正在使用的根目录进行调整操作)
losetup /dev/loop0 /dev/sda2
resize2fs -f /dev/loop0
# 重启以应用配置
reboot
重启后根目录大小变成了 16G,如下:
root@OpenWrt ~$ df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 15.9G 420.3M 15.5G 3% /
tmpfs 492.5M 1.9M 490.7M 0% /tmp
/dev/vda1 16.0M 6.2M 9.7M 39% /boot
/dev/vda1 16.0M 6.2M 9.7M 39% /boot
tmpfs 512.0K 0 512.0K 0% /dev
这样日后安装任何第三方软件都比较方便
1.4. 快照
在 OpenWrt 部署结束后,为了防止后面配置错误导致崩掉 OpenWrt
建议采用 KVM 的快照机制对虚拟机进行快照处理,方便随时恢复
在 N100 上执行:
virsh snapshot-create-as OpenWrt --name init
以下是快照的使用:
- 创建快照:
virsh snapshot-create-as <VM> --name <snap>
- 查看快照:
virsh snapshot-list <VM>
- 恢复快照:
virsh snapshot-revert <VM> --snapshotname <snap>
- 删除快照:
virsh snapshot-delete <VM> --snapshotname <snap>
2. OpenClash
OpenClash 是一个基于 Clash 内核的网络代理工具,主要用于 OpenWrt 路由器
主要用于进行流量分流、科学上网,通过设置代理规则
实现对于不同网站或服务的流量控制,支持多种协议和多种代理方式
仓库地址:https://github.com/vernesong/OpenClash
2.1. 安装
安装依赖
opkg update
opkg install bash iptables dnsmasq-full curl ca-bundle ipset ip-full iptables-mod-tproxy iptables-mod-extra ruby ruby-yaml kmod-tun kmod-inet-diag unzip luci-compat luci luci-base
下载二进制文件并安装
wget https://github.com/vernesong/OpenClash/releases/download/v0.46.079/luci-app-openclash_0.46.079_all.ipk
opkg install ./luci-app-openclash_0.46.079_all.ipk
2.2. 配置
打开 OpenWrt 的 Web 界面进行配置,这里根据前面的设置打开
- http://192.168.11.2
选中services-openclash,然后填写订阅地址,并选择启用即可
3. 写在最后
由于 OpenWrt 的 wget 版本有些问题,下载东西总是读不到文件名,于是 alias 了命令
# /root/.zshrc
...
alias wget="curl -L -J -O"
此外,Clash 项目在 2023 年作者删库停止维护,后续由其他组织维护
参考资料: