手里有一些做实验用的服务器要管理,或多或少有一些去外网下载软件和数据、拉 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,感觉可折腾的还有很多,网上很多人在说的东西我都看不懂。 此外感觉还需要学习更多网络虚拟化的知识,有时间写一篇笔记。