本文将在 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 年作者删库停止维护,后续由其他组织维护

参考资料: