Jump to content

Задача о UTM правилах, VPN, отрицательном балансе и ограничении скорости.


Recommended Posts

Posted

Задача о 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";
}

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.