понедельник, 21 октября 2013 г.

Определяем оптимальный MTU в Mac OS X и FreeBSD

Бывает так, что необходимо определить оптимальное значение MTU в сети, но вот сидеть и перебирать подходящие значения ручками как-то совсем уж неприлично. На помощь нам придёт всем известная утилитка ping !

Для определения оптимального значения вводим следующее "заклинание" в консоли:
ping -D -g 1500 -G 9000 -h 100 192.168.100.25
Разберём что есть что:
ping - ну это понятно, программка посылающая ICMP ECHO_REQUEST пакеты
-D     - запрещаем фрагментировать пакет, если он не "пролазит"
-g     - указываем минимальное значение сканируемого диапазона (с какого размера пакета начать перебор)
-G     - здесь указываем максимальное значение диапазона (до какого значения перебирать)
-h     - шаг перебора, по умолчанию значение 1 байт.

Запускаем это дело на выполнение и наслаждаемся выводом команды, должно быть что то вроде этого:
PING 192.168.100.25 (192.168.100.25): (1500 ... 9000) data bytes
1508 bytes from 192.168.100.25: icmp_seq=0 ttl=64 time=0.909 ms

1608 bytes from 192.168.100.25: icmp_seq=1 ttl=64 time=0.619 ms
1708 bytes from 192.168.100.25: icmp_seq=2 ttl=64 time=0.588 ms
1808 bytes from 192.168.100.25: icmp_seq=3 ttl=64 time=0.595 ms
1908 bytes from 192.168.100.25: icmp_seq=4 ttl=64 time=0.688 ms
2008 bytes from 192.168.100.25: icmp_seq=5 ttl=64 time=0.720 ms
2108 bytes from 192.168.100.25: icmp_seq=6 ttl=64 time=0.663 ms
-------------------------------------------------------
5808 bytes from 192.168.100.25: icmp_seq=43 ttl=64 time=0.979 ms
5908 bytes from 192.168.100.25: icmp_seq=44 ttl=64 time=0.966 ms
ping: sendto: Message too long
ping: sendto: Message too long

 Как только пошли сообщения ping: sendto: Message too long, можно останавливать выполнение программы и уменьшив шаг и соответственно минимальное и максимальное значения диапазона сузить область поиска.
Например у меня перестали проходить пакеты после значения 5908 байт, модифицирую команду до такого вида:
ping -D -g 5900 -G 6000 -h 10 192.168.100.25
и получаю такой вывод в консоли
PING 192.168.100.25 (192.168.100.25): (5900 ... 6000) data bytes
5908 bytes from 192.168.100.25: icmp_seq=0 ttl=64 time=1.218 ms

5918 bytes from 192.168.100.25: icmp_seq=1 ttl=64 time=0.860 ms
5928 bytes from 192.168.100.25: icmp_seq=2 ttl=64 time=0.950 ms
5938 bytes from 192.168.100.25: icmp_seq=3 ttl=64 time=0.991 ms
5948 bytes from 192.168.100.25: icmp_seq=4 ttl=64 time=0.805 ms
5958 bytes from 192.168.100.25: icmp_seq=5 ttl=64 time=1.005 ms
5968 bytes from 192.168.100.25: icmp_seq=6 ttl=64 time=0.864 ms
5978 bytes from 192.168.100.25: icmp_seq=7 ttl=64 time=1.013 ms
ping: sendto: Message too long
Далее ещё сужаем область поиска
ping -D -g 5970 -G 5980 -h 1 192.168.100.25
PING 192.168.100.25 (192.168.100.25): (5970 ... 5980) data bytes
5978 bytes from 192.168.100.25: icmp_seq=0 ttl=64 time=0.921 ms
5979 bytes from 192.168.100.25: icmp_seq=1 ttl=64 time=0.874 ms
5980 bytes from 192.168.100.25: icmp_seq=2 ttl=64 time=0.869 ms
ping: sendto: Message too long
и получаем значение 5980 байт.

Прибавляем к этому значению размер IP заголовка = 20 и ICMP = 8 байт и получаем максимальный (вероятно и оптимальный) MTU = 5980 + 20 +8 = 6008 байт.

Вот принципе и всё.

суббота, 19 октября 2013 г.

VLAN (802.1q) в FreeBSD


Для реализации VLAN в FreeBSD, в отличии от других ОС, не требуется установка какого либо дополнительного ПО или драйверов. Все работает, как говорится, "из коробки" и управляется стандартной утилиткой ifconfig.

