Использование программного роутера — довольно недорогое и одновременно высокопроизводительное решение, но использование ОС внутри виртуальной машины с аппаратной виртуализацией создаёт дополнительные задержки и повышенную нагрузку на железо. Лучшим решением является использование виртуальных машин с программной виртуализацией, в данном случае я использую LXC.
В качестве «роутерной» ОС будет выступать свободная операционная система OpenWRT.
К сожалению, готовых шаблонов для автоустановки нет, поэтому будем писать конфиг вручную.
Сперва, нам необходимо скачать образ корневой ФС, она имеет имя в роде rootfs-squashfs.img.gz, например https://downloads.openwrt.org/releases/19.07.3/targets/x86/64/openwrt-19.07.3-x86-64-rootfs-squashfs.img.gz
Переходим в /var/lib/lxc, создаём директорию с именем машины и копируем ФС в vm/rootfs
- cd /var/lib/lxc
- wget https://downloads.openwrt.org/releases/19.07.3/targets/x86/64/openwrt-19.07.3-x86-64-rootfs-squashfs.img.gz
- gzip -d openwrt-19.07.3-x86-64-rootfs-squashfs.img.gz
- mkdir mount
- mount openwrt-19.07.3-x86-64-rootfs-squashfs.img mount -o loop
- mkdir -p router/rootfs
- cp -a mount/* router/rootfs/
- umout mount
- rm openwrt-19.07.3-x86-64-rootfs-squashfs.img
Приступаем к написанию конфига router/config. Общий вид такой:
lxc.include = /usr/share/lxc/config/common.conf
lxc.include = /usr/share/lxc/config/userns.conf
lxc.arch = linux64
lxc.mount.auto = proc:mixed sys:ro cgroup:mixed
lxc.rootfs.path = dir:/var/lib/lxc/router/rootfs
lxc.cgroup.devices.allow = c 108:0 rwm
lxc.mount.entry = /dev/ppp dev/ppp none bind,optional,create=file
lxc.net.0.type = veth
lxc.net.0.link = br0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 52:a4:00:d3:4e:ea
lxc.net.0.name = eth0
Касательно опций
lxc.cgroup.devices.allow = c 108:0 rwm
lxc.mount.entry = /dev/ppp dev/ppp none bind,optional,create=file
Они необходимы для работы PPP (PPPoE), если это не требуется, необходимо удалить эти строчки.
108:0 определяется таким образом:
На хост-машине: ls -ls /dev/ppp
0 crw——- 1 root root 108, 0 May 21 13:05 /dev/ppp
108, 0 и есть нужные нам значения.
После того, как настроили сеть и зашли на роутер либо через luCI, либо через консоль, необходимо прописать кастомное правило для фаерволла, для этого заходим в Network — Firewall — Custom rules и прописываем iptables -t nat -A POSTROUTING -o pppoe-inet -j MASQUERADE
Или же прописать в /etc/firewall.user
где pppoe-inet имя вашего интерфейса «с интернетом». Да, это костыль, почему-то по дефолту маршрутизация с lxc версией не работает.