Роутинг и policy-routing в Linux при помощи iproute2. Ip route параметры


Утилита ip Linux | Losst

Сегодня я хочу поговорить о настройке сети в Linux и, в частности, об универсальной консольной утилите - ip. В давних инструкциях, да что там в давних, в новых тоже мы очень часто встречаем утилиты ifconfig, arp, route. Но они уже в прошлом, они устарели еще начиная с версии ядра 2.2. Утилита ip объединяет в себе возможности всех этих и нескольких других команд для управления сетью в Linux.

Утилита ip поставляется во всех дистрибутивах по умолчанию, и хотя ее предшественники тоже пока что доступны, будущее за ip, а поэтому давайте разберемся как ею пользоваться и что с помощью нее можно настроить.

Как вы поняли, в этой инструкции мы рассмотрим как использовать утилиту ip для настройки сети в Linux. Эта утилита позволит делать вам даже больше чем все те, функциональность которых она поглотила. Например, здесь вы сможете не только смотреть свойства подключения, установить ip адрес и смотреть arp таблицу, но и настроить политики маршрутизации, управлять arp таблицами, а также настраивать специфичные параметры стека TCP/IP, например, ширину окна. Конечно, учитывая такое количество функций, она сложна в освоении, но оно того стоит.

Содержание статьи:

Синтаксис

Сначала рассмотрим синтаксис команды:

ip [опции] объект команда [параметры]

опции - это глобальные настройки, которые сказываются на работе всей утилиты независимо от других аргументов, их указывать необязательно.

объект - объект или устройство, с которым будем работать или о котором будем узнавать информацию.

команды - какое-либо действие с объектом.

параметры - само собой, командам иногда нужно передавать параметры, они передаются в этом пункте.

Дальше рассмотрим все еще более подробно.

Опции

Поддерживаются такие опции для настройки сети в lInux:

-v - только вывод информации об утилите и ее версии

-s - включает вывод статистической информации

-f - позволяет указать протокол, с которым нужно работать, если протокол не указан, то берется на основе параметров команды. Опция f должна принимать одно из значений: bridge, dnet, inet, inet6, ipx или link. По умолчанию используется inet, link - означает отсутствие протокола.

-o - выводить каждую запись с новой строки

-r - выполнять резолвинг и выводить символические имена хостов

Все остальные опции - ярлыки опции -f:

-4 - ярлык для -f inet

-6 - -f inet6

-B - -f bridge

-0 - -f link

Объекты

Теперь давайте рассмотрим самые важные объекты.

  • address - сетевой адрес на устройстве
  • link- физическое сетевое устройство
  • monitor - мониторинг состояния устройств
  • neigh - ARP
  • route - управление маршрутизацией
  • rule - правила маршрутизации
  • tunnel - настройка туннелирования

Конечно, это не все объекты которые поддерживает команда ip linux, но на первое время вам хватит. Во время ввода имя объекта может быть сокращено до одной буквы. При неоднозначности используется алфавитный порядок. Например, ip a show, расшифровывается как ip address show. Тогда как в ip r show, r - означает route.

Команды

Теперь рассмотрим доступные команды, с помощью которых может быть выполнена настройка сети linux. Вот они: add, change, del или delete, flush, get, list или show, monitor, replace, restore, save, set, и update.

Если команда не задана, по умолчанию используется show (показать).

Здесь тоже поддерживается сокращение и в большинстве случаев для выполнения нужного действия достаточно нескольких символов. Но алфавитный порядок соблюдается не всегда. Например, ip a s, означает ip address show, а не ip address set, к сожалению.

Параметры

Параметры зависят от объекта и указанной команды. Рассмотрим самые основные:

  • dev имя_устройства - сетевое устройство
  • up - включить
  • down - выключить
  • llarrr - MAC - адрес
  • initcwnd - размер окна перегрузки TCP при инициализации
  • window - размер окна TCP
  • cwnd - размер окна перегрузки TCP
  • type - тип
  • via - подключиться к роутеру
  • default - маршрут по умолчанию
  • blackhole - маршрут "черная дыра" - отбрасывать пакеты и не посылать ICMP сообщения о недоступности
  • prohibit - маршрут "запрета" - отбрасывать пакеты и возвращать ICMP сообщения о запрете доступа
  • unreachable - маршрут "недостижимый" - отбрасывать пакеты и посылать ICMP пакеты о недостижимости узла.

Примеры использования

Вот теперь мы дошли к самому интересному - примерам использования утилиты ip Linux. То что я здесь опишу на самом деле лишь маленькая капля из всего того что может утилита ip. Для удобства все команды отсортированы по объектам, к которым они применяются.

ip link

Утилита ip в Linux с параметром linux позволяет управлять состоянием сетевых интерфейсов и просматривать информацию о них.

  • ip link show - отобразить состояние всех сетевых интерфейсов
  • ip l sh - то же самое
  • ip ll - то же самое
  • ip l - то же самое
  • ip link show eth0 - отобразить состояние eth0
  • ip link list up - отобразить статус всех включенных интерфейсов
  • ip link set eth2 up - включить eth2
  • ip link set eth2 down выключить eth2

ip neigbour

Объект neigbour используется для управления ARP таблицами.

  • ip neigh show - показать все записи ARP
  • ip n sh - то же самое
  • ip n l - то же самое
  • ip n - то же самое
  • ip neigh show dev eth0 - посмотреть все ARP записи для eth0
  • ip neigh flush - удалить все ARP записи
  • ip ne fl dev eth0 - удалить все ARP записи для eth0
  • ip nei add 1.1.1.13 lladdr AA:BB:CC:DD:EE:FF dev eth0 - добавить ARP запись для определенного IP адреса.
  • ip n del 1.1.1.13 dev eth0 - удалить все записи для указанного адреса

ip address

Важно заметить, что вторичные ip адреса не используются в качестве исходящих адресов для отправки пакетов.

  • ip address show - показать все ip адреса и их интерфейсы
  • ip a sh - то же самое
  • ip a list - то же самое
  • ip a - то же самое
  • ip a l permanent - отобразить только статические ip адреса
  • ip a l dynamic - отобразить только динамические ip адреса
  • ip addr add 1.1.1.13/24 dev eth0 - установить ip адрес для интерфейса eth0
  • ip addr del 1.1.1.13/24 dev eth0 - удалить ip адрес интерфейса eth0
  • ip add flush dev eth0 - удалить все ip адреса интерфейса eth0

ip route

Утилита ip в Linux позволяет не только устанавливать ip адреса, но и настраивать маршруты. По умолчанию в Linux используется таблица маршрутизации 254, вы также можете иметь дело с таблицей 255, которую не следует изменять, а также 253, в которой хранятся маршруты по умолчанию.

  • ip r sh показать все маршруты в таблице маршрутизации
  • ip route show table nnn - отобразить все маршруты из таблицы 255
  • ip route get 10.10.20.0/24 - отобразить маршрут к этой сети
  • ip route get 10.10.20.0/24 from 192.168.12.9 - отобразить маршрут к этой сети от указного интерфейса.
  • ip route add 10.10.20.0/24 via 192.168.50.100 - создать маршрут
  • ip route delete 10.10.20.0/24 - удалить маршрут.
  • ip route del 10.10.20.0/24 via 192.168.50.100 - удалить маршрут.
  • ip route add default via 192.168.50.100 - создать маршрут по умолчанию.
  • ip route add 10.10.20.0/24 dev eth0 - создать маршрут к указной сети.
  • ip route add table nnn 10.10.20.0/24 dev eth0 - создать маршрут в специальной таблице роутинга.
  • ip route add blackhole 10.10.20.0/24 dev eth0 - создать blackhole маршрут.
  • ip route add unreachable 10.10.20.0/24 dev eth0 - создать unreachable маршрут.

