Динамическое разделение канала на n vpn-пользователей

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
CrazyAdmin
рядовой
Сообщения: 15
Зарегистрирован: 2008-02-26 12:25:45

Динамическое разделение канала на n vpn-пользователей

Непрочитанное сообщение CrazyAdmin » 2008-09-04 16:00:23

Есть сеть, в ней рутер с 3 интерфейсами: vr0,vr1,rl0
vr1 - интерфейс к адсл модему
vr0 - интерфейс к LAN 1
rl0 - интерфейс к LAN 2

Рутер под управлением FreeBSD 7.0
На интерфейсах vr0,rl0 слушает VPN сервер Mpd5 без радиуса.

Надо общий канал интернета с vr1 раздать юзерам по vpn, с определенной минимальной гарантированной полосой.
Допустим user1 - 64Kb, user2 - 128Kb и т.д.
И еще нужно сделать если например user1 не подключен или использует свой канал не полностью, надо эту
неиспользованную скорость отдать user2.
Ткните куда хоть копать.Весь моск сломал уже
Вложения
pic.jpg
схемка
Последний раз редактировалось CrazyAdmin 2008-09-04 18:44:56, всего редактировалось 1 раз.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Динамическое разделение канала на n vpn-пользователей

Непрочитанное сообщение hizel » 2008-09-04 17:39:30

вы рулите mpd radius-ом?
дело в том что есть ng_car который хорошо интегрируется с mpd
только вот как задать каналы не через RADIUS я например не знаю :(

иначе проце связкой pipe\queue dummynet
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

CrazyAdmin
рядовой
Сообщения: 15
Зарегистрирован: 2008-02-26 12:25:45

Re: Динамическое разделение канала на n vpn-пользователей

Непрочитанное сообщение CrazyAdmin » 2008-09-04 18:44:28

есть у меня рабочий конфиг на ipfw, с разделениями с фиксированными лимитами. Но если кто то не в сети, то его канал простаивает

Код: Выделить всё

[root@ ~]# ipfw sh
ipfw: DEPRECATED: 'sh' matched 'show' as a sub-string
00100   222592    24135036 allow ip from any to any via lo0
00120        0           0 fwd 192.168.0.254,31020 ip from any to 192.168.1.254 dst-port 30020
00130        0           0 fwd 192.168.0.254,31080 ip from any to me dst-port 80
00200 28629655 21782153795 divert 8668 ip from any to any via vr0
03000  3862324  4784696105 pipe 321 ip from any to 172.16.0.32 via vr0
04000  2705748   149219547 pipe 320 ip from 172.16.0.32 to any
05000  6262322  8253540125 pipe 341 ip from any to 192.168.0.34 via vr0
06000  4343121   275400250 pipe 340 ip from 192.168.0.34 to any
07000  4221661  1708971152 pipe 201 ip from any to 192.168.0.20 via vr0
65535 45142346 34851572141 allow ip from any to any

Код: Выделить всё

[root@ ~]# ipfw pipe list
00340: 136.000 Kbit/s    0 ms   50 sl. 1 queues (1 buckets) droptail
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
00341: 280.000 Kbit/s    0 ms   50 sl. 1 queues (1 buckets) droptail
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
08100: 100.000 Mbit/s    0 ms   50 sl. 0 queues (1 buckets) droptail
01770:  72.000 Kbit/s    0 ms   50 sl. 0 queues (1 buckets) droptail
01771: 152.000 Kbit/s    0 ms   50 sl. 0 queues (1 buckets) droptail
00321: 424.000 Kbit/s    0 ms   50 sl. 1 queues (1 buckets) droptail
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
00201: 168.000 Kbit/s    0 ms   50 sl. 1 queues (1 buckets) droptail
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
00320: 200.000 Kbit/s    0 ms   50 sl. 1 queues (1 buckets) droptail
BKT Prot ___Source IP/port____ ____Dest. IP/port____ Tot_pkt/bytes Pkt/Byte Drp
вот как бы сделать один общий пайп размером с канал инета, и потом дочерние пайпы сделать с минимальной(гарантированной) скоростью, но возможностью увеличения за счет неиспользованной скорости канала.

Аватара пользователя
hizel
дядя поня
Сообщения: 9031
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: Динамическое разделение канала на n vpn-пользователей

Непрочитанное сообщение hizel » 2008-09-04 18:48:19

рядом подобную тему обкашливали
http://forum.lissyara.su/viewtopic.php?f=4&t=10817
читали? :)
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

CrazyAdmin
рядовой
Сообщения: 15
Зарегистрирован: 2008-02-26 12:25:45

Re: Динамическое разделение канала на n vpn-пользователей

Непрочитанное сообщение CrazyAdmin » 2008-09-10 0:58:46

сделал вот такое разделение канала: есть канал 1024 кбит. он полностью выделяется на один комп, если подключаются vpn пользователи, загружаются из базы их скоростные настройки, и от моего компа они отнимаются и отдаются пользователю. как только пользователь от vpn Отключается, его скорость снова возвращается ко мне. скрипты написал не универсальные, на Php. если кому интересно могу выложить.

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: Динамическое разделение канала на n vpn-пользователей

Непрочитанное сообщение zingel » 2008-09-10 5:17:21

выкладывайте, естественно, это - не помешает
Z301171463546 - можно пожертвовать мне денег

CrazyAdmin
рядовой
Сообщения: 15
Зарегистрирован: 2008-02-26 12:25:45

Re: Динамическое разделение канала на n vpn-пользователей

Непрочитанное сообщение CrazyAdmin » 2008-09-11 18:23:59

