Еще одна конфигурация на базе OpenWRT (+PC) для обработки трафика

ee96e0400fe4cc141938f33ba658fd67.png

Постановка задачи.

Последнее время на некоторых территориях тема обработки транзитного трафика на домашнем роутере стала популярна как никогда раньше. Интервал между новыми вызовами сократился с нескольких лет до нескольких дней. Задачи становятся всё интересней и сложней.

Перешитый на OpenWRT роутер пока справляется и наверное справлялся бы еще какое-то время. Но софт становится тежелее, времени на его отладку и установку всё меньше. При всех преимуществах OpenWRT начинают всплывать недостатки — специфическая архитектура и ограниченные ресурсы. Кроме того роутер лично для меня место интимное и не всякий софт хочется на него ставить не глядя. Ситуация в моем случае усугубляется еще и тем, что настройка происходит удалённо через этот самый роутер, по этому неудачные попытки чреваты большими сложностями.

Как и у многих, у меня рядом с роутером есть небольшой NAS на база PC. Который с помощью второй сетевухи мог бы легко превратиться в роутер. Но как это сделать удаленно? И как сделать из сервера роутер не трогая по-возможности сервер и роутер? Легко!

Подразумевается, что читатель имеет базовые навыки администрирования сетей и линукса. Инструкция выглядит как пошаговая, но по факту является концептом, писалась по памяти, добуквенно тестировать в данный момент негде.

Конфигурация

Используем OpenWRT + сервер на Debian + LXC. Опытные товарищи тут уже всё поняли и дальше могут не читать.

Кабели мы договорились не трогать. По этому трафик на сервер входить и выходить будет через 1 сетевуху включенную в LAN порт роутера. Мешать всё в кучу не будем и для разделения используем 802.1Q VLAN.

Трафик будет ходить следующим образом:
клиент — роутер — контейнер_на_сервере — роутер — интернет.

Добавляем VLAN для клиентов (описываю действия в веб-морде):
Network — Switch — Add VLAN
VLAN ID указываем первый свободный номер (например »3»)
Порты СPU и LAN к которому подключен сервер ставим «tagged», остальные «off»
здесь и далее после каждого изменения жмём «save&apply»

Добавляем новую сеть WiFi
Network — Wireless — Add
AccessPoint —  — сеть пока не указываем
SSID, пароль и т.п. указываем по вкусу, это будет вайфай сеть для клиентов с обработанным трафиком.

Добавляем мост
Network — Interface — Devices — Add device
Bridge Device — brLAN3 — eth0.3
Bridge ports надо будет выбрать из списка. eth0 это интерфейс CPU, у вас может быть другой. 3 — VLANID вы указывали выше.

Добавляем интерфейс без IP
Network — interfaces — Add interface («LAN3» — «Unmanaged» — «brLAN3»)
LAN3 — имя сети, я для удобства добавляю номер VLAN

Возвращаемся и добавляем интерфейс к Wi-Fi
Network — Wireless — SSID_Name — Edit
Network: LAN3

Должна появится сеть, но при попытке подключения не должен выдаваться IP.

Если к этой сети нужно подключить клиента кабелем например к порту №4, то идём
Network — Switch
Для VLANID 1: untagged меняем на off
Для VLANID 3: off меняем на untagged


На этом с роутером всё.

Идём на сервер.

Ставим LXC по инструкции. (в простейшем случае sudo apt install lxc)

Скрытый текст

KVM/QEMU я посчитал избыточным, хотя потенциально проблем с ним будет меньше и установка и настройка даже проще. Но и ресурсов будет жрать больше.

Среди дистрибутивов LXC доступен OpenWRT, но я захотел полноценный дебиан.

Выбор между привелегированными и непривилегированными контейнерами оставлю за кадром, всё прекрасно описано по ссылке.

создаем контейнер (я использую тот же дебиан)
lxc-create -n containerouter -t download -- --dist debian --release bullseye --arch amd64

Далее (я это делал в графической оболочке еще давно при установке системы, сей-час нет под рукой машины проверить комманды nmcli)
1. удаляем локальное кабельное подключение.
2. создаём мост br0 указав сетевую карту (что-то типа «enpXsY») в bridged connections.
3. Настройки IP указываем в параметрах br0

br0 будет у нас виртуальным коммутатором аналогичным физическому в роутере.

lxcbr0 вместе со штатной сетевой системой контейнеров мы оставим и использовать в данном примере не будем.

Открываем /var/lib/lxc/containerouter/config

Скрытый текст

# Network configuration
lxc.net.0.type = veth
lxc.net.0.name = eth0
lxc.net.0.link = br0
lxc.net.0.flags = up
lxc.net.0.ipv4.address = 192.168.1.103/24
lxc.net.0.ipv4.gateway = 192.168.1.1
lxc.net.1.type = vlan
lxc.net.1.name = eth1
lxc.net.1.vlan.id = 3
lxc.net.1.link = enpXsY
lxc.net.1.flags = up
lxc.net.1.ipv4.address = 192.168.3.1/24

192.168.1.103 это адрес контейнера в вашем роутере. Зарезервируйте его в настройках DHCP на всякий случай. 192.168.1.1 — адрес роутера.

192.168.3.1/24 это подсеть из которой будут получать адреса клиенты контейнерного роутера.

enpXsY это наш физический сетевой интерфейс хоторый мы добавили в бридж на хосте выше.

обращаем внимание на номер vlan.id, тот же номер мы настраивали в роутере.

IP адрес 192.168.1.103 в этом конфиге в данном случае приведен для декорации, т.к. я не советую использовать дефолтный DHCP клиент в контейнере из-за его кривизны. Вернёмся к этому ниже. Как сделать более красиво пишите в комментариях.

Если в роутере будут туннели на базе tun интерфейса, например openvpn, добавляем ниже строчку

lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file

Запускаем контейнер.

lxc-start --name=containerouter

Если нет ошибок подключаемся

lxc-attach containerrouter

тут у нас почти обычный дебиан.

Первым делом идём настроим настоящий IP в /etc/systemd/network/eth0.network

[Match]
Name=eth0

[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=192.168.1.1

выходим, перегружаем, заходим

ставим сразу обновления, я обычно сразу ставлю midnight commander (apt install mc)

ставим dnsmasq

apt install dnsmasq

/etc/dnsmasq.d/dhcp.conf

port=0

interface=eth1

dhcp-range=192.168.14.100,192.168.14.150,255.255.255.0,12h
dhcp-option=3,192.168.3.1 # Gateway
dhcp-option=6,8.8.8.8,8.8.4.4 # DNS servers правим если надо
dhcp-leasefile=/var/lib/misc/dnsmasq.leases
dhcp-authoritative

log-dhcp
log-queries
log-facility=/var/log/dnsmasq.log

Выходим, перезапускаем контейнер, переподключаемся. Между остановкой и запуском контейнера возможно понадобится подождать минуту пока сетевой сервис контейнеров удалит тегированный VLAN с сетевого интерфейса хоста, иначе контейнер не запустится.

В простейшем случае можно добавить что-то типа

iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j MASQUERADE

проверяем что 

root@containerouter# cat /proc/sys/net/ipv4/ip_forward
1

И клиенты новой сети должны получать адреса и интернет

Настраиваем фаервол, ssh и т.п. по вкусу. Не забываем поставить пароль на рута. В системе два сетевых интерфейса eth0 это внешний смотрит на локальную сеть роутера. eth1 внутренний раздаёт адреса клиентам.

Пишите замечания, если не возникнет сложностей с интерфейсом буду дополнять и исправлять.

Habrahabr.ru прочитано 24465 раз