Вот и все, возможно, в будущем этот список будет пополняться. Надеюсь, утилита ip Linux уже не кажется такой непонятной. Если у вас есть вопросы или хотите предложить еще несколько команд, пишите комментарии!

Перевод: http://packetpushers.net/linux-ip-command-ostensive-definition/

Оцените статью:

Загрузка...

losst.ru

Роутинг и policy-routing в Linux при помощи iproute2 / Хабр

Речь в статье пойдет о роутинге сетевых пакетов в Linux. А конкретно – о типе роутинга под названием policy-routing (роутинг на основании политик). Этот тип роутинга позволяет маршрутизировать пакеты на основании ряда достаточно гибких правил, в отличие от классического механизма маршрутизации destination-routing (роутинг на основании адреса назначения). Policy-routing применяется в случае наличия нескольких сетевых интерфейсов и необходимости отправлять определенные пакеты на определенный интерфейс, причем пакеты определяются не по адресу назначения или не только по адресу назначения. Например, policy-routing может использоваться для: балансировки трафика между несколькими внешними каналами (аплинками), обеспечения доступа к серверу в случае нескольких аплинков, при необходимости отправлять пакеты с разных внутренних адресов через разные внешние интерфейсы, даже для отправки пакетов на разные TCP-порты через разные интерфейсы и т.д. Для управления сетевыми интерфейсами, маршрутизацией и шейпированием в Linux служит пакет утилит iproute2. Этот набор утилит лишь задает настройки, реально вся работа выполняется ядром Linux. Для поддержки ядром policy-routing оно должно быть собрано с включенными опциями IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) и IP: policy routing (CONFIG_IP_MULTIPLE_TABLES), находящимися в разделе Networking support -> Networking options -> TCP/IP networking.
ip route
Для настройки роутинга служит команда ip route. Выполненная без параметров, она покажет список текущих правил маршрутизации (не все правила, об этом чуть позже):# ip route 192.168.12.0/24 dev eth0  proto kernel  scope link  src 192.168.12.101 default via 192.168.12.1 dev eth0 Так будет выглядеть роутинг при использовании на интерфейсе eth0 IP-адреса 192.168.12.101 с маской подсети 255.255.255.0 и шлюзом по умолчанию 192.168.12.1. Мы видим, что трафик на подсеть 192.168.12.0/24 уходит через интерфейс eth0. proto kernel означает, что роутинг был задан ядром автоматически при задании IP интерфейса. scope link означает, что эта запись является действительной только для этого интерфейса (eth0). src 192.168.12.101 задает IP-адрес отправителя для пакетов, попадающих под это правило роутинга. Трафик на любые другие хосты, не попадающие в подсеть 192.168.12.0/24 будет уходить на шлюз 192.168.12.1 через интерфейс eth0 (default via 192.168.12.1 dev eth0). Кстати, при отправке пакетов на шлюз, IP-адрес назначения не изменяется, просто в Ethernet-фрейме в качестве MAC-адреса получателя будет указан MAC-адрес шлюза (часто даже специалисты со стажем путаются в этом моменте). Шлюз в свою очередь меняет IP-адрес отправителя, если используется NAT, либо просто отправляет пакет дальше. В данном случае используются приватный адрес (192.168.12.101), так что шлюз скорее всего делает NAT. А теперь залезем в роутинг поглубже. На самом деле, таблиц маршрутизации несколько, а также можно создавать свои таблицы маршрутизации. Изначально предопределены таблицы local, main и default. В таблицу local ядро заносит записи для локальных IP адресов (чтобы трафик на эти IP-адреса оставался локальным и не пытался уходить во внешнюю сеть), а также для бродкастов. Таблица main является основной и именно она используется, если в команде не указано какую таблицу использовать (т.е. выше мы видели именно таблицу main). Таблица default изначально пуста. Давайте бегло взглянем на содержимое таблицы local:# ip route show table local broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 broadcast 192.168.12.255 dev eth0  proto kernel  scope link  src 192.168.12.101 broadcast 192.168.12.0 dev eth0  proto kernel  scope link  src 192.168.12.101 local 192.168.12.101 dev eth0  proto kernel  scope host  src 192.168.12.101 broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1broadcast и local определяют типы записей (выше мы рассматривали тип default). Тип broadcast означает, что пакеты соответствующие этой записи будут отправлены как broadcast-пакеты, в соответствии с настройками интерфейса. local – пакеты будут отправлены локально. scope host указывает, что эта запись действительная только для этого хоста. Для просмотра содержимого конкретной таблицы используется команда ip route show table TABLE_NAME. Для просмотра содержимого всех таблиц в качестве TABLE_NAME следует указывать all, unspec или 0. Все таблицы на самом деле имеют цифровые идентификаторы, их символьные имена задаются в файле /etc/iproute2/rt_tables и используются лишь для удобства.
ip rule
Как же ядро выбирает, в какую таблицу отправлять пакеты? Все логично – для этого есть правила. В нашем случае:# ip rule 0: from all lookup local 32766: from all lookup main 32767: from all lookup default Число в начале строки – идентификатор правила, from all – условие, означает пакеты с любых адресов, lookup указывает в какую таблицу направлять пакет. Если пакет подпадает под несколько правил, то он проходит их все по порядку возрастания идентификатора. Конечно, если пакет подпадет под какую-либо запись маршрутизации, то последующие записи маршрутизации и последующие правила он уже проходить не будет. Возможные условия:
  • from – мы уже рассматривали выше, это проверка отправителя пакета.
  • to – получатель пакета.
  • iif – имя интерфейса, на который пришел пакет.
  • oif – имя интерфейса, с которого уходит пакет. Это условие действует только для пакетов, исходящих из локальных сокетов, привязанных к конкретному интерфейсу.
  • tos – значение поля TOS IP-пакета.
  • fwmark – проверка значения FWMARK пакета. Это условие дает потрясающую гибкость правил. При помощи правил iptables можно отфильтровать пакеты по огромному количеству признаков и установить определенные значения FWMARK. А затем эти значения учитывать при роутинге.
