Let's talk routing.

Feb 12, 2014 14:00


О маркировке пакетов мы уже поговорили, давайте поговорим о маршрутизации.

А если совсем точно, о её восстановлении при перезагрузке системы. И не только перезагрузке. И не только восстановлении, но и изменении.

Поскольку в 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/ лежит только ссылка на него. Это рекомендованное положение вещей. Таким способом вы можете быстро включить или выключить нужный скрипт, просто создав или удалив линк.)

Что скрипт делает, так это:
  1. Объявляет небольшую функцию "установить шлюз", принимающую параметрами адрес шлюза, таблицу и марку.
  2. Проверяет, тот ли это интерфейс стартует, что нам нужен.
  3. Устанавливает маршруты в нужные таблицы.
  4. Дополнительно, устанавливает всякие специальные правила маршрутизации (например, отправляет все обращения в сеть провайдера через шлюз этого провайдера).

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

Вышел из строя шлюз ADSL? Меняем запись о нём в таблице adsl, до следующей перезагрузки (или ручной правки) весь трафик будет идти по новому маршруту. Надо заменить маршрут более чем на несколько часов? Достаточно изменить его в одном месте одного файла, а не перебирать все возможные строки, где настраивается маршрутизация, в попытках найти следы нужного шлюза.

it, *nix

Previous post Next post
Up