Управление доступом на 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:порт, логин, пароль.