Условия можно комбинировать, например from 192.168.1.0/24 to 10.0.0.0/8, а также можно использовать префикc not, который указывает, что пакет не должен соответствовать условию, чтобы подпадать под это правило. Итак, мы разобрались что такое таблицы маршрутизации и правила маршрутизации. А создание собственных таблиц и правил маршрутизации это и есть policy-routing, он же PBR (policy based routing). Кстати SBR (source based routing) или source-routing в Linux является частным случаем policy-routing, это использование условия from в правиле маршрутизации.
Простой пример
Теперь рассмотрим простой пример. У нас есть некий шлюз, на него приходят пакеты с IP 192.168.1.20. Пакеты с этого IP нужно отправлять на шлюз 10.1.0.1. Чтобы это реализовать делаем следующее: Создаем таблицу с единственным правилом:# ip route add default via 10.1.0.1 table 120 Создаем правило, отправляющее нужные пакеты в нужную таблицу:# ip rule add from 192.168.1.20 table 120 Как видите, все просто.
Доступность сервера через несколько аплинков
Теперь более реалистичный пример. Имеется два аплинка до двух провайдеров, необходимо обеспечить доступность сервера с обоих каналов: В качестве маршрута по умолчанию используется один из провайдеров, не важно какой. При этом веб-сервер будет доступен только через сеть этого провайдера. Запросы через сеть другого провайдера приходить будут, но ответные пакеты будут уходить на шлюз по умолчанию и ничего из этого не выйдет. Решается это весьма просто: Определяем таблицы:# ip route add default via 11.22.33.1 table 101 # ip route add default via 55.66.77.1 table 102 Определяем правила:# ip rule add from 11.22.33.44 table 101 # ip rule add from 55.66.77.88 table 102 Думаю теперь уже объяснять смысл этих строк не надо. Аналогичным образом можно сделать доступность сервера по более чем двум аплинкам.
Балансировка трафика между аплинками
Делается одной элегантной командой:# ip route replace default scope global \ nexthop via 11.22.33.1 dev eth0 weight 1 \ nexthop via 55.66.77.1 dev eth2 weight 1 Эта запись заменит существующий default-роутинг в таблице main. При этом маршрут будет выбираться в зависимости от веса шлюза (weight). Например, при указании весов 7 и 3, через первый шлюз будет уходить 70% соединений, а через второй – 30%. Есть один момент, который при этом надо учитывать: ядро кэширует маршруты, и маршрут для какого-либо хоста через определенный шлюз будет висеть в таблице еще некоторое время после последнего обращения к этой записи. А маршрут до часто используемых хостов может не успевать сбрасываться и будет все время обновляться в кэше, оставаясь на одном и том же шлюзе. Если это проблема, то можно иногда очищать кэш вручную командой ip route flush cache.
Использование маркировки пакетов при помощи iptables
Допустим нам нужно, чтобы пакеты на 80 порт уходили только через 11.22.33.1. Для этого делаем следующее:# iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2 # ip route add default via 11.22.33.1 dev eth0 table 102 # ip rule add fwmark 0x2/0x2 lookup 102 Первой командой маркируем все пакеты, идущие на 80 порт. Второй командой создаем таблицу маршрутизации. Третьей командой заворачиваем все пакеты с указанной маркировкой в нужную таблицу. Опять же все просто. Рассмотрим также использование модуля iptables CONNMARK. Он позволяет отслеживать и маркировать все пакеты, относящиеся к определенному соединению. Например, можно маркировать пакеты по определенному признаку еще в цепочке INPUT, а затем автоматически маркировать пакеты, относящиеся к этим соединениям и в цепочке OUTPUT. Используется он так:# iptables -t mangle -A INPUT -i eth0 -j CONNMARK --set-mark 0x2 # iptables -t mangle -A INPUT -i eth2 -j CONNMARK --set-mark 0x4 # iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark Пакеты, приходящие с eth0 маркируются 2, а с eth2 – 4 (строки 1 и 2). Правило на третьей строке проверяет принадлежность пакета к тому или иному соединению и восстанавливает маркировки (которые были заданы для входящих) для исходящих пакетов. Надеюсь изложенный материал поможет вам оценить всю гибкость роутинга в Linux. Спасибо за внимание :)

habr.com

ip route

ip route

Для добавления записи в таблицу маршрутизации используйте команду  ip  route. Для удаления маршрута используется  no-форма команды.

 

Синтаксис                     ip  route  prefix  mask {gw-ip-addr | interface-name} [distance] [permanent]

                   no ip route prefix mask { gw-ip-addr | interface-name } [distance] [permanent]

                   no  ip  route  prefix  mask 

prefix                          старшая общая часть IP-адресов, до которой прописывается маршрут. Для задания маршрута, который будет использоваться по умолчанию, IP-адрес должен быть равен 0.0.0.0

mask                              маска хоста или подсети, до которой прописывается маршрут. Для задания маршрута, который будет использоваться по умолчанию, маска подсети должна быть равна 0.0.0.0

gw-ip-addr                  IP-адрес шлюза, через который прописывается маршрут

interface-name     имя сетевого интерфейса. Сетевой интерфейс должен точно соответствовать конкретному системному интерфейсу. Использование интерфейсов, заданных в файле ifaliases.cf с помощью перечислений или шаблонов не допускается

distance                      административная дистанция (метрика) имеет разный смысл в разных ОС и в данной команде будет проигнорирована. Поэтому, использовать ее не рекомендуется

permanent          обозначение постоянного маршрута. Параметр запоминается и показывается по show running-config, однако реально не используется. Присутствует для совместимости с продуктами управления Cisco.

 

Недопустимо указывать одновременно параметры интерфейса и IP-адрес шлюза, через который прописывается маршрут.

Маршрут по умолчанию – маршрут, по которому будет отправлен пакет, если IP-адрес назначения, указанный в заголовке пакета, не совпадает ни с одним адресом назначения в таблице маршрутизации.

 

Значение по умолчанию                    отсутствует

 

Режимы команды                               Global configuration

 

Рекомендации по использованию

Используйте эту команду для добавления записи в таблицу маршрутизации. Реальное добавление маршрута осуществляется при прогрузке сконвертированной Native-конфигурации.

Повторное добавление существующего маршрута не считается ошибкой (поведение, аналогичное Cisco IOS).

Используемые ОС налагают требование, чтобы шлюз, через который прописывается маршрут, был доступен с сетевого интерфейса устройства.

Параметр distance игнорируется. При добавлении маршрута выставляется системная метрика, аналогичная той, которая выставляется по умолчанию при добавлении маршрута с помощью команды ОС route  add. Но по команде show  ip  route для данного маршрута будет показано значение distance, равное 1.

 

Удаление

Команда может быть введена только с консоли

Удаление единичного маршрута:

no ip route prefix mask { gw-ip-addr | interface-name } [distance] [permanent]

Параметры distance и permanent игнорируются. Остальные параметры должны точно соответствовать параметрам, которые выдаются по show running-config.

 

Удаление маршрутов по адресной информации:

no  ip  route  prefix  mask 

 

Отличие данной команды от подобной команды Cisco  IOS:

·       В команде необходимо прописывать маршрут через шлюз, который является доступным с сетевого интерфейса.

·       В консоли параметром, связанным с метрикой является distance, а в Cisco IOS – параметр administrative distance.

·       Параметр distance игнорируется.

·       Отсутствует команда clear ip route для удаления маршрута из системной таблицы маршрутизации.

 

Пример

Router(config)#ip route 10.10.10.1 255.255.255.255 10.2.2.1

 

Возможные сообщения об ошибках приведены в таблице.

Таблица 7

Сообщение

Пояснение

%No matching route to delete

В команде no ip route задан маршрут, отсутствующий в конфигурации.

Сообщение, аналогичное Cisco IOS.

%Inconsistent address and mask

Один из двух случаев:

Задан некорректный параметр <mask> (например, 255.0.255.0).

Значения <prefix> и <mask> не соответствуют друг другу (например, 192.168.10.10 255.255.255.0).

Сообщение, аналогичное Cisco IOS.

Ниже в данной таблице приведены сообщения, специфичные для cs_console.

% The network interface must exactly correspond to a system network interface

Попытка прописать маршрут через сетевой интерфейс, заданный в файле ifaliases.cf с помощью шаблона или списка значений.

 

 

doc.s-terra.ru

Роутинг и policy-routing в Linux при помощи iproute2

