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