Содержание
Список примеров
Copyright (c) 2007 Connexion project, Peter V. Saveliev.
Copyright (c) 2008 Connexion project, Eugene Prokopiev.
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found on the GNU site[1].
Этот документ подразумевает, что пользователь знаком с основами IP и функционирования сетей. При его составлении делался упор на частные случаи применения ncsh, поэтому документ не является reference guide. Если таковой нужен, то пишите автору. Также, все доступные варианты команд можно увидеть в шелл ncsh.
Ncsh — изначально приложение по настройке сети, поэтому наше «Hello, world!»
будет именно из этой области. Начнём с базовой настройки интерфейсов.
Пробовать пример можно как редактируя файл /etc/connexion/ncsh/tree
, так
и сразу из оболочки ncsh. Пустые комментарии (!
)
приведены в примерах только для удобства чтения.
Пример 1. Базовая настройка интерфейсов
!
configure network interfaces
!
! Наш loopback-интерфейс. Он не требует
! особой настройки, потому просто включаем
! его в конфиге; адресс 127.0.0.1/8 будет
! добавлен автоматически, это свойство ОС.
!
loopback
enable
!
! Первый ethernet-интерфейс.
!
ethernet 0
!
! Адрес нужно указывать в нотации x.x.x.x/y
, где
! маска приведена в битовой форме. При отсутствии
! маски, она принята равной /32.
!
address 10.0.0.1/24
Проводные интерфейсы настраиваются командой ethernet. На объявленнном ethernet-интерфейсе можно настраивать адреса, скорость работы сетевой карты (10, 100, 1000), правила фильтрации и шейпинга траффика.
Пример 2. Настройка статических адресов на ethernet-интерфейсе
! configure network interfaces ! ethernet 0 ! address 10.0.0.1/24 address 10.0.0.2/24
Пример 3. Настройка dhcp на ethernet-интерфейсе
! configure network interfaces ! ethernet 0 ! use dhcp
В качестве параметра команде ethernet можно указывать номер
интерфейса либо его имя. В первом случае номер будет использован для определения
имени как ethX
, во втором — будет использовано имя в точности как
указано в параметре.
Ядро операционной системы автоматически назначает имя сетевого интерфейса, и его выбор не всегда совпадает с желанием пользователя. Более того, при перезагрузке интерфейс может поменять имя в том случае, если в компьютере установлено несколько сетевых карт, а порядок загрузки модулей не фиксирован жёстко.
Чтобы решить эту проблему, в ncsh используется привязка к MAC-адресам инетрфейсных карт. Указать привязку можно командой hwaddr, в качестве параметра она принимает MAC-адрес в точности так, как его выводит команда shell ip link show, т.е. байты должны быть записаны через двоеточия и буквы должны идти в нижнем регистре.
Пример 4. Привязка интерфейсов к MAC-адресам
! configure network interfaces ! ethernet uplink ! hwaddr 52:54:00:12:34:58 address 10.0.254.2/24 ! ethernet 0 hwaddr 52:54:00:12:34:59 address 192.168.0.1/24
Конфигурация, приведённая выше, назначает интерфейсам имена uplink
и eth0
.
Обратите внимание, что при обычной загрузке имена были бы eth0
и eth1
.
В отличие от других программ настройки сети, ncsh не имеет ограничений, которые
запрещают изменять имена интерфейсов на ethX
. Это связано с алгоритмом
изменения имён: ncsh использует промежуточные имена для конфликтующих названий
интерфейсов.
Привязка имён интерфейсов к MAC-адресам требует опускать сетевой интерфейс перед переименованием. Учитывая, что переименование может затронуть несколько интерфейсов, это становится процедурой, поенциально грозящей потерей связи с компьютером. Поэтому проводить такую процедуру на удалённой машине нужно с осторожностью.
Ограничения, однако, есть и в ncsh, хотя и другого рода. Если используется
привязка по MAC-адресам для имён вида ethX
, то будет лучше
(хотя и не обязательно) привязать все интерфейсы с такими именами. Ещё одно
ограничение связано со структурой модуля, и будет убрано позднее: привязка
интерфейсов работает при создании/удалении секций интерфейсов. То есть, чтобы
изменить привязку ethernet 0
, в оболочке ncsh нужно
исполнить команду no ethernet 0, а затем создать секцию
заново. Либо можно исправить файл конфигурации и в оболочке bash выполнить
команду service ncsh restart.
Мосты объединяют несколько интерфейсов в один. Чтобы создать мост, нужно использовать команду bridge.
Пример 5. Настройка моста
! configure network interfaces ! bridge 0 ! address 192.168.0.1/24 ! interface ethernet 0 interface ethernet 1 interface etehrnet 2
Для интерфейсов, которые необходимо включить в мост, можно указать MAC-адреса. Тогда
для них сначала будет выполнена процедура привязки (и, возможно, переименования), а
уже затем интерфейс будет включён в мост. Имена интерфейсов можно указывать как
обычные, так и в виде ethernet X
. Последнее будет автоматически
преобразовано к виду ethX
и сделано лишь для удобства оператора.
Пример 6. Настройка моста с привязкой интерфейсов к MAC
! configure network interfaces ! bridge 0 ! address 192.168.0.1/24 ! interface net1 hwaddr 52:54:00:12:34:58 interface eth0 hwaddr 52:54:00:12:34:59 interface ethernet 1 hwaddr 52:54:00:12:34:60
VLAN — Virtual LAN. Это технология, позволяющая изолировать траффик, создавая
логические каналы внутри одного физического. Поддерживаются большинством
управляемого сетевого оборудования. Чтобы создать VLAN-интерфейс на ethernet-
или bridge-устройстве, к номеру устройства достаточно добавить .X
,
где X — номер VLAN.
Пример 7. Настройка VLAN-интерфесов
! configure network interfaces ! ethernet 0.511 address 10.0.1.1/24 ! ethernet 0.512 address 10.0.2.1/24
Ещё одна форма записи VLAN-интерфейсов требует больше букв, но может показаться логичнее. В этом случае внутри секции какого-либо интерфейса можно создавать секции vlan
Пример 8. Ещё одна форма записи VLAN
! configure network interfaces ! ethernet 0 ! vlan 511 address 10.0.1.1/24 ! vlan 512 address 10.0.2.1/24
Команда speed не должна использоваться для шейпинга траффика, она нужна, например, в том случае, когда один из портов в паре или оба не работают на скорости, которую выбирают автоматически. Выглядит это так: порты с обоих концов провода пишут состояние «connected», но траффик не ходит вообще. Очень редко, но такое случается из-за врождённых дефектов контроллера. Реже это случается из-за дефектов, приобретённых в ходе работы. Ещё реже — из-за дефектов витой пары.
Когда такая ситуация настаёт, можно попробовать её улучшить, уменьшив скорость протокола Ethernet на интерфейсе, например, если порт выбирает 100, то принудительно установить 10. На самом деле, дефектный контроллер или провод нужно заменить, но иногда случается, что замена будет не скоро, а работать нужно прямо сейчас; тогда можно потерпеть и уменьшение скорости.
Ещё одна ситуация, когда необходимо указывать скорость работы руками, это когда на одном или обоих контроллерах не работает autonegotiation. В этом случае даже при исправном проводе контроллеры пишут «not connected». Иногда это означает фатальную неисправность одного из контроллеров, а иногда и неработающий autonegotiation. Тогда с обеих сторон нужно выставить желаемую скорость (имеет смысл начать проверки с 10) и проверить ещё раз.
Пример 9. Принудительное изменение скорости Ethernet
! configure network interfaces ! ethernet 0 ! address 192.168.0.1/28 ! ! Меняем протокол с FastEthernet (100Mbit, 802.3u) ! на Ethernet (10Mbit, 802.3). Это нужно только ! в случае неисправностей контроллера или линии. ! speed 10
Модули управления ppp находятся в ранней стадии разработки и не протестированы в достаточной мере. Автор будет благодарен за feedback и/или пожелания.
PPTP — point-to-point over tcp. Это способ связывать два узла туннелем и является популярным решением построения сетей VPN. На данный момент ncsh может управлять клиентским подключением по протоколу PPTP.
Подключение PPTP требует наличия маршрута до сервера VPN, иначе говоря, должен быть настроен хотя бы один интерфейс и сервер должен быть доступен до установки туннеля.
Пример 10. Соединение PPTP
! configure network ! interfaces ! ethernet 0 ! ! an external inerface ! address 10.0.0.2/24 ! pptp office host vpn.somewhere.net user user.pptp option debug option maxfail 10 optio nopersist
На данный момент, ncsh не умеет управлять файлами /etc/ppp/pap|chap-secrets
.
Поэтому имя пользователя и пароль туда необходимо внести руками до установления
соединения. Команда ncsh user в данном примере всего
лишь указывает, какое имя из файла /etc/ppp/pap|chap-secrets
использовать
для доступа к серверу VPN.
Команды option управляют параметрами запуска pppd. Модули настройки pptp и pppoe по умолчнию уже имеют набор параметров, которые можно переопределить командами option, но которые также необходимо иметь в виду.
lcp-echo-interval 60 ktune connect /bin/true persist nodefaultroute debug maxfail 0 noauth mtu 1280
Модули управления ppp находятся в ранней стадии разработки и не протестированы в достаточной мере. Автор будет благодарен за feedback и/или пожелания.
Для работы PPPoE-соединения необходимо указать пользователя и интерфейс, на котором будет работать клиент. Для соединений PPPoE также справедливо замечание про параметры pppd.
Пример 11. Соединение PPTP
! configure network ! interfaces ! pppoe internet interface ethernet 0 acn provider user user.pppoe
На данный момент в ncsh реализовано управление только параметрами исходящего траффика. Это означает, что это полезно или на GNU/Linux-маршрутизаторах, или на серверах, где нужно управлять приоритетами и пропускной способностью исходящих потоков.
В будущем планируется также поддержка ingress policing для поддержки управления входящим траффиком. Поддержка imq не планируется, т.к. эта возможность была исключена из ядра как нестабильная.
Каждая очередь управления траффиком требует интерфейса, на котором
она будет оперировать. На каждом интерфейсе может быть определена
только одна корневая очередь (случай с ingress пока что не рассматриваем),
и в рамках настроек ncsh это означает, что каждый интерфейсный узел
может нести только одного потомка класса egress
.
Помимо определения очереди внутри интерфейса, можно также определить
его отдельно и потом применить вызовом команды call
,
как показано в примере ниже. Это может быть полезно, когда одинаковые
очереди нужно установить на несколько интерфейсов.
Пример 12. Описание очереди управления траффиком внутри интерфейса
! configure network interfaces ! ethernet 0 ! ... egress sfq ! ... ! ethernet 1 ! ... egress htb ! ...
Пример 13. Описание очереди в виде функции
! configure network ! tc ! egress htb ! ... declare f1 ! egress sfq ! ... declare f2 ! intrefaces ! ethernet 0.511 call f1 ! ethernet 0.512 call f1 ! ethernet 1 call f2
Самая простая очередь, SFQ расшифровывается как Stochastic Fairness Queueing. Задачей этой очереди является «справедливое» распределение полосы пропускания между различными сетевыми потоками. Справедливое в данном случае означает то, что при наличие SFQ пакетам ssh-сессии не придётся ждать, пока пройдут все крупные пакеты ftp-данных; каждый поток имеет схожие шансы на передачу вне зависимости от количества пакетов в потоке. Это было бы не так в случае FIFO.
Наиболее важные параметры SFQ — это perturb и limit. Первый указывает интервал в секундах, через который будет проводиться переоценка потоков, идущих через интерфейс. Второй — общее количество пакетов, которые могут быть выстроены в очередь SFQ. Пакеты, превысившие этот порог, будут отброшены.
Пример 14. Очередь SFQ
! ! Для примеров мы будем использовать обе формы ! описания очередей — как в виде функций, так ! и внутри интерфейсов. ! configure network interfaces ! ethernet 0 ! ! адрес на интерфейс мы добавим для того, ! чтобы правдоподобнее выглядело ! address 192.168.0.128/24 ! egress sfq ! ! перенастраивать очередь каждые 10 секунд, ! заново проводя оченку проходящих потоков. ! perturb 10 ! ! держать в очереди не более 512 пакетов ! limit 512
Очередь под названием Token Bucket Filter на самом деле не имеет отношения к фильтрам в смысле команды tc filter, это нормальная очередь, с помощью которой можно управлять полосой пропускания траффика на интерфейсе без потерь пакетов (при условии достаточного количества оперативной памяти).
Пример 15. Очередь TBF, зажимаем траффик на 128Kbit
! configure network ! interfaces ! ! Каждый из VLAN'ов зажимаем на 128Kbit, ! а обычный ethernet — на 1Mbit ! ethernet 0.510 ! address 10.0.0.1/24 call shaper ! ethernet 0.511 ! address 10.0.1.1/24 call shaper ! ethernet 1 address 192.168.2.2/28 call uplink ! tc ! egress tbf clients ! ! Ради разнообразия сделаем очередь ! через функцию. См. вызов call в ! ethernet 0 ! declare shaper ! burst 10240 limit 10240 rate 128Kbit ! egress tbf uplink ! declare uplink rate 1Mbit
К сожалению, TBF не подходит в том случае, когда необходимо установить различные ограничения по скорости в пределах одного интерфейса. В этом случае нужно использовать Hierarchical Token Bucket.
Допустим, у нас есть два интерфейса, ethernet 0 — внешний и ethernet 1 — внутренний. Нам нужно раздать всем машинам за внутренним интерфейсом некий ресурс со скоростью 10Mbit, в то время как скорость доступа ко всем остальным ресурсам интернета была 64Kbit. Для определённости, десятимегабитным фаворитом у нас будет msn.com, 207.68.172.246. Клиенты будут расположены в двух сетях, 10.0.1.0/24 и 10.0.2.0/24. Эти сети получат 64Kbit и 128Kbit на все хосты разом. Несмотря на то, что в примере каждый класс несёт в себе лишь один фильтр (команда match), их может быть больше.
Пример 16. Очередь HTB, прицельное ограничение траффика
! confiure network ! interfaces ! ! Внутренний, смотрит в две сети ! ethernet 0 ! address 10.0.1.1/24 address 10.0.2.1/24 ! call shaper ! ! Внешний, смотрит к провайдеру через ! сеть взаимодействия 90.0.0.0/28 ! ethernet 1 ! address 90.0.0.2/28 ! tc ! egress htb ! declare shaper ! ! Для нормальной работы очереди нужно ! указать общую пропускную способность ! канала. ! rate 100Mbit ! ! В какой класс отправлять траффик, не попавший ! ни под один из фильтров? ! default 1 ! class 1 ! Сюда попадёт весь неопределённый траффик, ! т.к. номер этого класса указан в команде ! default. ! rate 9Kbit ! class 2 ! MSN надо раздавать с большой скоростью ! match src 207.68.172.246 ! ! Чем меньше номер приоритета, тем раньше ! отработают фильтры этого класса. Таким ! образом, траффик с MSN будет отправляться ! в класс 2 вне зависимости от адреса ! назначения. ! priority 1 ! rate 10Mbit ! class 3 ! Сеть 10.0.1.0/24, 64Kbit ! match dst 10.0.1.0/24 priotiry 2 rate 64Kbit ! class 4 ! Сеть 10.0.2.0/24, 128Kbit ! match dst 10.0.2.0/24 priority 2 rate 128Kbit
Нужно проверить, как отработает match src 207.68.172.246 в случае NAT. Потому что src может быть уже и не таким.
Как несложно заметить, пример выше раздаёт пропускную способность на всю сеть сразу. Чтобы раздать по 64Kbit на каждый хост в сети, нужно для каждого хоста создать класс. Но это означает, что мы вручную должны прописать 252 класса для сети класса C. Довольно-таки много. Чтобы выйти из этой ситуации, можно использовать команду class-factory.
Пример 17. Очередь HTB: фабрика классов
! configure network interfaces ! ethernet 0 ! address 10.0.1.1/24 address 10.0.2.1/24 ! egress htb ! rate 100Mbit ! class-factory 10.0.1.0/24 ! ! Каждый хост из этой сети ! получит по 64Kbit ! rate 64Kbit ! class-factory 10.0.2.0/24 ! ! А здесь — по 128Kbit ! rate 128Kbit
Случаются ситуации, когда необходимо шейпить траффик, использующий нестандартные или меняющиеся порты. В этом случае может выручить анализатор l7-filter, который принимает решение на основании содержимого сетевых пакетов. Следует помнить, что не для всех протоколов результат надёжен на 100%. Подробнее можно посмотреть на сайте проекта l7-filter: http://l7-filter.sourceforge.net/protocols
Пример 18. Очередь HTB: l7-filter
! configure network interfaces ethernet 0 ! address 10.0.0.1/24 ! egress htb ! class 1 rate 100Mbit ! class 2 match l7 edonkey match l7 ftp match l7 socks rate 16Kbit ! default 1 rate 100Mbit
Фильтрация пакетов в ncsh реализована пока что в зачаточном виде; поддерживаются только базовые возможности, и только в привязке к определённым интерфейсам.
Создавать пакетные фильтры на данный момент можно только
в ветке configure network tc. Каждый фильтр
должен быть определён как функция с помощью команды declare.
Каждый фильтр может быть вызван в ветке интерфейса с помощью команды
call. Первым параметром должно следовать имя
фильтра, вторым — направление фильтрации. Направлений может быть
три, in
, out
и forward
,
соответственно, для пакетов, предназначенных этой системе,
сгенерированных этой системой и для проходящих сквозь.
Пример 19. Создание простейшего пакетного фильтра
!
configure network
!
interfaces
!
ethernet 0
!
address 10.0.0.1/24
!
! Вызовем один пакетный фильтр для
! входящих пакетов
!
call bala in
!
tc
!
simple-acl any_name
!
! К сожалению, в текущей реализации
! имя simple-acl, в данном
! случае any_name
, никак не
! участвует в процессе обработки фильтров.
! Оно необходимо только для создания
! нескольких фильтров одновременно.
!
declare bala
!
! Собственно правила. Правило состоит из:
! * приоритета
! * действия с пакетом
! * спецификации, диктующей либо
! необходимые параметры поиска пакетов,
! либо то, что нужно с пакетом сделать.
!
rule 10 reject dport 22
rule 20 reject dport 23
Одна из основных задач шлюза в средней офисной сети — обеспечение доступа к интернету для рабочих станций. Архитектура IPv4 приводит к тому, что в локальных сетях используют немаршрутизируемые в интернете диапазоны адресов, а это требует трансляции адресов.
Пример 20. Настройка SNAT
! configure network ! interfaces ! ! Внутренний (downlink) ! ethernet 0 ! address 10.0.0.1/24 ! ! Внешний (uplink) ! ethernet 1 ! address 1.2.3.4/28 ! ! правила SNAT и маскарада ! прописываются в одну и ту же ! таблицу вне зависимости от того, ! указано ли направление in или ! out. ! call snat out ! tc ! simple-acl bala ! declare snat ! rule 10 snat tosrc 1.2.3.4
DNAT настраивается аналогично, за тем исключением, что вместо tosrc нужно использовать todst.
Если провайдер выдаёт шлюзу динамический ip-адрес, то правило snat не подойдёт. В этом случае можно использовать masquerade.
Пример 21. Настройка маскарада
! configure network ! interfaces ! ! Внутренний (downlink) ! ethernet 0 ! address 10.0.0.1/24 ! ! Внешний (uplink) ! ethernet 1 ! use dhcp ! call masq out ! tc ! simple-acl bala ! declare masq ! rule 10 masquerade
Маршрутизация в её обычном виде — это набор правил, которые система просматривает друг за другом; каждое правило описывает, куда пересылать пакет в зависимости от его адреса назначения.
Система GNU/Linux позволяет более тонкое управление маршрутизацией, предоставляя 255 таблиц маршрутизации и список правил, согласно которым пакет может обрабатываться по той или иной таблице.
По умолчанию, GNU/Linux использует три таблицы маршрутизации,
main
, local
и default
.
Таблица main — это та, с которой все привыкли работать через
утилиты route и netstat -r.
Таблица local содержит правила, которые автоматически создаются
ядром ОС, и её ручная правка не приветствуется. Таблица default
по умолчанию пустая, она стоит последней в правилах RPDB и туда
можно вносить правила маршрутизации, которые будут срабатывать,
если ни одно правило не подошло.
Помимо этого, остаются свободными ещё 252 таблицы, которые можно использовать по своему усмотрению. На данный момент ncsh предоставляет очень низкоуровневый интерфейс к возможностям маршрутизации, поэтому некоторые моменты могут быть не вполне понятны начинающему пользователю. Это будет исправлено в будущих релизах.
Пример 22. Назначение статических маршрутов в таблице main
!
configure network
!
interfaces ethernet 0
address 10.0.0.2/24
!
! Если не указано имя таблицы, то используется
! таблица main. То есть, это же можно было бы
! записать как routing table main
!
routing table
route default via 10.0.0.1