Речь в статье пойдет о роутинге сетевых пакетов в Linux. А конкретно – о типе роутинга под названием policy-routing (роутинг на основании политик). Этот тип роутинга позволяет маршрутизировать пакеты на основании ряда достаточно гибких правил, в отличие от классического механизма маршрутизации destination-routing (роутинг на основании адреса назначения). Policy-routing применяется в случае наличия нескольких сетевых интерфейсов и необходимости отправлять определенные пакеты на определенный интерфейс, причем пакеты определяются не по адресу назначения или не только по адресу назначения. Например, policy-routing может использоваться для: балансировки трафика между несколькими внешними каналами (аплинками), обеспечения доступа к серверу в случае нескольких аплинков, при необходимости отправлять пакеты с разных внутренних адресов через разные внешние интерфейсы, даже для отправки пакетов на разные TCP-порты через разные интерфейсы и т.д.

Для управления сетевыми интерфейсами, маршрутизацией и шейпированием в Linux служит пакет утилит iproute2.

Этот набор утилит лишь задает настройки, реально вся работа выполняется ядром Linux. Для поддержки ядром policy-routing оно должно быть собрано с включенными опциями IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) и IP: policy routing (CONFIG_IP_MULTIPLE_TABLES), находящимися в разделе Networking support -> Networking options -> TCP/IP networking.

ip route

Для настройки роутинга служит команда ip route. Выполненная без параметров, она покажет список текущих правил маршрутизации (не все правила, об этом чуть позже):

# ip route 192.168.12.0/24 dev eth0  proto kernel  scope link  src 192.168.12.101 default via 192.168.12.1 dev eth0

Так будет выглядеть роутинг при использовании на интерфейсе eth0 IP-адреса 192.168.12.101 с маской подсети 255.255.255.0 и шлюзом по умолчанию 192.168.12.1.

Мы видим, что трафик на подсеть 192.168.12.0/24 уходит через интерфейс eth0. proto kernel означает, что роутинг был задан ядром автоматически при задании IP интерфейса. scope link означает, что эта запись является действительной только для этого интерфейса (eth0). src 192.168.12.101 задает IP-адрес отправителя для пакетов, попадающих под это правило роутинга.

Трафик на любые другие хосты, не попадающие в подсеть 192.168.12.0/24 будет уходить на шлюз 192.168.12.1 через интерфейс eth0 (default via 192.168.12.1 dev eth0). Кстати, при отправке пакетов на шлюз, IP-адрес назначения не изменяется, просто в Ethernet-фрейме в качестве MAC-адреса получателя будет указан MAC-адрес шлюза (часто даже специалисты со стажем путаются в этом моменте). Шлюз в свою очередь меняет IP-адрес отправителя, если используется NAT, либо просто отправляет пакет дальше. В данном случае используются приватный адрес (192.168.12.101), так что шлюз скорее всего делает NAT.

А теперь залезем в роутинг поглубже. На самом деле, таблиц маршрутизации несколько, а также можно создавать свои таблицы маршрутизации. Изначально предопределены таблицы local, main и default. В таблицу local ядро заносит записи для локальных IP адресов (чтобы трафик на эти IP-адреса оставался локальным и не пытался уходить во внешнюю сеть), а также для бродкастов. Таблица main является основной и именно она используется, если в команде не указано какую таблицу использовать (т.е. выше мы видели именно таблицу main). Таблица default изначально пуста. Давайте бегло взглянем на содержимое таблицы local:

# ip route show table local broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 broadcast 192.168.12.255 dev eth0  proto kernel  scope link  src 192.168.12.101 broadcast 192.168.12.0 dev eth0  proto kernel  scope link  src 192.168.12.101 local 192.168.12.101 dev eth0  proto kernel  scope host  src 192.168.12.101 broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1

broadcast и local определяют типы записей (выше мы рассматривали тип default). Тип broadcast означает, что пакеты соответствующие этой записи будут отправлены как broadcast-пакеты, в соответствии с настройками интерфейса. local – пакеты будут отправлены локально. scope host указывает, что эта запись действительная только для этого хоста.

Для просмотра содержимого конкретной таблицы используется команда ip route show table TABLE_NAME. Для просмотра содержимого всех таблиц в качестве TABLE_NAME следует указывать all, unspec или 0. Все таблицы на самом деле имеют цифровые идентификаторы, их символьные имена задаются в файле /etc/iproute2/rt_tables и используются лишь для удобства.

ip rule

Как же ядро выбирает, в какую таблицу отправлять пакеты? Все логично – для этого есть правила. В нашем случае:

# ip rule 0: from all lookup local 32766: from all lookup main 32767: from all lookup default

Число в начале строки – идентификатор правила, from all – условие, означает пакеты с любых адресов, lookup указывает в какую таблицу направлять пакет. Если пакет подпадает под несколько правил, то он проходит их все по порядку возрастания идентификатора. Конечно, если пакет подпадет под какую-либо запись маршрутизации, то последующие записи маршрутизации и последующие правила он уже проходить не будет.

Возможные условия:

  • from – мы уже рассматривали выше, это проверка отправителя пакета.
  • to – получатель пакета.
  • iif – имя интерфейса, на который пришел пакет.
  • oif – имя интерфейса, с которого уходит пакет. Это условие действует только для пакетов, исходящих из локальных сокетов, привязанных к конкретному интерфейсу.
  • tos – значение поля TOS IP-пакета.
  • fwmark – проверка значения FWMARK пакета. Это условие дает потрясающую гибкость правил. При помощи правил iptables можно отфильтровать пакеты по огромному количеству признаков и установить определенные значения FWMARK. А затем эти значения учитывать при роутинге.

Условия можно комбинировать, например from 192.168.1.0/24 to 10.0.0.0/8, а также можно использовать префикc not, который указывает, что пакет не должен соответствовать условию, чтобы подпадать под это правило.

Итак, мы разобрались что такое таблицы маршрутизации и правила маршрутизации. А создание собственных таблиц и правил маршрутизации это и есть policy-routing, он же PBR (policy based routing). Кстати SBR (source based routing) или source-routing в Linux является частным случаем policy-routing, это использование условия from в правиле маршрутизации.

Простой пример

Теперь рассмотрим простой пример. У нас есть некий шлюз, на него приходят пакеты с IP 192.168.1.20. Пакеты с этого IP нужно отправлять на шлюз 10.1.0.1. Чтобы это реализовать делаем следующее:

Создаем таблицу с единственным правилом:

# ip route add default via 10.1.0.1 table 120

Создаем правило, отправляющее нужные пакеты в нужную таблицу:

# ip rule add from 192.168.1.20 table 120

Как видите, все просто.

Доступность сервера через несколько аплинков

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

В качестве маршрута по умолчанию используется один из провайдеров, не важно какой. При этом веб-сервер будет доступен только через сеть этого провайдера. Запросы через сеть другого провайдера приходить будут, но ответные пакеты будут уходить на шлюз по умолчанию и ничего из этого не выйдет.

Решается это весьма просто:

Определяем таблицы:

# ip route add default via 11.22.33.1 table 101 # ip route add default via 55.66.77.1 table 102

Определяем правила:

# ip rule add from 11.22.33.44 table 101 # ip rule add from 55.66.77.88 table 102

Думаю теперь уже объяснять смысл этих строк не надо. Аналогичным образом можно сделать доступность сервера по более чем двум аплинкам.

Балансировка трафика между аплинками

Делается одной элегантной командой:

# ip route replace default scope global \ nexthop via 11.22.33.1 dev eth0 weight 1 \ nexthop via 55.66.77.1 dev eth2 weight 1

Эта запись заменит существующий default-роутинг в таблице main. При этом маршрут будет выбираться в зависимости от веса шлюза (weight). Например, при указании весов 7 и 3, через первый шлюз будет уходить 70% соединений, а через второй – 30%. Есть один момент, который при этом надо учитывать: ядро кэширует маршруты, и маршрут для какого-либо хоста через определенный шлюз будет висеть в таблице еще некоторое время после последнего обращения к этой записи. А маршрут до часто используемых хостов может не успевать сбрасываться и будет все время обновляться в кэше, оставаясь на одном и том же шлюзе. Если это проблема, то можно иногда очищать кэш вручную командой ip route flush cache.

