lostin Posted August 11, 2006 Posted August 11, 2006 Задача о UTM правилах, VPN, отрицательном балансе и ограничении скорости. Задача №1 Условия: IP пользователям раздается по DHCP связанному через LAPD с UTM, поднимаются правила о наличии или отсутствии у него локальных ресурсов через iptables на роутере, далее выход пользователя в интернет происходит через впн (poptop+radius). Примечание: DHCPD последней версии не работает с форматом данных UTM->SLAPD из за размещения host не в контейнере SUBNET. Проблема: Правила iptables сразу поднимаются на vpn ip и local ip клиента, что не есть имхо гуд. некрасиво и не безопасно. Решение: Снимается разрешение применять правила на VPN IP, а сами правила прописываются через ip-up скрипт ppp, причем для доступа к локальным ресурсам роуты прописываются через DHCP дабы не загружать сервер доступа шифрованием локального траффика :)) Задача №2. В связи с вышеизложенным, PPP соединение клиента не опускается автоматически при блокировании, приходится прописать в UTM firewall к данному тарифу путь к скрипту, который выясняет id процесса по локальному IP и кладет его, а затем последующий коннект заблокированного пользователя не возможен, так как в radius5.cfg прописанно radius_auth_vap=1, таким образом отричательный баланс становится невозможен :)) Пример ppp-kill ps ax | grep $1 -F | grep "pppd" | awk '{system("kill " $1) }' Правило прописанно как /etc/ppp/ppp-kill UIP в секции выключения. Работает стабильно - отрубаешь пользователя - рвется туннель. Задача №3, скорость. Ну тут просто, в ip-up передается в том числе VPN IP клиента, далее выдираем из базы фиктивное правило FW(например правило с 1024 группой и совпадением всех параметров) привязанное к тарифу пользователя с этим IP и вуаля! Пример: в ip-up /usr/bin/echo "connect" "$1" "$2" "$3" "$4" "$5" "$6" >> /etc/ppp/logs-ppp/ip-up.log /usr/local/sbin/iptables -A FORWARD -s $5 -d 192.168.0.0/16 -j DROP /usr/local/sbin/iptables -A FORWARD -d $5 -s 192.168.0.0/16 -j DROP /usr/local/sbin/iptables -A FORWARD -s $5 -d 10.0.0.0/8 -j DROP /usr/local/sbin/iptables -A FORWARD -d $5 -s 10.0.0.0/8 -j DROP /usr/local/sbin/iptables -A FORWARD -s $5 -j ACCEPT /usr/local/sbin/iptables -A FORWARD -d $5 -j ACCEPT [b]/etc/ppp/speed-ppp $1 $5[/b] В /etc/ppp/speed-ppp #!/usr/bin/perl # use DBD::mysql; use DBI(); my $interface=shift; my $ip=shift; my $hashref=\my %rrr; #print $interface." ".$ip."\n"; ################################################################################ ##################### my $query="SELECT inet_ntoa(ip & 0xFFFFFFFF),firewall_rules.rule_on FROM ip_groups JOIN iptraffic_service_links ON iptraffic_service_links.ip_group_id=ip_groups.ip_group_id JOIN service_links ON service_links.id=iptraffic_service_links.id JOIN tariffs_services_link ON tariffs_services_link.service_id = service_links.service_id JOIN firewall_rules ON firewall_rules.tariff_id = tariffs_services_link.tariff_id WHERE inet_ntoa(ip & 0xFFFFFFFF) LIKE \"".$ip."\" AND ip_groups.is_deleted=0 AND ip_type=2 AND firewall_rules.is_deleted=0 AND firewall_rules.group_id=1024;"; ################################################################################ ##################### $arp_command = "arp -a"; #Load settings from config open (CONFIG, "/netup/utm5/utm5.cfg"); @config = <CONFIG>; close (CONFIG); foreach $line (@config) { if ($line =~ m/^([^#].+?)=(.*)$/) { $$1 = $2; }; }; # Connect to the database if ($database_type eq "mysql") { $DBI_data="DBI:$database_type:database=$database;host=$database_host;mysql_socket=$database_sock_path;"; } elsif ($database_type eq "postgres") { $DBI_data="DBI:$database_type:dbname=$database"; } else { print "Unknown database $database_type! Stopped. \n"; exit (1); }; $dbh = DBI->connect("$DBI_data","$database_login","$database_password",{'RaiseError' => 1}); $sth = $dbh->prepare( $query ); $sth->execute(); my $ary_ref = $sth->fetchall_arrayref($hashref); #print ${${$ary_ref}[0]}{"rule_on"}."\n"; my $speed=${${$ary_ref}[0]}{"rule_on"}."\n"; chomp $speed; if($speed > 0){ my $command="/sbin/tc qdisc add dev ".$interface." root tbf rate ".$speed."Kbit latency 50ms burst ".($speed*1024); #printf $command; exec "$command" or die "ERROR\n"; } Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.