так, в общем это решение временное, потом все равно надо доработать с учетом загруженности канала пользователя.
у меня adsl канал:
днем: 1024/1024 входящий/исходящий
ночью: 2048/1024 входящий исходящий

сделал таким образом: по умолчанию весь канал прописывается к одному pipe. при подключении пользователей к vpn им выделяется их скорость из pipe по умолчанию, при отключении скорость снова добавляется к pipe по умолчанию.

ниже скрипты:

#mpd.conf:

Код: Выделить всё

set iface up-script "/etc/ipfw/ipfw_limits_add.php"
set iface down-script "/etc/ipfw/ipfw_limits_del.php"
#day_night_changer.php скрипт для удвоения ночной скорости в 2 раза, и для уменьшения скорости утром. увеличение скорости с 12 ночи до 8 утра. вызывается через cron

Код: Выделить всё

#!/usr/local/bin/php
<?
	$users=file('/etc/ipfw/ipfw_user_pipes');
	
	$ifc=shell_exec('ifconfig');

	$pattern="/inet[\s]+.*->[\s]+(.*)[\s]+netmask/iUs";

	preg_match_all($pattern,$ifc,$ma);

	$ips=$ma[1];

	$now_hour=date('H');
	
	if($now_hour>=0 and $now_hour<8)
		$max=2048;
	else
		$max=1024;

	$all_in=0;
	$all_out=0;

	foreach($users as $str)
	{
		list($id,$user,$in,$out)=explode('|',$str);
		
		
		if($now_hour>=0 and $now_hour<8)
			$in=$in*2;		
	
		if(in_array("172.16.0.{$id}",$ips))
		{
			shell_exec("/sbin/ipfw pipe {$id}1 config bw {$in}Kbit");
			$all_in+=$in;	
		}	
	}

	$to_me=$max-$all_in;
	shell_exec("/sbin/ipfw pipe 361 config bw {$to_me}Kbit");

?>
#ipfw_limits_add.php - выделение канала пользователю.

Код: Выделить всё

#!/usr/local/bin/php
<?
	$user_arg=$argv[5];		
	$action='add';

	$users=file('/etc/ipfw/ipfw_user_pipes');
	
	foreach($users as $str)
	{
		list($id,$user,$in,$out)=explode('|',$str);

		$now_hour=date('H');
	
		if($now_hour>=0 and $now_hour<8)
			$in=$in*2;		
		
		if($user===$user_arg)
		{
			
			$str=shell_exec("/sbin/ipfw pipe 361 list");
			
			$pattern="/00361:(.*)[\d]+.*ms/";
			preg_match($pattern,$str,$ma);
			
			$now_bw=trim($ma[1]);
			
			if(stripos($now_bw,'Mbit/s'))
			{
				$now_bw=str_replace('Mbit/s','',$now_bw);
				$now_bw=$now_bw*1000;
			}

			if(stripos($now_bw,'Kbit/s'))
			{
				$now_bw=str_replace('Kbit/s','',$now_bw);
				$now_bw=intval($now_bw);
			}

				$out=$in/2;
				shell_exec("/sbin/ipfw pipe {$id}0 config bw ".$out."Kbit");
				shell_exec("/sbin/ipfw pipe {$id}1 config bw ".$in."Kbit");

				shell_exec("/sbin/ipfw add ${id}0 pipe {$id}0 all from 172.16.0.{$id} to any in via {$argv[1]}");
				shell_exec("/sbin/ipfw add ${id}1 pipe {$id}1 all from any to 172.16.0.{$id} out via {$argv[1]}");

				$new_bw=$now_bw-$in;
				shell_exec("/sbin/ipfw pipe 361 config bw {$new_bw}Kbit");
			
		}
	}

?>
#ipfw_limits_del.php - при отключении пользователя, часть его канала возвращается к pipe-по умолчанию

Код: Выделить всё

#!/usr/local/bin/php
<?
	$user_arg=$argv[5];		
	$action='del';

	$users=file('/etc/ipfw/ipfw_user_pipes');
	
	foreach($users as $str)
	{
		list($id,$user,$in,$out)=explode('|',$str);

		$now_hour=date('H');
	
		if($now_hour>=0 and $now_hour<8)
			$in=$in*2;		
		
		if($user===$user_arg)
		{
			
			$str=shell_exec("/sbin/ipfw pipe 361 list");
			
			$pattern="/00361:(.*)[\d]+.*ms/";
			preg_match($pattern,$str,$ma);
			
			$now_bw=trim($ma[1]);
			
			if(stripos($now_bw,'Mbit/s'))
			{
				$now_bw=str_replace('Mbit/s','',$now_bw);
				$now_bw=$now_bw*1000;
			}

			if(stripos($now_bw,'Kbit/s'))
			{
				$now_bw=str_replace('Kbit/s','',$now_bw);
				$now_bw=intval($now_bw);
			}

			
				shell_exec("/sbin/ipfw pipe {$id}1 delete");
				shell_exec("/sbin/ipfw pipe {$id}0 delete");

				shell_exec("/sbin/ipfw del ${id}0");
				shell_exec("/sbin/ipfw del ${id}1");

				$new_bw=$now_bw+$in;
				shell_exec("/sbin/ipfw pipe 361 config bw {$new_bw}Kbit");
			
		}
	}
?>
#ipfw_users_pipes -собственно база пользователей с их ограничениями. первое число есть последнее число в выдаваемом ip адресе через vpn - 172.16.0.XX, где XX - число из первого столбика. Имя пользователя должно быть введено точно также как и в mpd.secret, скорость задается в Kbit

Код: Выделить всё

34|user1|280|140
32|user2|424|212
177|user3|152|76