Использование маркировки пакетов при помощи iptables

Допустим нам нужно, чтобы пакеты на 80 порт уходили только через 11.22.33.1. Для этого делаем следующее:

# iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 80 -j MARK --set-mark 0x2 # ip route add default via 11.22.33.1 dev eth0 table 102 # ip rule add fwmark 0x2/0x2 lookup 102

Первой командой маркируем все пакеты, идущие на 80 порт. Второй командой создаем таблицу маршрутизации. Третьей командой заворачиваем все пакеты с указанной маркировкой в нужную таблицу.

Опять же все просто. Рассмотрим также использование модуля iptables CONNMARK. Он позволяет отслеживать и маркировать все пакеты, относящиеся к определенному соединению. Например, можно маркировать пакеты по определенному признаку еще в цепочке INPUT, а затем автоматически маркировать пакеты, относящиеся к этим соединениям и в цепочке OUTPUT. Используется он так:

# iptables -t mangle -A INPUT -i eth0 -j CONNMARK --set-mark 0x2 # iptables -t mangle -A INPUT -i eth2 -j CONNMARK --set-mark 0x4 # iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark

Пакеты, приходящие с eth0 маркируются 2, а с eth2 – 4 (строки 1 и 2). Правило на третьей строке проверяет принадлежность пакета к тому или иному соединению и восстанавливает маркировки (которые были заданы для входящих) для исходящих пакетов.

Надеюсь изложенный материал поможет вам оценить всю гибкость роутинга в Linux. Спасибо за внимание :)

blog.peter23.com

Настройка и управление сетевой подсистемой Linux (пакет iproute2) -Блог любителя экспериментов

Доброго времени, уважаемые гости и читатели Блога любителя экспериментов. Сегодня хочу затронуть такой вопрос, как управление сетевой подсистемой Linux с помощью программ из пакета iproute2. Для понимания того, о чем здесь пойдет речь обязательно необходимо ознакомиться со статьями Основные понятия сетей и Настройка сети в Linux, диагностика и мониторинг. Начну с небольшой предыстории...

Думаю, очень к месту будет напомнить о модели OSI, ибо с ней (с моделью OSI) в статье будет тесное взаимодействие. Поэтому привожу картинки из статьи. В Linux статическая конфигурация сети настраивается с помощью конфигурационных файлов. Данный способ настройки я рассматривал в статье Настройка сети в Linux, диагностика и мониторинг.

В старых версиях ядер Linux (2.4 и ниже) существовали инструменты настройки сети из пакета net-tools, которые включали в себя такие команды, как ifconfig - для управления сетевыми интерфейсами, route - управление таблицей маршрутизации, arp - управление таблицей разрешения имен, netstat - сетевая статистика, mii-tool - статус сетевых устройств и др. В дистрибутивах, использующих современные ядра внедряется пакет iproute2 (иногда называется iproute) и net-tools оставлен, как некоторые утверждают, для совместимости. В пакет iproute входят 3 основных утилиты: ip - команда для просмотра параметров и настройки сетевых интерфейсов, IP-адресов, таблиц маршрутизации, правил маршрутизации, таблиц ARP преобразования, IP-туннелей и т.д. tc (traffic control) - команда для просмотра и настройки параметров управления трафиком (классификация трафика, дисциплины управления очереди для различных классов трафика), ss - команда для просмотра текущих соединений и открытых портов (аналог netstat).

Управление сетевыми интерфейсами в Linux

Сетевые интерфейсы в линух представляют собой физические устройства, которые взаимодействуют с ядром, а деле и с пользователем через соответствующий драйвер (например Ethernet-драйвера именуют интерфейсы как eth0, eth2 ...). Чтобы сетевой интерфейс функционировал, на нем нужно задать настройки какого-либо протокола сетевого уровня (IP, IPX или др.). В современных сетях используется протокол IP. Для управления сетью используется команда ip. Давайте рассмотрим общие параметры команды ip, данные параметры отлично иллюстрирует википедия:

Настройка параметров сетевых интерфейсов

Давайте разберем некоторые аспекты данных команд. Начнем с аналога команды ifconfig - команда ip с параметром link управляет свойствами сетевого интерфейса: 

[proxy ~]# ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:1d:72:01:ab:93 brd ff:ff:ff:ff:ff:ff 3: irda0: <NOARP> mtu 2048 qdisc noop state DOWN qlen 8 link/irda 00:00:00:00 brd ff:ff:ff:ff 4: vboxnet0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 0a:00:27:00:00:00 brd ff:ff:ff:ff:ff:ff 5: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UNKNOWN qlen 3 link/ppp

Вывод данной команды содержит пронумерованный список интерфейсов, присутствующих в системе. Информация об интерфейсе содержит две строки: в первой указывается имя интерфейса (lo, eth0 и др.), установленные флаги состояния (в фигурных скобках < и >), MTU (Maximum Transmission Unit, максимально допустимый размер фрейма в байтах), тип и размер очереди фреймов; во второй строке — тип соединения, MAC-адрес, широковещательный адрес и т. п.

Некоторые флаги состояния:

  • UP — устройство подключено и готово принимать и отправлять фреймы;
  • LOOPBACK — интерфейс является локальным и не может взаимодействовать с другими узлами в сети;
  • BROADCAST - устройство способно отправлять широковещательные фреймы;
  • POINTTOPOINT — соединение типа "точка-точка"
  • PROMISC — устройство находится в режиме "прослушивания" и принимает все фреймы.
  • NOARP — отключена поддержка разрешения имен сетевого уровня.
  • ALLMULTI — устройство принимает все групповые пакеты.
  • NO-CARRIER — нет связи (не подключен кабель).
  • DOWN — устройство отключено.

Можно также вывести информацию о выбранном интерфейсе, задав его имя в параметре dev:

[proxy ~]# ip link show dev eth0

или просто:

[proxy ~]# ip link show eth0

Команда ip link также позволяет изменять свойства сетевого интерфейса. Для этого используется параметр set:

iproute:~# ip link show dev eth3 3: eth3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000 link/ether 08:00:27:c9:00:f0 brd ff:ff:ff:ff:ff:ff iproute:~# # установка значения MTU iproute:~# ip link set mtu 1400 eth3 iproute:~# # установка MAC адреса iproute:~# ip link set address 00:11:11:12:FE:09 eth3 iproute:~# # "поднятие" интерфейса iproute:~# ip link set up eth3 iproute:~# ip link show dev eth3 3: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP qlen 1000 link/ether 00:11:11:12:fe:09 brd ff:ff:ff:ff:ff:ff iproute:~# # отключение интерфейса iproute:~# ip link set down eth3 iproute:~# ip link show dev eth3 3: eth3: <BROADCAST,MULTICAST> mtu 1400 qdisc pfifo_fast state DOWN qlen 1000 link/ether 00:11:11:12:fe:09 brd ff:ff:ff:ff:ff:ff

Указанные тут команды являются аналогами "классических" команд из пакета  net-tools:

# ifconfig eth3 mtu 1400 # ifconfig eth3 hw ether 00:11:12:13:14:15 # ifconfig eth3 up # ifconfig eth3 down

Управление физическими параметрами интерфейса

