Выбрать главу

Удалим адрес компьютера espa043 из кэша:

[root@espa041 /home/src/iputils]# ip neigh delete 9.3.76.43 dev eth0

[root@espa041 /home/src/iputils]# ip neigh show

9.3.76.43 dev eth0 nud failed

9.3.76.42 dev eth0 lladdr 00:60:08:3f:e9:f9 nud reachable

9.3.76.1 dev eth0 lladdr 00:06:29:21:73:c8 nud stale

Теперь espa041 "забыл" адрес компьютера espa043. Если espa041 опять "захочет" что-то сообщить espa043, он будет вынужден вновь послать ARP-запрос. В этом листинге также видно, что в записи для espagate (9.3.76.1), состояние reachable (доступно) изменилось на stale (устарело). Это означает, что ethernet-адрес все еще является допустимым, но он должен быть подтвержден при первой же попытке обмена.

Глава 4. Правила — база политик маршрутизации

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

Если вы хотите использовать эту возможность, убедитесь что ядро собрано с поддержкой "IP: advanced router" и "IP: policy routing".

Когда ядру необходимо выбрать маршрут, оно определяет в соответствии с какой таблицей это нужно делать. По-умолчанию, определены три таблицы. Старая утилита route изменяет таблицы main и local, как и утилита ip (по-умолчанию).

Правила по-умолчанию:

[ahu@home ahu]$ ip rule list

0:     from all lookup local

32766: from all lookup main

32767: from all lookup default

В этом листинге приведены приоритеты всех правил. Мы видим, что правила применяются ко всем пакетам (from all). Мы уже видели таблицу 'main', она выводится командой ip route ls , но таблицы 'local' и 'default' для нас новые.

Если мы хотим сделать что-то интересное, то нужно задать правила, использующие разные таблицы маршрутизации. Это позволит нам переопределить общесистемную таблицу маршрутизации.

За точной семантикой происходящего в ядре, когда есть несколько подходящих правил, обратитесь к документации ip-cref Алексея Кузнецова.

4.1. Простая маршрутизация по источнику.

Давайте опять рассмотрим реальный пример. У меня есть 2 (вообще-то 3, пора бы вернуть их) кабельных модема, подключенных к маршрутизатору Linux с NAT ('masquerading'). Люди с которыми я живу в одном доме, платят мне за использование Internet. Допустим одни из моих соседей ходит только на hotmail и хочет платить меньше. Мне это подходит, но при этом будет использоваться медленный канал.

Быстрое соединение имеет с моей стороны адрес 212.64.94.251, а с другой — 212.64.94.1. Медленное соединение получает динамический адрес, в данном примере это 212.64.78.148, адрес провайдера — 195.96.98.253.

Таблица locaclass="underline"

[ahu@home ahu]$ ip route list table local

broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1

local 10.0.0.1 dev eth0 proto kernel scope host src 10.0.0.1

broadcast 10.0.0.0 dev eth0 proto kernel scope link src 10.0.0.1

local 212.64.94.251 dev ppp0 proto kernel scope host src 212.64.94.251

broadcast 10.255.255.255 dev eth0 proto kernel scope link src 10.0.0.1

broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1

local 212.64.78.148 dev ppp2 proto kernel scope host src 212.64.78.148

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

Много очевидных вещей, но они должны быть где-то указаны. Вот здесь они и заданы. Таблица default — пустая.

Посмотрим теперь на таблицу main:

[ahu@home ahu]$ ip route list table main

195.96.98.253 dev ppp2 proto kernel scope link src

212.64.78.148 212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.251

10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1

127.0.0.0/8 dev lo scope link default via 212.64.94.1 dev ppp0

Создадим новое правило для нашего гипотетического соседа, которое будет называться 'John'. Хотя мы можем работать просто с числами, намного проще и понятней если мы определим названия наших таблиц в файле /etc/iproute2/rt_tables.

# echo 200 John >> /etc/iproute2/rt_tables

# ip rule add from 10.0.0.10 table John

# ip rule ls

0:     from all lookup local

32765: from 10.0.0.10 lookup John

32766: from all lookup main

32767: from all lookup default

Теперь нам нужно лишь сгенерировать таблицу John и очистить кэш маршрутов:

# ip route add default via 195.96.98.253 dev ppp2 table John

# ip route flush cache

Вот и все. В качестве упражнения вы можете добавить это в скрипт ip-up.

4.2. Маршрутизация через несколько каналов/провайдеров.

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

                                                                 _______

                                          +------------+        /

                                          |            |       |

                            +-------------+ Провайдер 1+-------