Настроить VLAN в FreeBSD можно из консоли выполнив следующие команды:
Создаём виртуальный интерфейс 
ifconfig vlan13 create
Привязываем виртуальный интерфейс к физическому, указывая что наш новый интерфейс соответствует тегированному трафику VLAN 13, проходящему через физический интерфейс re0
ifconfig vlan13 vlan 13 vlandev re0
Далее работаем как с обычным интерфейсом
ifconfig vlan13 192.168.13.28/27 up
    Теперь можно увидеть наш работающий интерфейс в выводе команды  ifconfig
    vlan13: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 03:31:94:8b:11:c8
        inet 192.168.13.28 netmask 0xffffffc0 broadcast 192.168.13.63
        media: Ethernet autoselect
        status: active
        vlan: 13 parent interface: re0
      После перезагрузки системы наш виртуальный интерфейс исчезнет, ели есть необходимость в том, чтобы он "поднимался" при загрузке, редактируем файл /etc/rc.conf
      ifconfig_re0="up"
      vlans_re0="vlan13"
      create_args_vlan13="vlan 13"
      ifconfig_vlan13="inet 192.168.13.28/27"
       Коротко опишу что мы здесь понаписали:
      • ifconfig_re0="up" - первым делом мы "поднимаем" физический интерфейс, через который будет работать наш vlan
      • vlans_re0="vlan13"- описываем какие интерфейсы vlan будут "ходить" через физтческий интерфейс. Здесь можно указать сколько угодно интерфейсов, разделив их пробелами.
      • create_args_vlan13="vlan 13" - указываем параметры создания виртуального интерфейса. В нашем случае указываем что vlan13 относится к 13 vlan'у.
      • ifconfig_vlan13="inet 192.168.13.28/27" - "поднимаем" интерфейс и присваиваем ему адрес.
      Последними двумя параметрами, необходимо описать все наши виртуальные интерфейсы.

      пятница, 18 октября 2013 г.

      Агрегирование каналов (802.3ad) в Debian

      Для объединения (агрегирования) каналов, в Linux используется драйвер bonding.  О том как заставить работать это дело в Debian, я  попытаюсь кратко описать здесь.

       

       Debian 5 (Lenny)

      Для начала установим пакет ifenslave. Он нам понадобится для объединения интерфейсов.
      aptitude install ifenslave
      Добавляем в файл/etc/modprobe.d/aliases.conf следующие строки:
      alias bond0 bonding
      options bonding mode=2 miimon=100
      Здесь мы устанавливаем режим работы виртуального интерфейса и период опроса объединяемых интерфейсов на предмет наличия соединения.

      Параметр mode может принимать следующие значения:
        • 0 (balance-rr) - Последовательно кидает пакеты, с первого по последний интерфейс.
        • 1 (active-backup) - Один из интерфейсов активен. Если активный интерфейс выходит из строя, другой интерфейс заменяет активный. Данный режим не требует дополнительной настройки коммутатора.
        • 2 (balance-xor) - Передачи пакетов распределяются между интерфейсами на основе формулы ((MAC-адрес источника) XOR (MAC-адрес получателя)) % число интерфейсов. Один и тот же интерфейс работает с определённым получателем. Этот режим даёт балансировку нагрузки и отказоустойчивость.
        • 3 (broadcast) - Все пакеты  на все интерфейсы.
        • 4 (802.3ad) - Link Agregation - IEEE 802.ad. Требуется дополнительная настройка коммутатора.
        • 5 (balance-tlb) - Входящие пакеты принимаются только активным сетевым интерфейсом, исходящий распределяется в зависимости от текущей загрузки каждого интерфейса. Данный режим не требует дополнительной настройки коммутатора.
        • 6 (balance-alb) - Тоже самое что и 5, но в данном режиме так же и входящий трафик распределяется между интерфейсами. Данный режим не требует дополнительной настройки коммутатора, но интерфейсы должны уметь изменять MAC.
      Параметр miimon указывается в миллисекундах. Если указать 0, то интерфейсы опрашиваться не будут. Рекомендуется указывать значение равное 100 и далее корректировать его в зависимости от своих потребностей.

      Теперь редактируем файл настроек сетевых интерфейсов /etc/network/interfaces, добавляем в него следующие строки
      auto bond0
      iface bond0 inet static
              address 192.168.255.253
              netmask 255.255.255.255
              up /sbin/ifenslave bond0 eth0 eth1
              down /sbin/ifenslave -d bond0 eth0 eth1
      Здесь меняем значения адреса и маски на угодную вам, так же не забываем изменить имена интерфейсов ethX на те, которые будете использовать.

      Debian 7 (Wheezy)

      Для этой версии Debian, процедура bonding'а немного другая. Здесь нет необходимости прописывать алиасы в modprobe.d. Достаточно установить пакет ifenslave и внести изменения в /etc/network/interfaces
      auto bond0
      iface bond0 inet static
              address 192.168.255.253
              netmask 255.255.255.255
              bond_mode balance-xor
              bond_miimon 100

      Ссылки

      VLAN (802.1q) в Debian


      Для всех версий Debian первым делом необходимо установить пакет vlan
      aptitude install vlan
      Для того, чтобы наши vlan'ы "поднимались" при загрузке, редактируем файл настройки сетевых интерфейсов /etc/network/interfaces
      auto vlan10
      iface vlan10 inet static
          address 192.168.10.1
          netmask 255.255.255.0
          network 192.168.10.0
          broadcast 192.168.10.255
          vlan-raw-device eth0
      В параметре vlan-raw-device указывается физический сетевой интерфейс, через который будет работать vlan.

      Более подробно прочитать про vlan (802.1q) можно по следующим ссылкам:
      - http://xgu.ru/wiki/VLAN
      - http://ru.wikipedia.org/wiki/VLAN