Физические параметры (скорость, технология Ethernet, тип дуплекса) сетевого подключения зависят от используемого оборудования и обычно настраиваются автоматически при подключении компьютера к сети. Но иногда из- за несогласованной работы оборудования и драйверов адаптера параметры необходимо выставить вручную, используя утилиту ethtool. Данная утилита включена в стандартные репозитории Debian и устанавливается из пакетного менеджера. Пример использования утилиты:

iproute:~# ethtool eth3 Settings for eth3: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised pause frame use: No Advertised auto-negotiation: Yes Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 0 Transceiver: internal Auto-negotiation: on MDI-X: Unknown Supports Wake-on: umbg Wake-on: d Current message level: 0x00000007 (7) Link detected: no iproute:~# ethtool -i eth3 driver: e1000 version: 7.3.21-k5-NAPI firmware-version: N/A bus-info: 0000:00:08.0

Настройка  параметров сетевых протоколов на физическом интерфейсе

Напомню, что протокол IP является маршрутизируемым протоколом без установления соединения. IP адрес представляет собой комбинацию номера сети и номера узла в данной сети. Количество бит, используемых для номера сети определяется по классу адреса или задается маской подсети. Итого, как я уже говорил, чтобы сетевой интерфейс начал функционировать в соответствии со своим прямым назначением, необходимо на нем задать параметры соответствующего сетевого протокола. Для протокола IP минимально необходимые параметры - это IP адрес и маска подсети. Для настройки параметров протокола IP на сетевом интерфейсе с помощью командной строки необходимо использовать команду ip address (она же ip addr).

user@nout:~$ ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:25:d3:3f:3e:87 brd ff:ff:ff:ff:ff:ff inet 192.168.1.148/24 brd 192.168.1.255 scope global wlan0 inet6 fe80::225:d3ff:fe3f:3e87/64 scope link valid_lft forever preferred_lft forever

Параметр show отображает текущую конфигурацию. Каждая запись о сетевом адресе может содержать информацию о типе адреса (inet — адрес IPv4, inet6 — IPv6 и т. д.), непосредственно адрес, маску подсети (количество сетевых бит), широковещательный адрес данной сети, область видимости (scope global — действителен везде, scope link — только для данного устройства, scope host — для данного узла, доступные области приведены в /etc/iproute2/rt_scopes) и имя логического интерфейса.

user@nout:~$ # добавление адреса выполняется параметром add user@nout:~$ # при этом необходимо задать широковещательный адреc user@nout:~$ # (параметр brd + задает автоматический рассчет широковещательного адреса) user@nout:~$ # данная операция требует прав суперпользователя user@nout:~$ ip address add 192.168.1.3/25 brd + dev eth0 RTNETLINK answers: Operation not permitted user@nout:~$ sudo -s [sudo] password for user: nout:~# ip address add 192.168.1.3/25 brd + dev eth0 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff inet 192.168.1.3/25 brd 192.168.1.127 scope global eth0 nout:~# # удаление адреса производится параметром del nout:~# ip address del 192.168.1.3/25 dev eth0 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff

C помощью ip можно задать несколько IP адресов на одном интерфейсе:

nout:~# ip address add 192.168.1.11/25 brd + dev eth0 nout:~# ip address add 192.168.1.12/25 brd + dev eth0 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff inet 192.168.1.11/25 brd 192.168.1.127 scope global eth0 inet 192.168.1.12/25 brd 192.168.1.127 scope global secondary eth0 nout:~# ip address del 192.168.1.11/25 dev eth0 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff nout:~# ip address add 192.168.1.12/25 brd + dev eth0 nout:~# ip address add 192.168.1.212/25 brd + dev eth0 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff inet 192.168.1.12/25 brd 192.168.1.127 scope global eth0 inet 192.168.1.212/25 brd 192.168.1.255 scope global eth0

При добавлении адреса из той же сети, что и существующий, новый адрес становится дополнительным к существующему (secondary), и если удалить основной адрес, то будет удален и дополнительный. При этом, команда ifconfig не умеет отображать второй Ip:

nout:~# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 90:e6:ba:2f:c1:d4 inet addr:192.168.1.12 Bcast:192.168.1.127 Mask:255.255.255.128 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:1 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:43

Возможно создать ifconfig - совместимую реализацию способа использования нескольких IP-адресов на одном сетевом интерфейсе. Для этого следует в команде ip addr add использовать параметр label:

nout:~# ip address add 192.168.12.212/25 brd + dev eth0 label eth0:newdev nout:~# ifconfig eth0 Link encap:Ethernet HWaddr 90:e6:ba:2f:c1:d4 inet addr:192.168.1.12 Bcast:192.168.1.127 Mask:255.255.255.128 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:1 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:43 eth0:newdev Link encap:Ethernet HWaddr 90:e6:ba:2f:c1:d4 inet addr:192.168.12.212 Bcast:192.168.12.255 Mask:255.255.255.128 UP BROADCAST MULTICAST MTU:1500 Metric:1 Interrupt:43 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff inet 192.168.1.12/25 brd 192.168.1.127 scope global eth0 inet 192.168.1.212/25 brd 192.168.1.255 scope global eth0 inet 192.168.12.212/25 brd 192.168.12.255 scope global eth0:newdev nout:~# ip address flush dev eth0 nout:~# ip address show dev eth0 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000 link/ether 90:e6:ba:2f:c1:d4 brd ff:ff:ff:ff:ff:ff

Как видно, параметр flush очищает все установленные на интерфейсе IP адреса.

Управление ARP-таблицей

В локальной сети текущий хост для определения физических адресов (MAC-адресов) по IP-адресам удаленных узлов использует протокол ARP и локальный ARP -кэш (ARP-таблицу). Управление ARP-таблицей осуществляется командой ip neigh. Каждый узел локальной сети (в том числе и хабы/свичи) содержат свою локальную ARP-таблицу (кэш), которая устанавливает соответствие между IP и MAC-адресами узлов подсетей, в которые входит данную сеть. В ARP-таблице имеются два вида записей:

  • Динамические записи, которые периодически обновляются с использованием протокола ARP (если запись "устаревает", то она удаляется).
  • Статические записи, которые создаются пользователем с помощью соответствующих команд и существуют до тех пор, пока текущий узел не будет выключен/перезагружен.
nout:~# # отображение содержимого таблицы ARP nout:~# ip neigh show 192.168.1.1 dev wlan0 lladdr bc:ae:c5:c3:c9:31 REACHABLE nout:~# # добавление статической записи в ARP таблицу nout:~# ip neigh add 192.168.1.100 lladdr 00:00:00:11:00:22 dev wlan0 nout:~# ip neigh show 192.168.1.100 dev wlan0 lladdr 00:00:00:11:00:22 PERMANENT 192.168.1.1 dev wlan0 lladdr bc:ae:c5:c3:c9:31 REACHABLE nout:~# # удаление записи nout:~# ip neigh del 192.168.1.100 dev wlan0 nout:~# ip neigh show 192.168.1.1 dev wlan0 lladdr bc:ae:c5:c3:c9:31 REACHABLE

Управление маршрутизацией с помощью iproute2

Из статьи Основные понятия сетей мы знаем, что если текущему узлу необходимо куда-либо отправить IP пакет, то сетевая подсистема ядра использует таблицу маршрутизации. Если пакет отправляется в ту же подсеть, которой принадлежит хост, то с помощью ARP определяется физический адрес хоста назначения и пакет отправляется напрямую хосту назначения. Если адрес назначения принадлежит не "локальной сети", то пакет отправляется на шлюз (читай - направляется по маршруту), который указан в таблице маршрутизации для сети, которой принадлежит хост назначения. При этом, выбирается та сеть, в которой адрес сети наиболее заполнен (читай - меньше хостов в подсети). Если для хоста назначения не найден маршрут, то пакет отправляется на "шлюз по умолчанию". Все шлюзы должны находиться в той же подсети, что и исходный хост.

