ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Метки статьи: ‘Networks’

Добро пожаловать в блог! Надеемся, что Вы еще вернетесь.

Начинающие часто спрашивают:

Как поднять vlan на FreeBSD ?

Как сделать trunk на FreeBSD ?

Отвечаем:

Это не просто, а очень просто.

Теория:

Что такое vlan ?
Что такое trunk ?

VLAN (от англ. Virtual Local Area Network), VLAN могут являться частью большего LAN, имея определенные правила взаимодействия с другими VLAN, либо быть полностью изолированными от них. Простейший механизм изоляции различных подсетей, работающих через общие свичи и роутеры, известен как 802.1Q.

Преимущества VLAN

  • увеличивает число широковещательных доменов, но уменьшает размер каждого широковещательного домена, которые в свою очередь уменьшают сетевой трафик и увеличивают безопасность сети (оба следствия связаны вместе из-за единого большого широковещательного домена);
  • уменьшает усилия администраторов на создание подсетей;
  • уменьшает количество оборудования, так как сети могут быть разделены логически, а не физически;
  • улучшает управление различными типами трафика.

Транк VLAN — это физический канал, по которому передается несколько VLAN каналов, которые различаются тегами (метками, добавляемыми в пакеты). Транки обычно создаются между «тегированными портами» VLAN-устройств: свитч-свитч или свитч-маршрутизатор. (В документах Cisco термином «транк» также называют объединение нескольких физических каналов в один логический: Link Aggregation, Port Trunking). Маршрутизатор (свитч третьего уровня) выступает в роли магистрального ядра сети (backbone) для сетевого трафика разных VLAN.

На устройствах Cisco, протокол VTP (VLAN Trunking Protocol) предусматривает VLAN-домены для упрощения администрирования. VTP также выполняет «чистку» трафика, направляя VLAN трафик только на те коммутаторы, которые имеют целевые VLAN-порты.
Native VLAN — каждый порт имеет параметр, названный постоянный виртуальный идентификацией (Native VLAN), который определяет VLAN, назначенный получить нетеговые кадры.

