Управление доступом на Linux-маршрутизаторе

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

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

Код :

package ru.bitel.bgbilling.modules.inet.dyn.device.linux;
 
import org.apache.log4j.Logger;
import org.jfree.util.Log;
 
import bitel.billing.common.IPUtils;
import bitel.billing.server.util.ssh.SSHSession;
import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivator;
import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorAdapter;
import ru.bitel.bgbilling.modules.inet.access.sa.ServiceActivatorEvent;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDevice;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetDeviceType;
import ru.bitel.bgbilling.modules.inet.api.common.bean.InetServ;
import ru.bitel.bgbilling.server.util.Setup;
import ru.bitel.common.ParameterMap;
import ru.bitel.common.Utils;
import ru.bitel.common.inet.IpAddress;
 
public class LinuxServiceActivator
	extends ServiceActivatorAdapter
	implements ServiceActivator
{
 
	private SSHSession session = null;  
	private InetDevice inetDevice = null;
	private static final Logger logger = Logger.getLogger( LinuxServiceActivator.class ); 
 
	@Override
	public Object init( Setup setup, int moduleId, InetDevice inetDevice, InetDeviceType inetDeviceType, ParameterMap parameterMap )
		throws Exception
	{
		this.inetDevice = inetDevice;
		return null;
	}
 
	@Override
	public Object connect()
		throws Exception
	{
		String hostPort = inetDevice.getHost();
		String host = hostPort.substring( 0, hostPort.indexOf( ":" ) );
		int port = Utils.parseInt( hostPort.substring( hostPort.indexOf( ":" ) + 1 ) );
 
		session = new SSHSession( host, port, inetDevice.getUsername(), inetDevice.getPassword() );
		session.setEndString( "$" );
 
		logger.debug( "before connect" );
		String result = session.connect();
		logger.debug( "connecting: " + result );
		logger.debug( "after connect" );
		session.setEndString( ":" );
		result = session.doCommand( "sudo -i" ) ;
		logger.debug( "sudo result: " + result );
		session.setEndString( "#" );
		result = session.doCommand( inetDevice.getPassword() ) ;
		logger.debug( "passwd result: " + result );
 
 
 
 
 
 
 
		return null;
	}
 
	@Override
	public Object onAccountingStart( ServiceActivatorEvent serviceActivatorEvent )
		throws Exception
	{
		return null;
	}
 
	@Override
	public Object serviceModify( ServiceActivatorEvent serviceActivatorEvent )
		throws Exception
	{
		//11
		logger.debug( "newState= " +  serviceActivatorEvent.getNewState() );
		if ( serviceActivatorEvent.getNewState() != serviceActivatorEvent.getOldState() )
		{
			if ( serviceActivatorEvent.getNewState() ==  InetServ.STATE_DISABLE  )
			{
				logger.debug( "closing" );
				InetServ serv = serviceActivatorEvent.getNewInetServ();
				String ip = IpAddress.toString( serv.getAddressFrom() );
				String command =" iptables -t nat -I PREROUTING 1 -p tcp -m tcp -s " + ip +   
				" --dport 1:65535 -j DNAT --to-destination xxx.xxx.xxx.xxx:xxxx; iptables -t mangle -I FORWARD -p udp -s " + ip +
				" --dport 1:52  -j TTL --ttl-set 0; iptables -t mangle -I FORWARD -p udp -s " + ip +
				" --dport 54:  -j TTL --ttl-set 0";
 
				logger.debug( "command = " +  command );
 
				String result = session.doCommand( command );		
				logger.debug( "result = " + result) ;
				logger.debug( "OK" );
				return null;
			}
			else if ( serviceActivatorEvent.getNewState() ==  InetServ.STATE_ENABLE  )
			{
				logger.debug( "opening" );
				InetServ serv = serviceActivatorEvent.getNewInetServ();
				String ip = IpAddress.toString( serv.getAddressFrom() );
				String command = " iptables -t nat -D PREROUTING -p tcp -m tcp -s " + ip +   
				" --dport 1:65535 -j DNAT --to-destination xxx.xxx.xxx.xxx:xxxx; iptables -t mangle -D FORWARD -p udp -s " + ip +
				" --dport 1:52  -j TTL --ttl-set 0; iptables -t mangle -D FORWARD -p udp -s " + ip +
				" --dport 54:  -j TTL --ttl-set 0";
				logger.debug( "command = " +  command );				
				String result = session.doCommand( command );		
				logger.debug( "result = " + result) ;				
				logger.debug( "OK" );
			}
 
		}
		return null;
	}
 
	@Override
	public Object destroy()
		throws Exception
	{
		return null;
	}
 
	@Override
	public Object onAccountingStop( ServiceActivatorEvent serviceActivatorEvent1 )
		throws Exception
	{
		return null;
	}
 
 
	@Override
	public Object connectionClose( ServiceActivatorEvent serviceActivatorEvent )
		throws Exception
	{		
		return null;
	}
 
 
	@Override
	public Object serviceCreate( ServiceActivatorEvent serviceActivatorEvent1 )
		throws Exception
	{
		return null;
	}
 
 
	@Override
	public Object disconnect()
		throws Exception
	{
		//Тут желательно несколько раз вызвать session.doCommand("exit"). Количество зависит от того, сколько раз заходили и куда.  
                //При чем последний вызов(из консоли) скорее всего надо сделать doComandAsync.               
 
                session.disconnect();
                session = null;
		return null;
	}
 
	@Override
	public Object serviceCancel( ServiceActivatorEvent serviceActivatorEvent1 )
		throws Exception
	{
		return null;
	}
 
	@Override
	public Object connectionModify( ServiceActivatorEvent serviceActivatorEvent )
		throws Exception
	{
		return null;
	}
 
 
}