Допустим, в локальной сети есть некоторый хост с адресом 192.168.1.100/24, а так же есть хост 192.168.1.1, который является шлюзом в глобальную сеть, а так же есть хост с адресом 192.168.1.2, который является связующим маршрутизатором с сетью 192.168.24.0/24 (то есть имеет еще один интерфейс  в сеть 192.168.24.0/24 и на нем включен форвардинг). Для того, чтобы хост с адресом 192.168.1.100/24 имел доступ в сеть Интернет и к локальной сети 192.168.24.0/24, необходимо внести в таблицу маршрутизации соответствующие записи, например с помощью команды ip route add:

# ip route add default via 192.168.1.1 # ip route add 192.168.24.0/24 via 192.168.1.2 # ip route show 192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.100 192.168.24.0/24 via 192.168.1.2 dev eth2 default via 192.168.1.1 dev eth

Первая команда добавляет маршрут по умолчанию (default) через узел 192.168.1.1 (параметр via ). Вторая команда устанавливает маршрут на сеть 192.168.24.0/24 через узел 192.168.1.2.

Для вывода на экран содержимого таблицы маршрутизации используется команда ip route show. В данном случае в таблице маршрутизации три записи: первая о том, что сеть 192.168.1.0/24 доступна непосредственно на интерфейсе eth2 (запись добавляется автоматически), и две записи, добавленные пользователем: альтернативный маршрут и маршрут по умолчанию.

Добавление постоянного статического маршрута при инициализации сети

О настройке сети через конфигурационные файлы я рассказывал в статье  Настройка сети в Linux, диагностика и мониторинг, в сегодняшней статье я немного дополню эту информацию. С помощью файла /etc/network/interfaces есть возможность задать постоянные маршрута при поднятии интерфейса и удаление маршрута при выключении интерфейса. Это делается с помощью параметра up и down соответственно. Нижеприведенная конфигурация позволяет задать маршрут до сети 192.168.100.0/24 через шлюз 192.168.1.1:

iface eth2 inet static address 192.168.1.100 netmask 255.255.255.0 up ip route add 192.168.100.0/24 via 192.168.1.1 down ip route del 192.168.100.0/24 gateway 192.168.1.3

Выводы

На этом, данную заметку заканчиваю. Подведу краткие итоги. Для управления физическими интерфейсами применяется команда ip link из пакета iproute. Для настройки свойств физического подключения (скорость, технология, тип дуплекса используется команда ethtool. Для того, чтобы хост мог взаимодействовать с другими узлами подсети в рамках локального сегмента (широковещательного домена) на нем должен быть установлен IP-адрес и определена маска подсети. Для управления IP-адресами в Linux можно использовать команду ip addr. В локальной сети данный узел для определения физических адресов(MAC) по IP - адресам других узлов использует протокол ARP и локальный ARP -кэш (таблица). Управление ARP -таблицей осуществляется командой ip neigh. Для взаимодействия с удаленными подсетями на данном узле необходимо определить шлюз по умолчанию или/и альтернативные шлюзы. Все шлюзы должны находиться в той же подсети, что и исходный узел. Управление таблицей маршрутизации на узле может осуществляться командой ip route. У параметров команд пакета iproute2 есть сокращенный синтаксис, например, ip link show eth0 можно записать как ip l sh eth0.

Что почитать

man ipman interfacesLinux Advanced Routing & Traffic Control HOWTO

С Уважением, Mc.Sim!

Другие материалы в категории Сети
Теги: Debian, ip, iproute, Linux, network, основы

www.k-max.name

ip route

ip route

Для добавления записи в таблицу маршрутизации используйте команду  ip  route. Для удаления маршрута используется  no-форма команды.

Для маршрутизаторов ESR-ST эта команда не используется.

 

Синтаксис                      ip route prefix mask {gw-ip-addr | interface-name} [distance] [permanent]

                    no ip route prefix mask { gw-ip-addr | interface-name } [distance] [permanent]

                   no  ip  route  prefix  mask 

 

prefix                            старшая общая часть IP-адресов, до которой прописывается маршрут. Для задания маршрута, который будет использоваться по умолчанию, IP-адрес должен быть равен 0.0.0.0

mask                                маска хоста или подсети, до которой прописывается маршрут. Для задания маршрута, который будет использоваться по умолчанию, маска подсети должна быть равна 0.0.0.0

gw-ip-addr                  IP-адрес шлюза, через который прописывается маршрут

interface-name      имя сетевого интерфейса. Сетевой интерфейс должен точно соответствовать конкретному системному интерфейсу. Использование интерфейсов, заданных в файле ifaliases.cf с помощью перечислений или шаблонов не допускается

distance                        административная дистанция (метрика) имеет разный смысл в разных ОС и в данной команде будет проигнорирована. Поэтому, использовать ее не рекомендуется

permanent           обозначение постоянного маршрута. Параметр запоминается и показывается по show running-config, однако реально не используется. Присутствует для совместимости с продуктами управления Cisco.

 

Недопустимо указывать одновременно параметры интерфейса и IP-адрес шлюза, через который прописывается маршрут.

Маршрут по умолчанию – маршрут, по которому будет отправлен пакет, если IP-адрес назначения, указанный в заголовке пакета, не совпадает ни с одним адресом назначения в таблице маршрутизации.

 

Значение по умолчанию                    отсутствует

 

Режимы команды                               Global configuration

 

Рекомендации по использованию

Используйте эту команду для добавления записи в таблицу маршрутизации. Реальное добавление маршрута осуществляется при прогрузке сконвертированной Native-конфигурации.

Повторное добавление существующего маршрута не считается ошибкой (поведение, аналогичное Cisco IOS).

Используемые ОС налагают требование, чтобы шлюз, через который прописывается маршрут, был доступен с сетевого интерфейса устройства.

Параметр distance игнорируется. При добавлении маршрута выставляется системная метрика, аналогичная той, которая выставляется по умолчанию при добавлении маршрута с помощью команды ОС route  add. Но по команде show  ip  route для данного маршрута будет показано значение distance, равное 1.

 

Удаление 

Команда может быть введена только с консоли

Удаление единичного маршрута:

no ip route prefix mask { gw-ip-addr | interface-name } [distance] [permanent]

Параметры distance и permanent игнорируются. Остальные параметры должны точно соответствовать параметрам, которые выдаются по show running-config.

 

Удаление маршрутов по адресной информации:

no  ip  route  prefix  mask 

 

Отличие данной команды от подобной команды Cisco  IOS 

·       В команде необходимо прописывать маршрут через шлюз, который является доступным с сетевого интерфейса.

·       В консоли параметром, связанным с метрикой является distance, а в Cisco IOS – параметр administrative distance.

·       Параметр distance игнорируется.

·       Отсутствует команда clear ip route для удаления маршрута из системной таблицы маршрутизации.

 

Пример

Router(config)#ip route 10.10.10.1 255.255.255.255 10.2.2.1

 

Возможные сообщения об ошибках приведены в таблице.

Таблица 12

Сообщение

Пояснение

%No matching route to delete

В команде no ip route задан маршрут, отсутствующий в конфигурации.

Сообщение, аналогичное Cisco IOS.

%Inconsistent address and mask

Один из двух случаев:

Задан некорректный параметр <mask> (например, 255.0.255.0).

Значения <prefix> и <mask> не соответствуют друг другу (например, 192.168.10.10 255.255.255.0).

Сообщение, аналогичное Cisco IOS.

Ниже в данной таблице приведены сообщения, специфичные для cs_console.

% The network interface must exactly correspond to a system network interface

Попытка прописать маршрут через сетевой интерфейс, заданный в файле ifaliases.cf с помощью шаблона или списка значений.

doc.s-terra.ru

Команды настройки IP-маршрутизации



Обратная связь

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение

Как определить диапазон голоса - ваш вокал

Как цель узнает о ваших желаниях прежде, чем вы начнете действовать. Как компании прогнозируют привычки и манипулируют ими

Целительная привычка

Как самому избавиться от обидчивости

Противоречивые взгляды на качества, присущие мужчинам

Тренинг уверенности в себе

Вкуснейший "Салат из свеклы с чесноком"

Натюрморт и его изобразительные возможности

Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.

Как научиться брать на себя ответственность

Зачем нужны границы в отношениях с детьми?

Световозвращающие элементы на детской одежде

Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия

Как слышать голос Бога

Классификация ожирения по ИМТ (ВОЗ)

Глава 3. Завет мужчины с женщиной

Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.

Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу.

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

Чтобы включить IP-маршрутизацию, используется команды глобальной конфигурации ip routing. По умолчанию в маршрутизаторах IP-маршрутизация включена.

 

router(config)#ip routing

// Включение IP-маршрутизации

 

После включения IP-маршрутизации создается таблица маршрутизации, используемая для коммутации пакетов. По умолчанию в таблицу заносятся данные всех интерфейсов маршрутизатора, находящиеся в рабочем состоянии.

Для просмотра таблицы маршрутизации используется команда show ip route. После её ввода на экран выводится вся информация, содержащаяся в таблице маршрутизации.

 

router#show ip routes

Codes: K - kernel route, C - connected, S - static, R - RIP,

> - selected route, * - FIB route

 

 

C>* 127.0.0.1/32 is directly connected, Loopback0

C>* 192.168.4.0/24 is directly connected, BVI1

 

Первый раздел выводимой информации содержит комментарий к первому столбцу таблицы маршрутизации, в котором отображается источник маршрута. Далее выводятся маршруты, которые имеют следующий формат:

[Тип маршрута {Флаг «активный»}] [Адрес сети назначения] {Административная дистанция / Метрика}] [Тип доступности] {Интерфейс через доступна данная сеть}

 

