折腾虚拟机里的 OpenWrt 做代理用网关

经验

手里有一些做实验用的服务器要管理,或多或少有一些去外网下载软件和数据、拉 docker 镜像的需求。 考虑网络环境,最好是通过代理去访问,但是又不想一个个去配置, 最终选了一个配置和使用成本都很低的方案,就是用一个安装了 OpenWrt 的虚拟机做网关, 记录一下这个过程。

需求

需求是在需要代理的设备到局域网网关的路上加一个设备做中间人,实现原来的网关所没有的一些功能, 即普通数据包正常发,此外按需将部分数据包转换成代理服务器能看懂的格式,再通过原来的网关发送出去。

从被代理设备的角度看,不需要安装任何软件,只要把网关设置为这个设备,自己就被透明代理了。 从原来的网关的角度看,只是多了一个普通的局域网主机要往外发包。

这种需求并不小众,网上有超多的现成方案的分享和相关教程(通常被网友叫做旁路由、旁路网关等)。 但一般是自己家用,而且找一个专门的设备(树莓派、路由器等)实现,跟我想要的有些不符, 对我来说有点麻烦了。

最终发现我的需求很好满足,不需要WiFi,只要一个网口,跑在虚拟机里也够用了。

准备

其实只要学习下 iptables,感觉随便一个 linux 服务器应该都能完成这个需求,但我这次折腾的 目的是什么都不想学,越简单越好,能跑就行。 最终选择的方案就是直接在我的主机上开一个虚拟机装 OpenWrt, 有什么用什么,配置文件都懒得写,直接图形化开搞。

用到的东西:

  • 一台宿主机:直接用办公主机 (开销很小,分了 1 CPU, 256M 内存)
  • 虚拟机软件:VirtualBox
  • OpenWrt
  • V2rayA

实施

1. 下载虚拟机镜像

按照 OpenWrt 官网的教程 就行, 我选的镜像是 openwrt-22.03.0-x86-64-generic-ext4-combined.img.gz

2. 设置虚拟机

网络方面选 VirtualBox 的桥接模式,获取一个独立的局域网 IP 地址,完全融入宿主机所在局域网,并开启混杂模式用于转发。 (在这之前我也尝试了不用虚拟机,直接用 docker 的 macvlan 模式,到 IPv6 那里感觉有点麻烦放弃了,还是这个简单粗暴)

其他资源方面一开始我按教程分了 128M 内存,发现开了 v2ray 后不够用了,最终加到了 512M,但看系统状态 256M 完全够了

3. 配置 OpenWrt 的网络

虚拟机跑起来后开始配置 OpenWrt,它的网络配置之前没接触过,遇到了一些问题。 首先是一些概念不太清楚,然后就是 IPv6 不知道如何配。 参考了这篇博客, 新建一个 interface 用来 dhcpv6, 一番操作后,最终的配置文件大概长这样:

其他配置的应该没区别?

config interface 'lan'
        option device 'br-lan'
        option proto 'static'
        option ipaddr '局域网IP'
        list dns 'DNS'
        option delegate '0'
        option gateway '网关'
        option netmask '子网掩码'

config interface 'wan'
        option proto 'dhcpv6'
        option device '@lan'
        option reqaddress 'try'
        option reqprefix 'auto' 

4. 安装需要的软件包

自带一个叫 opkg 的包管理器,源里有 v2rayA,一个 web 界面的客户端。 按照 V2rayA 的文档 操作就行了。

# 安装
opkg update
opkg install v2raya
# 自启动
uci set v2raya.config.enabled='1'
uci commit v2raya
# 启动
/etc/init.d/v2raya start

5. 配置软件

全图形界面,没什么可说的,只能说感谢开发者,点点鼠标就能透明代理,省去了亲自了解 iptables 的苦恼 (虽然可能迟早要用到)

6. 虚拟机迁移

也可以把虚拟机迁移到没有图形界面的服务器使用,这里给出创建和配置虚拟机时有用的命令:

#!/bin/sh
VBoxManage createvm --name ProxyGW --register
VBoxManage modifyvm ProxyGW --ostype Linux26_64
VBoxManage modifyvm ProxyGW --memory 256
VBoxManage storagectl ProxyGW --name SATA --add sata --controller IntelAhci --bootable on
VBoxManage storageattach ProxyGW --storagectl SATA --port 0 --device 0 --type hdd --medium openwrt.vdi
VBoxManage modifyvm ProxyGW --nic1 bridged --nictype1 82545EM --cableconnected1 on --nicpromisc1 allow-all --bridgeadapter1 enp0s31f6

以及可以写一个 systemd 的服务用于开机启动:

[Unit]
Description=start ProxyGW VM on boot
After=network.target virtualbox.service
Before=runlevel2.target shutdown.target

[Service]
User=<your username>
Group=vboxusers
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
ExecStart=/usr/bin/VBoxManage startvm ProxyGW --type headless
ExecStop=/usr/bin/VBoxManage controlvm ProxyGW acpipowerbutton

[Install]
WantedBy=multi-user.target

效果

目前没感觉到什么性能问题,就是可能不太安全,两个 web 后台暴露在外面,而且使用方法过于简单, 完全不需要认证,后面再研究下防火墙和认证的问题。

总结

以后有时间多了解下 OpenWrt,感觉可折腾的还有很多,网上很多人在说的东西我都看不懂。 此外感觉还需要学习更多网络虚拟化的知识,有时间写一篇笔记。