Делается элементарно: берём ipfw2, описываем доступ к ресурсам сети для адресов в таблице, а скриптами добавляем/удаляем адреса в/из таблицы.
ipfw add pass tcp from any to any established
ipfw add pass tcp from table(1) to any 20,21,22,25,80,110,119,443,3128 setup
Номера портов указаны по памяти навскидку, правила для udp по аналогии придумаете сами. Остальную обвязку стенки уж как-нибудь сами - /etc/rc.firewall вам в руки...
OnConnect:
ipfw table 1 add ${IP}
OnDisconnect:
ipfw table 1 delete ${IP}