Описание полей таблицы маршрутизации приведено в

Поле Описание
Тип маршрута C – источником маршрута является интерфейс маршрутизатора. S – источником маршрута является статическая запись. R – источником маршрута является протокол маршрутизации RIP.
Флаг «активный» (символом “>”) Данный маршрут является действующим. При наличии нескольких одинаковых маршрутов активным становится маршрут с наименьшей административной дистанцией.
Административная дистанция / Метрика Для статических маршрутов и маршрутов, полученных с помощью протоколов маршрутизации, в таблице маршрутизации отображается их административная дистанция и метрика.
Адрес сети / Длина маски Адрес сети назначения с указанием длины маски.
Тип доступности Существует два типа доступности: is directly connected – сеть непосредственно подключена к маршрутизатору via IP-адрес – сеть доступная через другой сетевой узел с данным IP-адресом.
Интерфейс, через который доступна данная сеть Для сетей, непосредственно подключенных к маршрутизатору, отображается интерфейс, через который эта сеть доступна.

 

Настройка статической маршрутизации

Настройка статических маршрутов выполняется с помощью команды ip route {nework} {mask} {address | interface} [distance]. Описание параметров приведено в табл.

 

Параметр Описание
network IP-адрес сети или узла.
mask Маска сети.
address IP-адрес следующего маршрутизатора
interface Интерфейс, которым надо воспользоваться, чтобы попасть в пункт назначения.
distance Административная дистанция.

 

router(config)#ip route 192.168.1.0/24 192.168.5.1

// Настройка статического маршрута в сеть 192.168.1.0 с маской 255.255.255.0. Сеть доступна через другой сетевой узел с IP-адресом 192.168.5.1.

 

router(config)#ip route 192.168.2.0/24 192.168.11.2 1

router(config)#ip route 192.168.2.0/24 192.168.16.10 2

// Настройка двух статических маршрутов в сеть 192.168.2.0 с маской 255.255.255.0 с разными административными дистанциями, основного и резервного. Сетевой узел с IP-адресом 192.168.11.2 имеет административную дистанцию 1, а с IP-адресом 192.168.16.10 – 2. Если сетевой узел с IP-адресом 192.168.11.2 будет не доступен, то данные будут передаваться через резервный маршрут.

 

Настройка протокола RIP

Для входа в режим настройки параметров протокола RIP необходимо выполнить команду router rip.

 

router(config)#router rip

// Вход в режим настройки параметров протокола RIP

 

Определение списка интерфейсов и сетевых адресов, через которые необходимо рассылать маршрутную информацию протокола RIP, используется команда network {network-number | interface {interface-type} {interface-number}}.

Параметр network-number используется в случае, если необходимо определить сразу несколько интерфейсов для рассылки маршрутной информации. Если IP-адрес интерфейса входит в сеть, указанную при вводе команду network, то он будет включён в список. Например, маршрутизатор имеет три интерфейса с IP-адресами 192.168.10.0, 192.168.11.0 и 172.16.2.0. В этом случае после ввода команды network 192.168.0.0 в список интерфейсов, через которые будет рассылаться маршрутная информация, будут включены интерфейсы с IP-адресами 192.168.10.0 и 192.168.11.0. Чтобы включить в список интерфейс с IP-адресом 172.16.2.0 необходимо дополнительно выполнить команду network 172.16.2.0.

 

router(config-router)#network 10.0.0.0

// Включение в список интерфейсов, IP-адреса которых входят в состав сети 10.0.0.0 с маской 255.0.0.0.

 

router(config-router)#network interface serial 1/0

router(config-router)#network interface serial 1/1

router(config-router)#network interface ethernet 0

// Включение в список интерфейсов Serial 1/0, Serial 1/1 и Ethernet 0.

 

По умолчанию маршрутизатор включает в рассылаемую информацию статические маршруты и маршруты, полученные с помощью протокола RIP. Информация о подключенных к нему сетях не рассылается. Чтобы включить рассылку информации о подключенных к маршутизатору сетях необходимо выполнить команду redistribute connected.

 

router(config-router)#redistribute connected

// Включение в рассылаемые сообщения информации о подключенных к маршрутизатору сетях.

Практическая часть

  1. Настройте статическую маршрутизацию до всех сетей.
  2. Проверьте доступность компьютеров, находящихся в других сетях.
  3. Настройте резервные статические маршруты до всех сетей.
  4. С помощью преподавателя проверьте работу резервного маршрута.
  5. Настройте динамическую маршрутизацию с помощью протокола RIP.
  6. Проверьте доступность компьютеров, находящихся в других сетях.
  7. С помощью преподавателя проверьте автоматический переход протокола маршрутизации на резервный маршрут.

Контрольные вопросы

  1. Чем отличаются маршрутизируемые протоколы от протоколов маршрутизации?
  2. Что такое маршрутизация?
  3. Типы алгоритмов машрутизации?
  4. Что такое административная дистанция?
  5. Основные характеристики протокола RIP?
  6. Недостатки и преимущества динамической маршрутизации?
  7. Что такое сходимость?

megapredmet.ru