Примерная инструкция того , что делалось

1. Добавил модуль inet.
2. Обновил вам сервер (update.sh). 
3. Вкладка модуля inet ->Устройтсва и ресурсы->Типы устройств. Создал там 3 типа устройств:  Accounting + Access сервер, flow-agent, Linux router.
4. Потом там же на вкладке устройств создал иерархично  3 устройства по одному на каждый тип. 
5. Для   Accounting + Access сервер задал такую конфигурацию:
#категория ip-ресурса
ip.resource.category=1
И остальные настройки сюда , их копировать не буду.
6. Для netflow указал host — 1.1.1.1, откуда будет идти трафик.
7. Для Linux router указал конфигурацию
flow.agent.link=2:-1
            Это означает что netflow собираем с устройства с кодом 2(устройство netflow) и любого интерфейса( -1 ).  

8. На вкладке  Тип сервисов  добавил  Тестовый адрес(инициализация по трафику, тип адреса - статический , галочка - устройство).   конфигурация — title.pattern=(${addressRange})
. 
9. Вкладка модуля inet ->Устройтсва и ресурсы->Ip ресурсы. Вначале в левом окне с помощью верхней кнопки добавить  добавляю категорию test, потом в правой диапазон 212.100.155.0-212.100.155.255 с помощью с другой конопки. 
 
10.   Вкладка модуля inet ->Трафик->Типы трафика. Добавляю  входящий/исходящий.
 Время там уже было по умолчанию.
11. Там же на привязке типов трафика создаю привязку netflow, в ней 2 строки типа коллектор, входящий трафик привязываю ко входящему типу трафика и исходящий аналогично . 
12. Возвращаемся в тип сервиса (8 пункт ) и указываем там привязку -netfow.
13. Модули->Редактор модулей и услуг . Для модуля inet добавляем 2 услуги — Входящий , исходящий трафик.
14. Справочники-> Тарифные планы. Создал  тариф с Test_bitel модулем с inet,  добавил для каждого типа трафика цену и услугу.

15. Создал  договор - bitel_test, в нем добавил модуль inet.
16.  В модуле inet в договоре  добавляем сервис на договор , в нем с помошью кнопок << выбираем нужный ip и устройство.
 Я пока забил сам 1.1.1.1 т.е для самого же роутера и соберем для теста.

Это вроде бы все пока  по серверу. Далее настраиваем accounting и access-сервера. Опишу  ниже.  
1. Скачал accounting-сервер С  ftp://bgbilling.ru/pub/bgbilling/5.2/BGInetAccounting_5.2_57.zip
В /usr/local/BGInetAccounting.
2. В inet-accounting.xml поменял следующие строки
Код приложения , вбил просто 1
<param name="app.id" value=""/>
код модуля inet, у вас 10
<param name="moduleId" value=""/>
код устойства, у вас 1 — это Access+Acounting
<param name="rootDeviceId" value=""/>

Далее раскоментировал настойки netflow и указал нужные данные. Фактически только port — 13486 И  agentDeviceIds -2 (код устройства с которого получать netflow-поток).

 <context name="collector">
        <scheduledExecutorService name="hrlydtlggr" corePoolSize="1"/>

        <bean name="flowDataLogger" class="ru.bitel.bgbilling.modules.inet.collector.IPHourlyDataLogger">
            <param name="scheduledExecutor">hrlydtlggr</param>
        </bean>

        <bean name="flowListener" class="ru.bitel.bgbilling.modules.inet.collector.InetFlowListener">
            <constructor factoryMethod="newInstance">
                <param name="type" value="netflow"/>
                <param name="host" value=""/>
                <param name="port" value="13486"/>
                <param name="threadCount" value="10"/>
                <param name="recvBufferSize">8 * 1024 * 1024</param>
                <param name="soRCVBUF">512 * 1024</param>
                <param name="agentDeviceIds" value="2"/>
            </constructor>
        </bean>


3. запустил update.sh
4. запустил accounting_start.sh. Можете настроить его как службу.


5. Скачал access-сервер
6. В inet-access.xml поменял следующие строки
:
Код приложения , вбил просто 2
<param name="app.id" value=""/>
код модуля inet, у вас 10
<param name="moduleId" value=""/>
код устойства, у вас 1 — это Access+Acounting
<param name="rootDeviceId" value=""/>
7.запустил update.sh
8. запустил access_start.sh. Можете настроить его как службу.

1. В типе устроятсва Linux router я добавил обработчик активации сервисов
 ru.bitel.bgbilling.modules.inet.dyn.device.linux.LinuxServiceActivator
Он правится потом в Сервис-Автоматизация-Управление динамическим кодом.  там сохраняется и компилируется.
2. В устойстве Linux router задал host:порт, логин, пароль. 

Личные инструменты