openwrt 单网卡路由模拟实现
关键字
vlan
openwrt
单臂路由
一直以来都认为路由器要至少要求是双网卡,因为至少要有lan/wan。最近看了单臂路由的介绍,自己在虚拟机测试了一把,发现单网口做路由器确实可行!
测试环境
Manjaro Linux 主机
qemu openwrt 虚拟机环境(openwrt 固件可以在官方下载)
host 主机配置
这里因为是模拟,所以在宿主机(majaro)上要做一些配置。 实际使用的单臂路由,路由器网卡接口下一定是一个支持vlan的交换机,只需要配置交换机 vlan 即可。
这里仅给出本次测试的宿主机的 vlan 相关网卡的修改,单臂路由下的交换机配置的原理一样。
网桥配置
因为虚拟机选择的是NAT 网络,所以需要做如下配置(注,这里vnet1 是 OpenWrt 虚拟机在 host 生成的虚拟网卡。virbr0 是 qemu NAT 网桥)
# 创建 vnet1_11 vlan id 11
➜ ip link add link vnet1 name vnet1_11 type vlan id 11
# 创建 vnet1_10 vlan id 10
➜ ip link add link vnet1 name vnet1_10 type vlan id 10
# 默认 vnet1 被加入到 virbr0 网桥,这是 QEMU NAT 功能默认做的,需要把它去掉,把 vnet1_11 加入到网桥
➜ brctl delif virbr0 vnet1
➜ brctl addif virbr0 vnet1_11
➜ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242f80d773e no
virbr0 8000.5254008e3f49 yes virbr0-nic
vnet1_11
➜ ip link set dev vnet1_11 up
➜ ip link set dev vnet1_10 up
这里操作原理是: 因为即将配置的路由器 WAN 口是 vlan 11,所以这里需要创建vlan 子接口支持vlanid 11。
vlan 10 的子网卡,这里假装是路由器下的设备。
openwrt 配置
参考链接,openwrt 官方介绍
下面截取修改的部分: /etc/config/network, 新增部分很容易理解,没加注释。
config interface 'lan'
# 这里注释掉是因为没必要用桥接,不注掉其实也一样,区别就是:
# 桥接时候会创建一个 br-lan 的网桥,vlan10 将被加入到网桥里,配置的静态 IP 是在桥(br-lan)上
# 因为这里只有一个 vlan10 所以要不要桥都可以。如果设备上还有一个无线网卡,那么桥就是必须的,因为他们都是 lan 网络。
# option type 'bridge'
option ifname 'vlan10'
option proto 'static'
option ipaddr '192.168.10.1'
option netmask '255.255.255.0'
config interface 'wan'
option ifname 'vlan11'
option proto 'dhcp'
config device
option type '8021q'
option ifname 'eth0'
option via '10'
option name 'vlan10'
config device
option type '8021q'
option ifname 'eth0'
option via '11'
option name 'vlan11'
修改完重启network,使修改生效service network restart
测试
在 wan 口做dhcp
wireshark抓取 dhcp 时网卡报文
抓包目的解释了为什么要在host 创建 vlan 子网卡。如上图,在 vnet1 上openwrt wan 口发来的报文是包含 vlan tag 的,而 qemu 虚拟网桥是不认识 vlan(8021q)报文的,经过子网卡后会剥离掉vlan 头,将二层 8021q 报文转为普通以太网报文。只有这样openwrt wan 的dhcp 报文才能到qemu 网桥,整个dhcp 过程才会成功。
这时候可以尝试ping 对端都是ok的。
ping:host->openwrt
ping:openwrt->host
在lan侧做dhcp
可以知道 lan 侧也是ok的。ping测试这里就不帖图了。