Внешний вид
Собираем роутер из Alpine: Linux вместо RouterOS
Уровень: практика после знакомства с CHR. Показывает, что RouterOS «просто» удобная обёртка над теми же механизмами Linux.
Топология лабы
text
интернет ── CHR (VLAN 10: 192.168.10.1)
│
WAN: eth0.10 = 192.168.10.11 ← alpine1 = LINUX-РОУТЕР
LAN: eth2 = 192.168.200.1/24 (новая сеть linux-lan)
│
alpine2: eth1 = 192.168.200.184 (по DHCP) ← клиент за Linux-роутеромДвойной NAT: alpine1 маскирует за 192.168.10.11, CHR — за 192.168.122.10. Самая частая картина в реальных квартирах («роутер за роутером»).
Конфигурация роутера (alpine1) — весь «RouterOS» на 6 команд
bash
# 1. LAN-интерфейс (аналог /ip address add)
ip link set eth2 up
ip addr add 192.168.200.1/24 dev eth2
# 2. Включить маршрутизацию (у Linux это ВЫКЛЮЧЕНО по умолчанию!)
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -w net.ipv4.ip_forward=1
# 3. NAT наружу (аналог /ip firewall nat add action=masquerade out-interface=...)
apk add iptables
iptables -t nat -A POSTROUTING -o eth0.10 -s 192.168.200.0/24 -j MASQUERADE
# 4. DHCP для LAN (аналог /ip dhcp-server) — dnsmasq
apk add dnsmasq
cat > /etc/dnsmasq.conf <<'EOF'
interface=eth2
bind-interfaces
dhcp-range=192.168.200.100,192.168.200.199,255.255.255.0,12h
dhcp-option=3,192.168.200.1
dhcp-option=6,192.168.200.1
EOF
rc-update add dnsmasq default
rc-service dnsmasq startКлиент (alpine2) — обычный DHCP-клиент: адрес из пула, шлюз и DNS получены автоматически.
Проверка работы NAT — счётчик правила растёт при каждом проходящем пакете:
bash
iptables -t nat -L POSTROUTING -n -v
# 10 840 MASQUERADE all -- * eth0.10 192.168.200.0/24 0.0.0.0/0Главный инцидент лабы: пакеты ходят, а пинг мёртв (rp_filter)
Симптом: alpine2 пингует 1.1.1.1 через Linux-роутер — 100% loss. При этом tcpdump показал: запросы уходят, ответы возвращаются на eth1 alpine2 — и пропадают внутри ядра.
Диагностика:
- tcpdump на alpine1 (WAN): запрос уходит с подменённым адресом (MASQUERADE работает), ответ возвращается → роутер чист.
- tcpdump на alpine2 (eth1): ответы приходят → сеть и NAT чисты.
- Значит, дропает стек alpine2. Причина — две default-маршруты:
text
default via 192.168.20.1 dev eth0.20 (metric 202 — основной, управление)
default via 192.168.200.1 dev eth1 metric 204 (через Linux-роутер)Путь асимметричен: запрос уходит через eth1 (via 200.1), но ответ приходит с 1.1.1.1 на eth1, а обратно к 1.1.1.1 alpine2 маршрутизировал бы через eth0.20.
Виновник: rp_filter=1 (strict uRPF) — анти-спуфинг-защита ядра: «пакет от 1.1.1.1 пришёл на eth1, а маршрут к 1.1.1.1 у меня через eth0.20 → значит, спуфинг → DROP». Молча, без следов в обычных логах; видно только в tcpdump (пакет был) vs отсутствии отклика (пакета «нет»).
Лечение для многоадресного хоста:
bash
sysctl -w net.ipv4.conf.all.rp_filter=2 # loose mode: достаточно, чтобы МАРШРУТ К ИСТОЧНИКУ существовал
# (strict=1 требует симметрии — неприемлемо для multihomed/VPN/multi-WAN)Уроки
- Linux-роутер = ip_forward + MASQUERADE + dnsmasq. Всё, что делает RouterOS «под капотом», здесь лежит открытыми текстовыми командами.
- Пакетный метод решает «невозможное»: tcpdump на каждом стыке сузил проблему до «ответы приходят, но ядро их ест» — дальше уже знание механизмов (uRPF).
- rp_filter — реальный саботирующий фактор в сценариях: два провайдера (multi-WAN), VPN-клиенты + дефолтный маршрут, policy routing, маршрутизаторы за маршрутизаторами. Симптом всегда одинаковый: «одинаковые пакеты с одних интерфейсов проходят, с других — молча нет». На собеседовании это отличный козырь.
- Счётчики iptables (
-v) — простейший «мониторинг» прохождения NAT: растёт = правило работает. - dnsmasq — швейцарский нож embedded-сетей: DHCP + DNS-форвардер + TFTP в одном маленьком бинарнике (им пользуется и libvirt, и OpenWRT, и миллионы роутеров).
Что показать работодателю
Скриншоты: конфиг роутера (6 команд), iptables -t nat -L -v со счётчиком, tcpdump-пара «ответ пришёл → пинг мёртв» и финальный пинг через двойной NAT. Плюс рассказ устно про rp_filter — это уровень «не новичок».