Здравствуйте, коллеги.
Предистория:
Начал я писать проект для решения именно этой задачи. идея какова:Юзер ломится в инет, на роутере(FreeBSD, почему расскажу позже) мы это детектим, шлем запрос на radius(там передаем IP клиента), если radius нас пустил то создаем "сессию". в ней указывается "внутренний"(серый) адрес, "внешний"(белый) адрес и ряд дополнительных параметров. внешний адрес мы берем либо из параметра ответа Framed-IP-Address, либо, если нам сервер передал имя IP пулла, то выделяем из него. Далее регулярно мы смотрим как у нас поживает сессия, забираем из ядра в userspace статистику и отправляем ее на Radius сервер. Когда мы понимаем что юзер долго(Session-idle-timeout) ничего не шлет/получает мы отваливаемся, либо отваливаемся когда прошло уже Sesssion-Timeout времени. Так-же при старте/стопе сессии есть возможность удалять/добавлять адрес (локальный или внешний) в таблицу IPFW (это тоже передается через radius).
Что есть сейчас: Все что написано в предидущем абзаце есть и, вроде, даже работает.
Как это реализовано: netgraph нода, у нее 3 основные хука lan - тут у нас локалка, wan - тут интернет, ctl - сюда подключается userspace daemon, который рулит всем процессом. внутри реализован простой NAT (1 в 1, без трансляции портов) (пока нет поддержки SCTP) и уведомление о новых сессиях через ctl хук. Нода поддерживает операции создания, удаления сессии с заданными локальным и внешним адресом, получение статистики о каждой сессии (кол-во пакетов и байт в каждую сторону) и получение списка сессиий. Так-же есть еще дополнительный хук, wanrej - это для заблоченых юзеров, этих юзером мы прозрачно проксируем на сайт с обзяснением о сложившейся ситуации. В netgraph ноду трафик заворачивается через ipfw. там-же будет происходить ограничение скоростей через dummynet. В юзерспейсе крутится демон, который коннектится к netgraph ноде, получает от нее уведомления о новых сессиях, запрашивает инфу о сессиях у радиуса, создает сессии в нетграф ноде, забирает оттуда статистику, отправляет ее на радиус, следит затаймаутами и управляет таблицами IPFW.
почему FreeBSD: а что еще? Не солярис-же? На самом деле у FreeBSD есть отличная технология netgraph, которая сильно упрощает разработку и внедрение подобных вещей.
Чего еще нет но скоро будет: поддержка кластера: это когда есть несколько узлов, и при появлении сессии на одном из узлов, она появляется на всех узлах кластера, общие синхронизированные пуллы адресов, узлы поддерживают одну или несколько(для балансировки нагрузки) carp групп, если один из узлов выходит из строя то юзер ничего не заметит.
Проект будет OpenSource, лицензия скорее всего BSD.
Кому такой проект интересен? Какие еще будут пожелания?