Реализация связки Dlink DGS-3610-26G + DES-1228G(vlan на клиента) на основе схемы Cisco2 + Zyxel ( DGS-3610-26G + DES-1228G )
Материал из BiTel WiKi
(Различия между версиями)
Stark (Обсуждение | вклад) |
Stark (Обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
+ | Подключение абонентов по схеме "vlan-на-клиента", при этом используется оборудование D-Link - на уровне доступа свитчи | ||
+ | DES-1228G, в ядре - DGS-3610-26G. | ||
+ | Это шлюз ядра(DGS-3610-26G). | ||
+ | |||
+ | конфигурация шлюза | ||
+ | |||
+ | <source lang="bash"> | ||
+ | user_rule.editor.class=bitel.billing.module.services.ipn.editor.vlan.CiscoVlanContactRuleEditor | ||
+ | gate_manager.class=bitel.billing.server.ipn.vlan.CiscoVlanGateWorker | ||
+ | use.script=1 | ||
+ | </source> | ||
+ | |||
+ | Команды шлюза | ||
+ | |||
+ | <source lang="bash"> | ||
+ | [DEFAULT] | ||
+ | |||
+ | [REMOVE] | ||
+ | no vlan {VID} | ||
+ | [/REMOVE] | ||
+ | |||
+ | [OPEN] | ||
+ | |||
+ | vlan {VID} | ||
+ | exit | ||
+ | vlan 100 | ||
+ | subvlan {VID} | ||
+ | exit | ||
+ | vlan {VID} | ||
+ | subvlan-address-range {addr1} {addr2} | ||
+ | exit | ||
+ | |||
+ | ip access-list extended 101 | ||
+ | <LOOP> | ||
+ | no deny ip host {A} any | ||
+ | no deny ip any host {A} | ||
+ | </LOOP> | ||
+ | exit | ||
+ | [/OPEN] | ||
+ | |||
+ | [CLOSE] | ||
+ | interface gigabitethernet 0/22 | ||
+ | no ip access-group 101 in | ||
+ | exit | ||
+ | ip access-list extended 101 | ||
+ | no permit ip any any | ||
+ | <LOOP> | ||
+ | deny ip host {A} any | ||
+ | deny ip any host {A} | ||
+ | </LOOP> | ||
+ | permit ip any any | ||
+ | exit | ||
+ | interface gigabitethernet 0/22 | ||
+ | ip access-group 101 in | ||
+ | exit | ||
+ | [/CLOSE] | ||
+ | [/DEFAULT] | ||
+ | |||
+ | </source> | ||
+ | |||
+ | скрпит шлюза | ||
<source lang="java"> | <source lang="java"> | ||
import java.io.IOException; | import java.io.IOException; | ||
Строка 15: | Строка 76: | ||
import bitel.billing.server.util.DefaultServerSetup; | import bitel.billing.server.util.DefaultServerSetup; | ||
import bitel.billing.server.util.Utils; | import bitel.billing.server.util.Utils; | ||
+ | import bitel.billing.server.util.telnet.OperationTimedoutException; | ||
import bitel.billing.server.util.telnet.TelnetSession; | import bitel.billing.server.util.telnet.TelnetSession; | ||
import ru.bitel.bgbilling.common.DefaultSetup; | import ru.bitel.bgbilling.common.DefaultSetup; | ||
import bitel.billing.common.IPUtils; | import bitel.billing.common.IPUtils; | ||
import bitel.billing.server.util.Utils; | import bitel.billing.server.util.Utils; | ||
+ | import bitel.billing.server.util.telnet.OperationTimedoutException; | ||
import bitel.billing.server.util.telnet.TelnetSession; | import bitel.billing.server.util.telnet.TelnetSession; | ||
- | + | import ru.bitel.bgbilling.modules.ipn.common.bean.*; | |
+ | import bitel.billing.server.util.telnet.ansi.TelnetAnsiSession; | ||
//includeBGBS( "bgbs://ru.bitel.bgbilling.kernel.script.common.bean.ScriptLibrary/manad" ); | //includeBGBS( "bgbs://ru.bitel.bgbilling.kernel.script.common.bean.ScriptLibrary/manad" ); | ||
Строка 27: | Строка 91: | ||
{ | { | ||
log.info( "start of cisco........................................................"); | log.info( "start of cisco........................................................"); | ||
+ | |||
host = gate.getHost(); | host = gate.getHost(); | ||
port = gate.getPort(); | port = gate.getPort(); | ||
Строка 47: | Строка 112: | ||
log.debug("before connect"); | log.debug("before connect"); | ||
- | session = new | + | session = new TelnetAnsiSession( host, port); |
session.setTimeout( timeout ); | session.setTimeout( timeout ); | ||
session.setLoginPromptSequence( ":" ); | session.setLoginPromptSequence( ":" ); | ||
- | session.connect(); | + | result.append( session.connect() ); |
log.debug("after connect"); | log.debug("after connect"); | ||
Строка 74: | Строка 139: | ||
- | log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); | + | log.info("!!!!!!!!!!!start of log!!!!!!!!!!!!!!!!!!!!!"); |
log.info( result ); | log.info( result ); | ||
- | log.info("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); | + | log.info("!!!!!!!!!!!!!!! end of log !!!!!!!!!!!!!!!!!"); |
log.debug( "ok" ); | log.debug( "ok" ); | ||
Строка 82: | Строка 147: | ||
log.info( "end of cisco........................................................"); | log.info( "end of cisco........................................................"); | ||
+ | |||
} | } | ||
Строка 90: | Строка 156: | ||
- | private void doCommands( | + | private void doCommands( session, result, gateSetup) throws IOException, OperationTimedoutException |
{ | { | ||
acl = gateSetup.getStringValue( "acl"); | acl = gateSetup.getStringValue( "acl"); | ||
- | vlanResult = getVlanResult( session ); | + | vlanResult = getVlanResult( session ); |
+ | log.info( "!!!!!!!!!!!!!!!!!!!!!!!!!!vlanResult!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ); | ||
+ | log.info( vlanResult ); | ||
+ | log.info( "!!!!!!!!!!!!!!!!!!!!!!!!!!vlanResult!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ); | ||
+ | |||
aclResult = getAclResult( session, acl ); | aclResult = getAclResult( session, acl ); | ||
Строка 105: | Строка 175: | ||
VlanManager manager = new VlanManager(status.mid, con); | VlanManager manager = new VlanManager(status.mid, con); | ||
gateId = gate.getId(); | gateId = gate.getId(); | ||
- | log.info("gateId=" + gateId); | + | //log.info("gateId=" + gateId); |
vid = manager.getVlan( gateId, status.contractId ); | vid = manager.getVlan( gateId, status.contractId ); | ||
- | log.info("vid=" + vid); | + | //log.info("vid=" + vid); |
+ | log.debug( "status=" + status.status); | ||
Строка 122: | Строка 193: | ||
addr1 = IPUtils.convertIpToString( range.getAddr1() ); | addr1 = IPUtils.convertIpToString( range.getAddr1() ); | ||
addr2 = IPUtils.convertIpToString( range.getAddr2() ); | addr2 = IPUtils.convertIpToString( range.getAddr2() ); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | log.info( "empty adress on cid = " + status.contractId ); | ||
+ | continue; | ||
} | } | ||
Строка 130: | Строка 206: | ||
rules = getOpenRules( status, vid, gateSetup, addr1, addr2, acl ); | rules = getOpenRules( status, vid, gateSetup, addr1, addr2, acl ); | ||
} | } | ||
- | else if (status.status == IPNContractStatus.STATUS_REMOVED && vlanExists(vid, vlanResult) ) | + | else if (status.status == IPNContractStatus.STATUS_REMOVED && ( vlanExists(vid, vlanResult) || isUserDenied( addr1, addr2,aclResult) ) ) |
{ | { | ||
rules = getRemoveRules( status, vid, gateSetup, addr1, addr2, acl ); | rules = getRemoveRules( status, vid, gateSetup, addr1, addr2, acl ); | ||
} | } | ||
//if closed and etc | //if closed and etc | ||
- | else if ( ! | + | else if ( status.status != IPNContractStatus.STATUS_OPEN && status.status != IPNContractStatus.STATUS_REMOVED && !isUserDenied( addr1, addr2, aclResult) ) |
{ | { | ||
rules = getCloseRules( status, vid, gateSetup, addr1, addr2, acl ); | rules = getCloseRules( status, vid, gateSetup, addr1, addr2, acl ); | ||
Строка 144: | Строка 220: | ||
for ( String rule : rules ) | for ( String rule : rules ) | ||
{ | { | ||
- | log.debug ("command=" + rule ); | + | //log.debug ("command=" + rule ); |
result.append( session.doCommand( rule ) ); | result.append( session.doCommand( rule ) ); | ||
} | } | ||
Строка 155: | Строка 231: | ||
getOpenRules( status, vid, gateSetup, addr1, addr2, acl ) | getOpenRules( status, vid, gateSetup, addr1, addr2, acl ) | ||
{ | { | ||
- | + | log.debug( "geting open rules..."); | |
+ | return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]", vid, gateSetup, addr1, addr2, acl ); | ||
} | } | ||
getCloseRules( status, vid, gateSetup, addr1, addr2, acl ) | getCloseRules( status, vid, gateSetup, addr1, addr2, acl ) | ||
{ | { | ||
- | + | log.debug( "geting close rules..."); | |
+ | return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]", vid, gateSetup, addr1, addr2, acl ); | ||
} | } | ||
getRemoveRules( UserStatus status, vid, gateSetup, addr1, addr2, acl ) | getRemoveRules( UserStatus status, vid, gateSetup, addr1, addr2, acl ) | ||
- | { | + | { |
- | + | log.debug( "geting remove rules..."); | |
+ | return getRules( status, "\\[REMOVE\\](.*)\\[/REMOVE\\]", vid, gateSetup, addr1, addr2, acl ); | ||
} | } | ||
Строка 171: | Строка 250: | ||
{ | { | ||
// пользовательское правило, без типа - то все оставляем как есть | // пользовательское правило, без типа - то все оставляем как есть | ||
- | + | CiscoRule ciscoRule = new CiscoRule ( status.rule.getRuleText() ); | |
- | log.info("rule=" + rule); | + | rule = ciscoRule.getAddresses(); |
+ | |||
+ | //log.info("rule=" + rule); | ||
//типизированное правило | //типизированное правило | ||
Строка 181: | Строка 262: | ||
} | } | ||
- | log.info("rule=" + rule); | + | //log.info("rule=" + rule); |
Строка 234: | Строка 315: | ||
{ | { | ||
//эскейпируем точки в адресе | //эскейпируем точки в адресе | ||
- | String address = addr1.replace( ".", "\\." ); | + | String address1 = addr1.replace( ".", "\\." ); |
- | log.debug( "aaddr1=" + address ); | + | String address2 = addr2.replace( ".", "\\." ); |
+ | |||
+ | return isUserDeniedForAddress( address1, buffer ) && isUserDeniedForAddress( address2, buffer ); | ||
+ | } | ||
+ | |||
+ | private isUserDeniedForAddress ( address, buffer) | ||
+ | { | ||
+ | //эскейпируем точки в адресе | ||
+ | //String address = addr1.replace( ".", "\\." ); | ||
+ | //log.debug( "aaddr1=" + address ); | ||
String template = ".*deny ip host\\s+" + address + "\\s+any.*$"; | String template = ".*deny ip host\\s+" + address + "\\s+any.*$"; | ||
- | log.debug( "template=" + template ); | + | //log.debug( "template=" + template ); |
Pattern pattern = Pattern.compile( template, Pattern.DOTALL ); | Pattern pattern = Pattern.compile( template, Pattern.DOTALL ); | ||
Matcher m = pattern.matcher( buffer ); | Matcher m = pattern.matcher( buffer ); | ||
Строка 258: | Строка 348: | ||
} | } | ||
+ | |||
private vlanExists ( vlan, buffer) | private vlanExists ( vlan, buffer) | ||
Строка 279: | Строка 370: | ||
return session.doCommand( "show access-lists " + acl ); | return session.doCommand( "show access-lists " + acl ); | ||
} | } | ||
+ | |||
</source> | </source> |
Версия 06:24, 16 апреля 2010
Подключение абонентов по схеме "vlan-на-клиента", при этом используется оборудование D-Link - на уровне доступа свитчи DES-1228G, в ядре - DGS-3610-26G. Это шлюз ядра(DGS-3610-26G).
конфигурация шлюза
user_rule.editor.class=bitel.billing.module.services.ipn.editor.vlan.CiscoVlanContactRuleEditor gate_manager.class=bitel.billing.server.ipn.vlan.CiscoVlanGateWorker use.script=1
Команды шлюза
[DEFAULT] [REMOVE] no vlan {VID} [/REMOVE] [OPEN] vlan {VID} exit vlan 100 subvlan {VID} exit vlan {VID} subvlan-address-range {addr1} {addr2} exit ip access-list extended 101 <LOOP> no deny ip host {A} any no deny ip any host {A} </LOOP> exit [/OPEN] [CLOSE] interface gigabitethernet 0/22 no ip access-group 101 in exit ip access-list extended 101 no permit ip any any <LOOP> deny ip host {A} any deny ip any host {A} </LOOP> permit ip any any exit interface gigabitethernet 0/22 ip access-group 101 in exit [/CLOSE] [/DEFAULT]
скрпит шлюза
import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.StringTokenizer; import bitel.billing.common.module.ipn.IPNContractStatus; import bitel.billing.server.ipn.GateWorker; import bitel.billing.server.ipn.UserStatus; import bitel.billing.server.ipn.bean.*; import bitel.billing.server.util.DefaultServerSetup; import bitel.billing.server.util.Utils; import bitel.billing.server.util.telnet.OperationTimedoutException; import bitel.billing.server.util.telnet.TelnetSession; import ru.bitel.bgbilling.common.DefaultSetup; import bitel.billing.common.IPUtils; import bitel.billing.server.util.Utils; import bitel.billing.server.util.telnet.OperationTimedoutException; import bitel.billing.server.util.telnet.TelnetSession; import ru.bitel.bgbilling.modules.ipn.common.bean.*; import bitel.billing.server.util.telnet.ansi.TelnetAnsiSession; //includeBGBS( "bgbs://ru.bitel.bgbilling.kernel.script.common.bean.ScriptLibrary/manad" ); protected void doSync() { log.info( "start of cisco........................................................"); host = gate.getHost(); port = gate.getPort(); DefaultServerSetup gateSetup = new DefaultServerSetup( gate.getConfig(), "\r\n" ); pswd = gate.getKeyword(); login = gateSetup.getStringValue( "login"); timeout = gateSetup.getIntValue( "timeout", 0 ); result = new StringBuffer(); if( log.isDebugEnabled() ) { log.debug( gate.getId() + " gate: " + host + ":" + port + " login: " + login + " passwd: " + pswd ); } log.debug("before connect"); session = new TelnetAnsiSession( host, port); session.setTimeout( timeout ); session.setLoginPromptSequence( ":" ); result.append( session.connect() ); log.debug("after connect"); result.append( session.doCommand( login ) ); log.debug("after login"); session.setLoginPromptSequence( "#" ); result.append( session.doCommand( pswd ) ); log.debug("after pswd"); result.append( session.doCommand( "terminal length 0" ) ); result.append( session.doCommand( "terminal width 0" ) ); log.debug("after terminal"); result.append( session.doCommand( "configure terminal" ) ); log.debug( "execute commands" ); doCommands( session, result, gateSetup ); result.append( session.doCommand( "exit" ) ); result.append( session.doCommand( "write memory" ) ); session.doCommandAsync( "exit" ); log.info("!!!!!!!!!!!start of log!!!!!!!!!!!!!!!!!!!!!"); log.info( result ); log.info("!!!!!!!!!!!!!!! end of log !!!!!!!!!!!!!!!!!"); log.debug( "ok" ); log.info( "end of cisco........................................................"); } protected void add() { } private void doCommands( session, result, gateSetup) throws IOException, OperationTimedoutException { acl = gateSetup.getStringValue( "acl"); vlanResult = getVlanResult( session ); log.info( "!!!!!!!!!!!!!!!!!!!!!!!!!!vlanResult!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ); log.info( vlanResult ); log.info( "!!!!!!!!!!!!!!!!!!!!!!!!!!vlanResult!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ); aclResult = getAclResult( session, acl ); log.info( "!!!!!!!!!!!!!!!!!!!!!!!!!!aclResult!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ); log.info( aclResult ); log.info( "!!!!!!!!!!!!!!!!!!!!!!!!!! end aclResult!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" ); for( UserStatus status : statusList ) { VlanManager manager = new VlanManager(status.mid, con); gateId = gate.getId(); //log.info("gateId=" + gateId); vid = manager.getVlan( gateId, status.contractId ); //log.info("vid=" + vid); log.debug( "status=" + status.status); String addr1 = null; String addr2 = null; date = new GregorianCalendar(); AddressRangeManager man = new AddressRangeManager( con, mid ); addressList = man.getContractAddressRange( status.contractId , date, -1 ); if ( addressList.size() > 0 ) { AddressRange range = addressList.get(0); addr1 = IPUtils.convertIpToString( range.getAddr1() ); addr2 = IPUtils.convertIpToString( range.getAddr2() ); } else { log.info( "empty adress on cid = " + status.contractId ); continue; } rules = null; if (status.status == IPNContractStatus.STATUS_OPEN && (!vlanExists(vid, vlanResult) || isUserDenied( addr1, addr2, aclResult) ) ) { rules = getOpenRules( status, vid, gateSetup, addr1, addr2, acl ); } else if (status.status == IPNContractStatus.STATUS_REMOVED && ( vlanExists(vid, vlanResult) || isUserDenied( addr1, addr2,aclResult) ) ) { rules = getRemoveRules( status, vid, gateSetup, addr1, addr2, acl ); } //if closed and etc else if ( status.status != IPNContractStatus.STATUS_OPEN && status.status != IPNContractStatus.STATUS_REMOVED && !isUserDenied( addr1, addr2, aclResult) ) { rules = getCloseRules( status, vid, gateSetup, addr1, addr2, acl ); } if (vid > 0 && rules != null ) { for ( String rule : rules ) { //log.debug ("command=" + rule ); result.append( session.doCommand( rule ) ); } } } } getOpenRules( status, vid, gateSetup, addr1, addr2, acl ) { log.debug( "geting open rules..."); return getRules( status, "\\[OPEN\\](.*)\\[/OPEN\\]", vid, gateSetup, addr1, addr2, acl ); } getCloseRules( status, vid, gateSetup, addr1, addr2, acl ) { log.debug( "geting close rules..."); return getRules( status, "\\[CLOSE\\](.*)\\[/CLOSE\\]", vid, gateSetup, addr1, addr2, acl ); } getRemoveRules( UserStatus status, vid, gateSetup, addr1, addr2, acl ) { log.debug( "geting remove rules..."); return getRules( status, "\\[REMOVE\\](.*)\\[/REMOVE\\]", vid, gateSetup, addr1, addr2, acl ); } getRules( status, template, vid, gateSetup, addr1, addr2, acl ) { // пользовательское правило, без типа - то все оставляем как есть CiscoRule ciscoRule = new CiscoRule ( status.rule.getRuleText() ); rule = ciscoRule.getAddresses(); //log.info("rule=" + rule); //типизированное правило if( status.ruleType != null ) { rule = generateRule( rule, status.gateType, status.ruleType, vid, status.contractId, gateSetup, addr1, addr2, acl ); } //log.info("rule=" + rule); pattern = Pattern.compile( template, Pattern.DOTALL ); m = pattern.matcher( rule ); if (m.find()) { rule = m.group( 1 ); } rule.replaceAll( "\r", "" ); parts = rule.split( "\n" ); result = new ArrayList(); for ( String part : parts ) { if ( !Utils.isEmptyString( part )) { result.add( part ); } } return result; } generateRule( addresses, gateType, ruleType, int vid, int cid, gateSetup, addr1, addr2, acl ) { supervlan = gateSetup.getIntValue( "supervlan", 0 ); Map replacements = new HashMap(); if ( addr1 != null && addr2 != null ) { replacements.put( "\\{addr1\\}", addr1 ); replacements.put( "\\{addr2\\}", addr2 ); replacements.put( "\\{SUPERVLAN\\}", String.valueOf( supervlan) ); replacements.put( "\\{ACL\\}", acl ); } ruleText = ManadUtils.getRule( gateType, ruleType ); if ( vid > 0) { replacements.put( "\\{VID\\}", String.valueOf( vid ) ); } return ManadUtils.generateRule( ruleText, addresses, replacements, ruleType ); } private isUserDenied ( addr1, addr2, buffer) { //эскейпируем точки в адресе String address1 = addr1.replace( ".", "\\." ); String address2 = addr2.replace( ".", "\\." ); return isUserDeniedForAddress( address1, buffer ) && isUserDeniedForAddress( address2, buffer ); } private isUserDeniedForAddress ( address, buffer) { //эскейпируем точки в адресе //String address = addr1.replace( ".", "\\." ); //log.debug( "aaddr1=" + address ); String template = ".*deny ip host\\s+" + address + "\\s+any.*$"; //log.debug( "template=" + template ); Pattern pattern = Pattern.compile( template, Pattern.DOTALL ); Matcher m = pattern.matcher( buffer ); boolean found = m.find(); if ( found ) { log.debug( "user2 denied" ); return true; } pattern = Pattern.compile( ".*deny ip any host\\s" + address + "\\s.*$", Pattern.DOTALL ); m = pattern.matcher( buffer ); found = m.find(); log.debug( found ? "user denied" :"user not denied" ); return found; } private vlanExists ( vlan, buffer) { Pattern pattern = Pattern.compile( ".*" + vlan + "\\s+ON\\s+.*", Pattern.DOTALL ); Matcher m = pattern.matcher( buffer ); found = m.find(); log.debug( found ? "vlan found" : "vlan not found" ); return found; } private getVlanResult( session ) { return session.doCommand( "show supervlan"); } private getAclResult( session, acl ) { return session.doCommand( "show access-lists " + acl ); }