О маркировке пакетов мы уже поговорили, давайте поговорим о маршрутизации. А если совсем точно, о её восстановлении при перезагрузке системы. И не только перезагрузке. И не только восстановлении, но и изменении.
Поскольку в Linux, в отличие от Windows, ничего из ниоткуда не берётся, для установки правил маршрутизации у нас есть[…такой вот скрипт…]…такой вот скрипт… #!/bin/sh
# @params GW [ TABLE(="default") [ FWMARK_in_hex ] ]
set_gateway()
{
local GW=$1
local TABLE=$2
local FWMARK=$3
test -n "$GW" || return 2
TABLE=${TABLE:-default}
ip route flush table $TABLE > /dev/null 2>&1
ip route add default via $GW dev $IFACE src $IF_ADDRESS table $TABLE
if [ "$FWMARK" -a "$TABLE" != "default" ]; then
(ip rule list | grep -q "fwmark $FWMARK lookup $TABLE") || (
ip rule delete table $TABLE > /dev/null 2>&1
ip rule add fwmark $FWMARK table $TABLE
)
fi
}
# When main system interface is brought up, set routing tables
if [ "br0" = "$IFACE" ] ; then
set_gateway 192.168.1.1 vpn 0x1
set_gateway 192.168.1.2 adsl 0x2
ip rule add to 212.188.4.0/24 table adsl
ip rule add to 10.0.0.0/8 table vpn
fi Скрипт у нас лежит в каталоге /etc/network/if-up.d/ и, как следует из названия каталога, выполняется при старте интерфейсов. (Ну, ладно, ладно... Скрипт на самом деле лежит в /opt/scripts, а в /etc/network/if-up.d/ лежит только ссылка на него. Это рекомендованное положение вещей. Таким способом вы можете быстро включить или выключить нужный скрипт, просто создав или удалив линк.)
Что скрипт делает, так это:
Объявляет небольшую функцию "установить шлюз", принимающую параметрами адрес шлюза, таблицу и марку.
Проверяет, тот ли это интерфейс стартует, что нам нужен.
Устанавливает маршруты в нужные таблицы.
Дополнительно, устанавливает всякие специальные правила маршрутизации (например, отправляет все обращения в сеть провайдера через шлюз этого провайдера).
При этом, обратите внимание, я не гвоздями приколачиваю шлюз к сети, а мягко, ненавязчиво ссылаюсь на таблицу, в которой этот шлюз прописан.
Подобный финт ушами позволяет при изменении топологии сети менять маршрутизацию больших списков правил практически на лету.
Вышел из строя шлюз ADSL? Меняем запись о нём в таблице adsl, до следующей перезагрузки (или ручной правки) весь трафик будет идти по новому маршруту.
Надо заменить маршрут более чем на несколько часов? Достаточно изменить его в одном месте одного файла, а не перебирать все возможные строки,
где настраивается маршрутизация, в попытках найти следы нужного шлюза.