Сказав проще, vlan — это логический канал внутри физического канала (кабеля), а trunk это множество логических каналов (vlan`ов) внутри одного физического канала (кабеля).

Итак более-менее с теорией разобрались, теперь подумаем зачем нам это может понадобиться.

Данная технология может пригодиться например если на сервер нужно «подать» несколько физических линков, а сетевая карта всего одна и вставить ещё одну нет возможности.

Возьмем подобную ситуацию как пример и попробуем настроить следущее:

  • У нас сервер только с одной сетевой картой, а
  • необходимо подключить два канала от двух провайдеров
  • Провайдер А выдал IP-адрес 192.168.1.15 маска 255.255.255.0
  • Провайдер Б выдал IP-адрес 172.16.10.48 маска 255.255.255.192

Для того чтобы разрулить данную ситуацию нам понадобится switch который понимает Vlan (802.1Q), уже почти все управляемые свичи идут с этой функцией. В нашем примере рассмотрим два типа свичей:

  1. cisco catalyst (например 2950 или 3560)
  2. dlink DES-3526
Два провайдера и сервер FreeBSD с одной сет.картой

Два провайдера и сервер FreeBSD с одной сет.картой

Начинаем

Воткнем физические связи в наш свич, получим три кабеля и три занятых порта

  1. порт 1 — Провайдер А
  2. порт 2 — Провайдер Б
  3. порт 3 — наш сервер

Настроим cisco catalyst:

configure terminal
vlan 100
name provider_a
vlan 101
name provider_b
int gi0/1
switchport access vlan 100
int gi0/2
switchport access vlan 101
exit
exit

Этими командами мы создали два vlan с номерами 100 и 101 для линков от двух провайдеров и назначили два порта каталиста в эти vlan.

по команде show vlan вы должны видеть созданные vlan

Теперь перейдем к конфигурированию 3-го порта каталиста куда воткнут наш сервер. Т.к. нам придется в этот порт посылать оба vlan (100,101) нам необходимо сделать trunk на этом порту:

configure terminal
int gi 0/3
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk allowed vlan 100,101
exit
exit

Этими командами мы на третьем порту каталиста подняли trunk и разрешили в этом trunk`е два vlan 100,101

В терминах Cisco:

  • порт в аксес/аксес порт (access port) — порт принимающий не тегированные пакеты (пакеты в которых нет тега (номера) vlan которому они принадлежат)
  • порт в транке/транк порт (trunk port) — порт принимающий тегированные пакеты в которых указан тег (номер) vlan

Сделаем тоже самое, но для Dlink:

create vlan provider_a tag 100
create vlan provider_b tag 101
config vlan provider_a add untagged 1
config vlan provider_b add untagged 2
config vlan provider_a add tagged 3
config vlan provider_b add tagged 3

Так же по команде show vlan убеждаемся что все на месте.

В терминах Dlink:

  • антагет порт (untagged port) — порт в аксес режиме принимающий не тегированные пакеты
  • тагет порт (tagged port) — порт в транке принимающий тегерованные пакеты

Переходим к FreeBSD. В качестве примера используется сет. карта 82545EM Gigabit Ethernet Controller интерфейс em0

Для начала удалим все IP-адреса с интерфейса em0 (если они есть):

/sbin/ifconfig em0 delete

Создадим vlan для провайдера А:

/sbin/ifconfig vlan100 create
/sbin/ifconfig vlan100 vlan 100 vlandev em0

Вот и все, vlan создан, проверяем есть ли он в списке интерфейсов:

запускаем команду /sbin/ifconfig vlan100

vlan100: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=3<RXCSUM,TXCSUM>
ether 00:02:a5:4e:92:48
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vlan: 100 parent interface: em0

Итерфейс на месте.

Создадим vlan для провайдера Б:

/sbin/ifconfig vlan101 create
/sbin/ifconfig vlan101 vlan 101 vlandev em0

Проверяем есть ли он в списке интерфейсов:

запускаем команду /sbin/ifconfig vlan101

vlan101: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=3<RXCSUM,TXCSUM>
ether 00:02:a5:4e:92:48
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vlan: 101 parent interface: em0

Итерфейс на месте.

После того как интерфейсы vlan`ов созданы мы обращаемся с ними как с обычными интерфейсами обычных сетевых карт.

Добавим IP-адреса на созданные vlan`ы:

/sbin/ifconfig vlan100 add 192.168.1.15/24
/sbin/ifconfig vlan101 add 172.16.10.48/26

Вот и все, если вы все сделали правильно, то при выводе команды ifconfig получите:

vlan100: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=3<RXCSUM,TXCSUM>
ether 00:02:a5:4e:92:48
inet 192.168.1.15 netmask 0xffffff00 broadcast 192.168.1.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vlan: 100 parent interface: em0

vlan101: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=3<RXCSUM,TXCSUM>
ether 00:02:a5:4e:92:48
inet 172.16.10.48 netmask 0xffffffc0 broadcast 172.16.10.63
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vlan: 101 parent interface: em0

Можете проверять наличие связи с двумя провайдерами 🙂

Уничтожить/удалить vlan можно командой (например удалим vlan100):

/sbin/ifconfig vlan100 destroy

Осталось последнее дело, чтобы после reboot конфигурация vlan`ов сохранялась.

Для этого добавим в файл /etc/rc.conf следующие строчки:

ifconfig_vlan100=»inet 192.168.1.15 netmask 255.255.255.0 vlan 100 vlandev em0″
ifconfig_vlan101=»inet 172.16.10.48 netmask 255.255.255.192 vlan 101 vlandev em0″

cloned_interfaces=»vlan100 vlan101″

Есть и второй способ сделать тоже самое. Создайте файл /etc/rc.local и в него вставте все команды которые вы вводили для создания vlan`ов и присваевание им IP-адресов. Файл /etc/rc.local так же отрабатывается при загрузке сервера и будут исполнены все команды в нем перечисленные.

Ссылки:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Николаев Дмитрий (virus (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 7, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Trafd — демон учета трафика в FreeBSD.

Вопрос:

Я обнаружил, что у меня trafd сбрасывает инфу в /usr/local/var/trafd.
При попытке посмотреть traflog -i xl0 пишется :

traflog: WARNING: table too big to fit into memory

Подскажите как довести до ума работу trafd ?

Ответ:

По умолчанию сохраняется в /usr/local/var/trafd.

Для traflog нужны файлы которые получаются после того как отрабатывает:

trafdump IFACE_NAME
trafsave IFACE_NAME

После выполнения этих команд файлы и сохраняются в /usr/local/var/trafd

Например:

bge1 — название интерфейса на котором trafd собирает трафик (IFACE_NAME)
/usr/local/var/trafd/trafd.bge1 — полученный бинарный файл с трафиком
extnew — секция конфига /usr/local/etc/traflog.format в которой описан шаблон вывода бинарных данных в текстовый вид, например:

extnew {
    from:"%-18.18s " sport:"%-6.6s "        to:"%-18.18s " dport:"%-6.6s "
    proto:"%-4.4s " bytes:"%9ld " psize:"%10ld" ftime:" %Y-%m-%d %T" ltime:" %Y-%m-%d %T\n"
};

/usr/local/bin/traflog -o extnew -i /usr/local/var/trafd/trafd.bge1 -a -n > /usr/local/var/trafd/trafd.bge1.log

Таким образом разобранный трафик окажется в файле /usr/local/var/trafd/trafd.bge1.log

Команды trafdump и trafsave необходимо выполнять довольно часто, особенно при большом кол-ве трафика проходящего через этот интерфейс, чтобы избежать потом ошибки traflog: WARNING: table too big to fit into memory при обработке трафика.

Выход:

В файл /etc/crontab дописать:

*/5 * * * * * * root /usr/local/bin/trafdump IFACE_NAME; sleep 2; /usr/local/bin/trafsave IFACE_NAME

заменив IFACE_NAME на имя интерфейса на котором слушает trafd

Потом использовать небольшой скриптик на PERL:

/usr/local/sbin/scripts/trafd_move.pl

#!/usr/bin/perl

$srclogdir="/usr/local/var/trafd";
$dstdir="/usr/local/var/trafd/log";
$passeddir="/usr/local/var/trafd/passed";
$filemask=".IFACE_NAME";
($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst)=localtime(time());

opendir DIR,$srclogdir or die "Can't open logdir\n";
my @sorted=grep /$filemask/, readdir DIR;# or print "Trafd's logdir is empty\n";
closedir DIR or print "Can't close logdir\n";
@sorted=sort @sorted;
if ($#sorted >= 0){
   for($loop=0;$loop<=$#sorted;$loop++){
     #В этом месте мы можем делать с бинарным файлом все что угодно,
     #например натравить на него traflog, а затем переместить его в другую директорию
     $newname=sprintf("trafd_%02d%02d%02d_%02d%02d%02d_%02d.log",$year+1900,$mon+1,$day,$hour,$min,$sec,$loop);
     $cmd=sprintf("/usr/local/bin/traflog -o extnew -i %s/%s -a -n > %s/%s.passed",$srclogdir,$sorted[$loop],$passeddir,$newname);
     print "$cmd\n";
     system($cmd);
     $cmd=sprintf("/bin/mv %s/%s %s/%s",$srclogdir,$sorted[$loop],$dstdir,$newname);
     print "$cmd\n";
     system($cmd);
  }
}

Не забываем делать perl скрипт исполняемым:

chmod a+x perl_script_name.pl

Данный скрипт считает все файлы с маской $filemask в директории $srclogdir, затем он выполнит traflog и результат положит в $passeddir, а затем переместит бинарный файл с логами в $dstdir

Имена итоговых файлов будут такими:

  1. trafd_годмесяцдень_часыминутысукунды_номерфайла.log
  2. trafd_годмесяцдень_часыминутысукунды_номерфайла.log.passed

Пример: trafd_20080530_100830_02.log

Теперь можно поправить /ect/crontab:

*/5 * * * * * * root /usr/local/bin/trafdump IFACE_NAME; sleep 2; /usr/local/bin/trafsave IFACE_NAME sleep 2; /usr/local/sbin/scripts/trafd_move.pl

Не забыв поменять IFACE_NAME на имя своего интерфейса, а так же это должно быть написано одной строкой, без переносов на новую строчку конфига /ect/crontab.

З.Ы. Если кому-нить интересно, то можем привести пример с сохранением трафика в БД Mysql и код на PHP для просмотра статистики.

Вопрос:

trafd выдает bytes и psize. psize всегда больше. Что такое bytes в trafd ? Как считает провайдер ?

Ответ:

Смотрим в /usr/local/etc/traflog.format

# bytes number of data bytes
# psize number of all bytes

Итак bytes — это счетчик только данных, а psize это все переданные данные, включая технические (установка сессии и т.п.).

Провайдеры всегда берут psize, т.к. это включает в себя весь трафик переданный от или к пользователю.

Авторы:
Николаев Дмитрий (virus (at) subnets.ru)
Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 2, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Многие ищут/спрашивают функции для проверок IP-адресов на вхождение в подсеть, итак:

Perl

#!/usr/bin/perl
# Пример вызова и проверки IP-адреса 192.168.0.4
# на принадлежность к сети 192.168.0.0 с маской 255.255.255.248
#
if (ip_vs_net("192.168.0.4","192.168.0.0","255.255.255.248")){
    print "Адрес принадлежит сети\n";
}else{
    print "Адрес не входит в подсеть\n";
}
#Подпрограмма перевода IP в число
sub aton{
    my $addr=shift;
    (my $a0, my $a1, my $a2, my $a3)=split('\.',$addr);
    return $a3+($a2<<8)+($a1<<16)+($a0<<24);
}
#Подпрограмма перевода числа в IP
sub ntoa{
    my $ip=shift;
    return sprintf("%d.%d.%d.%d",
    (($ip&0xFF000000)>>24),(($ip&0xFF0000)>>16),(($ip&0xFF00)>>8),($ip&0xFF));
}
#Подпрограмма проверки вхождения IP в подсеть
sub ip_vs_net{
    my $ip=shift;
    my $network=shift;
    my $mask=shift;
    if((aton($ip)&aton($mask))==aton($network)){
        return 1;
    }else{
        return 0;
    }
}

PHP

<?
// Пример вызова и проверки IP-адреса 192.168.0.4
// на принадлежность к сети 192.168.0.0 с маской 255.255.255.248
if (ip_vs_net("192.168.0.4","192.168.0.0","255.255.255.248")){
    print "Адрес принадлежит сети<BR>";
}else{
    print "Адрес не входит в подсеть<BR>";
}
function ip_vs_net($ip,$network,$mask){
   if (((ip2long($ip))&(ip2long($mask)))==ip2long($network)){
       return 1;
   }else{
       return 0;
   }
}
?>

Функции которые переводят из CIDR в обычную маску и наоборот
<?
function cidr_2_mask($mask){
    return long2ip(pow(2,32) - pow(2, (32-$mask)));
}

function mask_2_cidr($mask){
    $a=strpos(decbin(ip2long($mask)),"0");
    if (!$a){$a=32;}
    return $a;
}
?>
Пример:
<?
     printf("%s",cidr_2_mask("24"));
     //Напечает 255.255.255.0

      printf("%s",mask_2_cidr("255.255.255.0"));
     //Напечает 24
?>

Ссылки:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 5, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

CIDR — Classless InterDomain Routing — Бесклассовая адресация

Как выяснить маску подсети исходя из CIDR ?

В кач-ве примера будем использовать
IP-адрес 213.45.64.123 с CIDR /27:

Необходимо взять кол-во бит из CIDR (в бинарном виде), разбить на 4-ре октета и перевести в десятичные.

1. запишем первые 27 бит как 1-цу, а остальные 5-ть (т.к. их всего 32 бита) как 0-ль

11111111111111111111111111100000

2. Разделим на 4-ре октета

11111111.11111111.11111111.11100000

3. Переведем в десятичную систему

255.255.255.224

Вот и все. Получили что /27 равен маске 255.255.255.224

Так же полезно просто помнить что:
сети класса A — это CIDR /8
сети класса B — это CIDR /16
сети класса С — это CIDR /24

————————————————————

Как по CIDR определить адрес сети, широковещательный адрес (broadcast), число хостов в сети ?

В кач-ве примера будем использовать тот же IP-адрес 213.45.64.123 с CIDR /27:

1. 32-27=5 бит

2. 2-йка в пятой степени = 32, а значит получается что рабочих IP-адресов в этой сети 30-ть (т.к. 1-ый адрес это адрес сети, а последний это broadcast)

3. Смотрим последний октет IP-адреса (213.45.64.123), в 123-х целых 32-ек укладывается 3 раза, а значит адрес сети 213.45.64.96 — это 32 умножить на 3 (32х3=96)

4. Широковещательным адресом (broadcast) будет 213.45.64.127 — это 32 умножить на 4 и отнять 1 (32х4-1=127)

————————————————————

Как по хосту и маске подсети определить адрес сети, широковещательный адрес (broadcast), число хостов в сети ?

В кач-ве примера будем использовать IP-адрес 192.168.32.48 с маской подсети 255.255.255.192:

1. 256-192=64, где 192 это последний октет из маски (255.255.255.192), а 64 это общее кол-во хостов в сети,
т.к. 1-ый адрес это адрес сети, а последний это broadcast получаем 62 рабочих хоста в сети.

2. Смотрим последний октет IP-адреса (192.168.32.48), в 48 целых 64-рок укладывается ноль получаем адрес сети 192.168.32.0 (0x64=0)

3. Широковещательным адресом (broadcast) будет 192.168.32.63 (64×1-1=63)

————————————————————

Или воспользуйтесь нашим IP Subnet Calculator 🙂

Ссылки:

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 1, среднее: 4,00 из 5)
Загрузка...
Отправить на почту Отправить на почту