Зеркалирование RADIUS-трафика через GRE-туннель

Инструкция описывает, как настроить на BNG копирование RADIUS-трафика в GRETAP-туннель на отдельный сервер, например для анализа или записи в pcap. Зеркалирование выполняется средствами tc (классификатор flower и действие mirred), без изменения основного трафика.

Здесь описан частный случай: зеркалируется только accounting (UDP-порт 1813) и только на один сервер. Чтобы зеркалировать другие порты или отправлять копию на другие серверы, добавьте нужные фильтры и параметры в скрипт.

Параметры примера

Переменная Значение Описание
IF ens18 Интерфейс BNG, через который идёт RADIUS-трафик
LOCAL 10.16.20.226 Адрес BNG — локальный конец туннеля
REMOTE 10.16.20.225 Адрес сервера, на который отправляется копия трафика
PEER 10.16.20.231 Адрес RADIUS-сервера, трафик с которым зеркалируется
TUN gre-mirror Имя GRETAP-интерфейса

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

Шаг 1. Создать скрипт

Создать файл /usr/local/bin/bng_mirror_radius.sh:

bng_mirror_radius.sh
#!/bin/bash
# Зеркало RADIUS accounting (udp/1813) между 10.16.20.226 <-> 10.16.20.231 в GRETAP на 10.16.20.225
set -e
 
IF=ens18
LOCAL=10.16.20.226
REMOTE=10.16.20.225
PEER=10.16.20.231
TUN=gre-mirror
 
start() {
  modprobe ip_gre; modprobe cls_flower; modprobe act_mirred
 
  ip link add $TUN type gretap local $LOCAL remote $REMOTE ttl 64
  ip link set $TUN up
 
  tc qdisc add dev $IF clsact
 
  # Входящие от 231 (запросы на 1813 или ответы с 1813)
  tc filter add dev $IF ingress protocol ip prio 1 flower ip_proto udp src_ip $PEER dst_port 1813 \
     action mirred egress mirror dev $TUN
  tc filter add dev $IF ingress protocol ip prio 2 flower ip_proto udp src_ip $PEER src_port 1813 \
     action mirred egress mirror dev $TUN
 
  # Исходящие на 231
  tc filter add dev $IF egress protocol ip prio 1 flower ip_proto udp dst_ip $PEER dst_port 1813 \
     action mirred egress mirror dev $TUN
  tc filter add dev $IF egress protocol ip prio 2 flower ip_proto udp dst_ip $PEER src_port 1813 \
     action mirred egress mirror dev $TUN
}
 
stop() {
  tc qdisc del dev $IF clsact 2>/dev/null || true
  ip link del $TUN 2>/dev/null || true
}
 
case "$1" in
  start) start ;;
  stop)  stop ;;
  restart) stop; start ;;
  *) echo "Usage: $0 {start|stop|restart}"; exit 1 ;;
esac

Шаг 2. Сделать скрипт исполняемым

chmod +x /usr/local/bin/bng_mirror_radius.sh

Шаг 3. Создать systemd-юнит

Создать файл /etc/systemd/system/bng_mirror_radius.service:

bng_mirror_radius.service
[Unit]
Description=Mirror RADIUS accounting via GRETAP
After=network-online.target
Wants=network-online.target
 
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/bng_mirror_radius.sh start
ExecStop=/usr/local/bin/bng_mirror_radius.sh stop
 
[Install]
WantedBy=multi-user.target

Шаг 4. Запустить сервис

Перечитать конфигурацию systemd и запустить сервис:

systemctl daemon-reload
systemctl start bng_mirror_radius.service

Чтобы зеркалирование включалось после перезагрузки, добавить сервис в автозапуск:

systemctl enable bng_mirror_radius.service

Проверка

На BNG убедиться, что туннель поднят и фильтры добавлены:

ip -d link show gre-mirror
tc filter show dev ens18 ingress
tc filter show dev ens18 egress

На сервере-получателе (10.16.20.225) проверить, что приходит GRE-трафик:

tcpdump -ni <интерфейс> proto gre

Пример трафика

Пример захвата зеркалированного трафика: gre_radius.pcap