{{indexmenu_n>6}}
====== Mirroring RADIUS Traffic via a GRE Tunnel ======
This guide describes how to configure the BNG to copy RADIUS traffic into a GRETAP tunnel towards a separate server, for example, for analysis or for saving to a pcap file. Mirroring is performed with ''tc'' (the ''flower'' classifier and the ''mirred'' action) and does not affect the original traffic.
This guide covers a specific case: only accounting traffic (UDP port 1813) is mirrored, and only to one server. To mirror other ports or send copies to other servers, add the required filters and parameters to the script.
===== Example parameters =====
^ Variable ^ Value ^ Description ^
| ''IF'' | ens18 | BNG interface that carries RADIUS traffic |
| ''LOCAL'' | 10.16.20.226 | BNG address — local end of the tunnel |
| ''REMOTE'' | 10.16.20.225 | Address of the server that receives the mirrored traffic |
| ''PEER'' | 10.16.20.231 | Address of the RADIUS server whose traffic is mirrored |
| ''TUN'' | gre-mirror | GRETAP interface name |
Before running the script, we recommend replacing these values with ones that match your network.
=== Step 1. Create the script ===
Create the file ''/usr/local/bin/bng_mirror_radius.sh'':
#!/bin/bash
# Mirror RADIUS accounting (udp/1813) between 10.16.20.226 <-> 10.16.20.231 to GRETAP towards 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
# Incoming from 231 (requests to 1813 or responses from 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
# Outgoing to 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
=== Step 2. Make the script executable ===
chmod +x /usr/local/bin/bng_mirror_radius.sh
=== Step 3. Create a systemd unit ===
Create the file ''/etc/systemd/system/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
=== Step 4. Start the service ===
Reload the systemd configuration and start the service:
systemctl daemon-reload
systemctl start bng_mirror_radius.service
To enable mirroring automatically after a reboot, add the service to startup:
systemctl enable bng_mirror_radius.service
=== Verification ===
On the BNG, make sure the tunnel is up and the filters are added:
ip -d link show gre-mirror
tc filter show dev ens18 ingress
tc filter show dev ens18 egress
On the receiving server (10.16.20.225), check that GRE traffic is arriving:
tcpdump -ni proto gre
=== Traffic example ===
Sample capture of mirrored traffic: {{en:dpi:bras_bng:radius_integration:radius_accounting:gre_radius.pcap|gre_radius.pcap}}