跳过正文

记一次 OpenWRT 旁路网关部署

·381 字·2 分钟
轻翼
作者
轻翼
C++ | C# | TypeScript | Vue | Rust | Golang
目录

起因
#

之前,我的上网方案一直都是:在局域网内一台服务器专门运行代理服务器,而其他设备使用如 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.