记一次 OpenWRT 旁路网关部署
手把手教你使用KVM在Arch Linux宿主机部署OpenWRT旁路网关,实现Padavan路由器特定设备自动代理。包含详细的操作步骤、配置示例和注意事项。

起因

之前,我的上网方案一直都是:在局域网内一台服务器专门运行代理服务器,而其他设备使用如 export ALL_PROXY=socks://192.168.123.144:.... 或者 单独运行代理软件设置为TUN模式 等方案来设置代理服务器。

  graph TD;
    Router[Padavan Router]
    Proxy[HomeServer + Proxy
192.168.123.144]
    PC[PC]
    MacBook[MacBook]
    Phone[Phone]
    Other[Other]

    Router --> Proxy
    Router --> PC
    Router --> MacBook
    Router --> Phone
    Router --> Other

这种方案有着一些缺点,例如并不是所有的应用程序都遵守 ALL_PROXY 这个环境变量,一些游戏(如 Minecraft)难以代理等等。

正好年初的时候升级了 HomeServer,其配置(Xeon E5 2650L v3 + 32GB RAM)能够带起KVM,并且也运行了两个多月的 fnOS 证明了其稳定性,所以这次我们开一个新的虚拟机运行 OpenWRT 系统作为旁路网关,且配置 Padavan 的 dnsmasq 来对局域网特定设备响应旁路网关,实现特定设备自动代理。

环境

我的路由器带的是 Padavan 固件,HomeServer 运行的是 Arch Linux 系统且安装了 Cockpit。

HomeServer 中配置了一个网桥 br0,KVM虚拟机连接到网桥中,这样就能联通到局域网中,让其他的设备进行访问。

2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    ...
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 192.168.123.144/24 brd 192.168.123.255 scope global dynamic noprefixroute br0
    ...
4: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN group default qlen 1000
    ...

实践

新建虚拟机

来到 Cockpit 管理界面,新建一个新的虚拟机,我的名字设置成了 owrt。这里先设定为网络启动,后面再创建磁盘镜像。

点击 创建并编辑,先不要启动虚拟机,进入到编辑界面后往下拉,在 磁盘 一栏点击 添加磁盘,设定大小为 8G(后面实测根本不用这么大的空间,设成4个G左右就足够了)。

网络 一栏配置网络接口,根据我的环境,这里就直接设置桥接到 br0 了,在后面启动后 KVM 会自动在宿主机再新增一个 vethX 接口加入到桥中。

回到上方的 概览 一项,调整启动顺序,确保是 disk 优先,其次将下方的固件改为 UEFI,最后根据自己需求看看要不要调整 RAM 的固定分配大小。

自此,虚拟机方面配置完成,接下来我们开始往虚拟机中安装 OpenWRT 系统。

系统安装

自行到 https://downloads.openwrt.org/ 找到合适版本的 x86/64/generic-ext4-combined-efi.img.gz 镜像,或者像我一样直接使用 Snapshot 版本(➡️点击这里下载⬅️,走的官网服务器,下载慢请自行寻找国内镜像,➡️点击这里跳转到“校园网联合镜像站”⬅️)。

准备好 .img.gz 的镜像后,ssh 连接上服务器,先解压镜像:

$ gzip -d openwrt-x86-64-generic-ext4-combined-efi.img.gz
$ ls
openwrt-x86-64-generic-ext4-combined-efi.img

然后挂载刚刚创建好的 qcow2 磁盘镜像,写入系统:

$ modprobe nbd max_part=8
$ ls /dev/nbd0
/dev/nbd0

$ sudo qemu-nbd --connect=/dev/nbd0 [qcow2镜像位置]
$ dd if=./openwrt-x86-64-generic-ext4-combined-efi.img of=/dev/nbd0 bs=16M
...

系统写入完成后,我们继续对分区进行扩容:

$ sudo parted /dev/nbd0
...
(parted) resizepart 2
 End?  [...]? 8GB

(parted) q

$ sudo e2fsck -f /dev/nbd0p2
...
$ resize2fs /dev/nbd0p2
...

$ sudo qemu-nbd --disconnect /dev/nbd0

至此,系统安装完毕。

系统配置

到 Cockpit 面板中启动虚拟机,用 VNC 功能控制,使用 vim 编辑配置文件:

$ vim /etc/config/network

写入内容:

... 前面的内容略 ...

config device
	option name 'br-lan'
	option type 'bridge'
	list ports 'eth0'

config interface 'lan'
	option device 'br-lan'
	option proto 'static'
	option gateway '192.168.123.1'
	list ipaddr '192.168.123.129/24'
	option delegate '0'

config interface 'lanv6'
	option proto 'dhcpv6'
	option device '@lan'
	option reqaddress 'try'
	option reqprefix 'auto'
	option norelease '0'

在这里我将 OpenWRT 的 IP 地址设置成 192.168.123.129,配置完毕后使用 reboot 重启系统。

然后再次控制虚拟机,安装 LuCI 面板,如果安装过程慢请先自己去换个源:

$ apk update
$ apk add luci

登录到 LuCI,到 网络 ➡️ 接口 配置接口,lan 接口配置:

网络 ➡️ DHCP/DNS 页面关闭 DHCP 唯一授权

网络 ➡️ 防火墙 页面调整设定如下:

重启系统,到 网络 ➡️ 接口 确保两个接口都能获取到 IP 地址后,根据自己目的安装代理插件等并完成配置,可以使用自己的手机设置静态 IP 地址,指定网关为这个路由器后测试代理功能是否正确。

至此,旁路网关配置完成。

配置主路由

到 Padavan 主路由进行配置,为特定 MAC 地址的设备指定网关为旁路网关,实现对局域网内特定设备进行代理的效果。

配置内容如下:

# 主机注册列表
dhcp-host=设备的MAC地址,set:proxiedhost


# 特定标记配置
dhcp-option=tag:proxiedhost,option:router,旁路网关

然后网络结构便变为下图:

  graph TD;
    Router[Router]
    Proxy[Proxy
192.168.123.144]
    Special[Special]
    Others[Others]
    SideGateway[Side Gateway
192.168.123.129]

    Router --> Proxy
    Router --> Special
    Router --> Others
    Router --> SideGateway
    Special -->|Gateway| SideGateway

配置完成,使用那个特定的设备连入局域网,查看其分配的网关地址为旁路网关,完成代理!

FIN.


上次修改於 2025-05-10