Ограничение доступа для различных групп пользователей для BGRadiusDialup

Материал из BiTel WiKi

Перейти к: навигация, поиск

Появилась необходимость ограничить доступ к VPN серверу для определенных категорий пользователей.

Описание: Определяем IP, с которого происходит подключение, и категорию пользователя. Если ему не разрешено подключаться с этого IP, то клиент получает ошибку 691. В мониторе ошибок появляется ошибка с кодом 27 "Запрещен вход с данного телефона".

Договора, которые входят в группу с кодом 20, не проверяются.


Событие "Модуль Dialup => Radius - аутентификация"

import bitel.billing.server.call.bean.*; 
import bitel.billing.server.radius.*; 
import bitel.billing.server.dialup.bean.*; 
import bitel.billing.server.contract.bean.*; 
import bitel.billing.server.script.event.*; 
import bitel.billing.server.util.*;
 
import java.sql.*;
import java.util.*; 
 
private getLogin_( req, resp ) 
{ 
      result = null; 
      userName = req.getStringAttribute( RadiusStandartAttributes.User_Name ); 
 
      if ( userName != null ) 
      { 
            int pos = userName.indexOf( '\\' ); 
            if( pos >= 0 ) 
            { 
                userName = userName.substring( pos + 1 ); 
            } 
 
         try 
         { 
			 date_ = new java.util.Date();
            result = new DialUpLoginManager( con, mid ).findLogin( userName,date_ ); 
         } 
         catch ( Exception ex ) 
         { 
            ex.printStackTrace(); 
         } 
         finally 
         { 
            //setup.returnConToPool( con ); 
         } 
      } 
 
      return result; 
} 
private WriteErrorLogin()
{
	query = "SELECT max(id) FROM log_server_"+mid+"_"+TimeUtils.format(DateNow, "yyyyMM")+" WHERE requests LIKE '%User-Name="+User_Name+"\n%'";
	ps = con.prepareStatement(query);
	rs = ps.executeQuery();
	if ( !rs.next() )
	{
		return;
	}
	log_rec_id = rs.getInt(1);
	query = "SELECT id FROM nas_"+mid+" WHERE inet_ntoa(ipaddr)='"+nas_ip+"'";
	ps = con.prepareStatement(query);
	rs = ps.executeQuery();
	if ( !rs.next() )
	{
		return;
	}
	nas_id = rs.getInt(1);
	query = "SELECT * FROM log_error_"+mid+"_"+TimeUtils.format(DateNow, "yyyyMM")+" WHERE log_rec_id='"+log_rec_id+"'";
	ps = con.prepareStatement(query);
	rs = ps.executeQuery();
	if ( rs.next() )
	{
		return;
	}
	query = "INSERT INTO log_error_"+mid+"_"+TimeUtils.format(DateNow, "yyyyMM")+" (dt,cid,lid,login,nas_id,error_code,log_rec_id) "+
	"VALUES ('"+TimeUtils.format(DateNow, "yyyy-MM-dd HH:mm:ss")+"', '"+cid+"', '"+login_id+"', '"+User_Name+"', '"+nas_id+"', '27', '"+log_rec_id+"')";
	psUpdate = con.prepareStatement( query );
	psUpdate.executeUpdate();
} 
 
mid = 1;
//Не проверять Calling_Station_Id
GROUP_NOT_Calling_Station_Id = 20;
 
request  = event.getRequest(); 
response = event.getResponse(); 
con = setup.getDBConnectionFromPool(); 
 
User_Name = request.getStringAttribute(RadiusStandartAttributes.User_Name); 
nas = request.getNAS();
nas_ip = nas.getNASIPAddress();
login = getLogin_(request,response);
if (login == null)
{
	setup.returnConToPool( con );
	return;
};
 
login_ip = request.getStringAttribute(RadiusStandartAttributes.Calling_Station_Id); 
login_id = login.getId();
 
cid = login.getCid();
contract = new ContractManager(con).getContractByID(cid);
contract_firma = contract.getFirmID();
contract_fc = contract.getFc();
contract_groups = contract.getGroups();
 
DateNow = new GregorianCalendar();
if (contract_firma == null)
{
	setup.returnConToPool( con );
	return;
};
if (nas_ip.indexOf("172.16.128.4") != -1)
{
	//Пропускаем так как это модемный пул
	setup.returnConToPool( con );
	return;
}; 
if ((contract_groups & (1L<<GROUP_NOT_Calling_Station_Id )) > 0)
{
	//Пропускаем, для этого договора мы не проверяем.
	setup.returnConToPool( con );
	return;
};
 
if (login_ip.matches("^10\\.0\\.2\\.[0-9]{1,3}$"))
{
	//Админский сегмен.
	setup.returnConToPool( con );
	return;
}; 
 
//физики тип1
if (contract_firma == 2 && contract_fc == 0 && !login_ip.matches("^10\\.[1-4]\\.[0-9]{1,3}\\.[0-9]{1,3}$"))
{
	response.setPacketType(RadiusPacket.AUTHENTICATION_REJECT);
	print("Drop "+User_Name+" "+login_ip);
	WriteErrorLogin();
	setup.returnConToPool( con );
	return;
}
 
//Остальные физики
if ((contract_firma == 1 || contract_firma == 4) && contract_fc == 0 && login_ip.matches("^10\\.[1-4,33,64]\\.[0-9]{1,3}\\.[0-9]{1,3}$"))
{
	response.setPacketType(RadiusPacket.AUTHENTICATION_REJECT);
	print("Drop "+User_Name+" "+login_ip);
	WriteErrorLogin();
	setup.returnConToPool( con );
	return;
}
 
//Обязательно закрыть соединение, иначе беда :)
setup.returnConToPool( con );
Личные инструменты