Хук на Core_Command_Controller_Default.onBeforeShowAction, проверяете IP, и если не нравится - выводите
$oCore_Response = new Core_Response();
$oCore_Response
->status(503)
->header('Content-Type', "text/html; charset=UTF-8")
->header('Last-Modified', gmdate('D, d M Y H:i:s', time()) . ' GMT')
->header('X-Powered-By', 'HostCMS');
$oCore_Response->body('Доступ запрещен');
$oCore_Response->sendHeaders()
->showBody();
die();