у меня это все организовано следующим образом:
Есть сервер (один) на нем установлен биллинг (abills) на нем у меня 2-а типа авторизации.
прицип такой:
1 PPPoE пользователь пытается подключиться к инету pppoe-server отправляет данные radiusclint(om) на freeradius-server то в свою очередь сверят с БД и отправляют обратно данные с параметрами сесии. используется дополнительная программа которая подключается к 80 порту т.е. по HTTP и считывает давнные для пользователя, типа (личный кабинет пользователя)
2 авторизация по IP MAC логин и пасс
Принцеп такой.
есть подсеть которая по умолчанию должна быть в дропе, при попытке войти на любой сайт должен сработать редирект и пользователя должно перекинуть на 80 или 9443 порт сервера для дальнейшего прохожденя авторизации, после авторизации сервер через пхп скрипты добавляет в айпитаблес правила типа
это правило должно его вернуть из цепочки редиректа на 80 порт на форвард на сети 0/0 и с сетей 0/0 на его айпи адрес
$conf{IPN_FW_START_RULE}="sudo iptables -t nat -I REDIR_AUTH -s %IP -j RETURN; sudo iptables -I FORWARD -s %IP -d 0/0 -j ACCEPT; sudo iptables -I FORWARD -s 0/0 -d %IP -j ACCEPT; sudo /usr/abills/libexec/linkupdown ipn up eth1 %LOGIN %IP". ' > /dev/null 2>&1;'. "/usr/local/bin/sudo /sbin/ipfw -q add %NUM allow ip from %IP to any; /usr/local/bin/sudo /sbin/ipfw -q add %NUM allow ip from any to %IP";
после отключения мы должны его вывести из форварда и отправить в цепь, в которой он будет попадать опять на редирект
$conf{IPN_FW_STOP_RULE}="sudo iptables -I FORWARD -s %IP -d 0/0 -j DROP; sudo iptables -I FORWARD -s 0/0 -d %IP -j DROP; sudo /usr/abills/libexec/linkupdown ipn down eth2 %LOGIN %IP". ' > /dev/null 2>&1;'. "/usr/local/bin/sudo /sbin/ipfw -q delete %NUM";