Маршрутизация Linux

Материал из Корпоративная wiki Администрации города Волгодонски
Версия от 11:57, 6 декабря 2017; Vinichenko (обсуждение | вклад) (Новая страница: «ЛинУкс, как много в этом слове Для сердца Сисадминского слилось! (простите за потерю рит…»)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

ЛинУкс, как много в этом слове

Для сердца Сисадминского слилось!

(простите за потерю ритма) :)


Учительница в школе спрашивает учеников, кем работают их родители. Обнаруживаются врачи, менеджеры по продажам, бухгалтеры… И тут встает Вовочка и заявляет: «А мой папа – тапер в борделе!». Учительница, естественно, не может закрыть на это глаза, отправляется к Вовочке домой и гневно спрашивает папу: «Какой пример вы подаете ребенку?». «Вообще-то я программист, — отвечает папа, — специализируюсь на TCP/IP в Unix. Но как объяснить это семилетнему пацану?».

(бородатый анекдот)

18+


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

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

ДАНО:

Провайдер0:

Шлюз IP - 192.168.0.1/24

Наш IP - DHCP/24

Интерфейс - eth0

Ширина - 10Мбит/с

Провайдер1:

Шлюз IP - 192.168.1.1/24

Наш IP - 192.168.1.100/24 ("белый" IP)

Интерфейс - eth1

Ширина - 3Мбит/с

Спецканал:

Шлюз IP - 192.168.2.1/24

Наш IP - 192.168.2.100/24

Интерфейс - eth2

ЛВС0:

Наш IP - 192.168.10.1/24

Интерфейс - eth3

ЛВС1:

Наш IP - 192.168.11.1/24

Интерфейс - eth4

Дополнительно ДАНО:

Спецсеть - 10.10.10.0/24

Особые сайты: 123.145.167.189, 109.187.165.143

ЗАДАЧА:

Распределить основной интернет-трафик согласно ширине канала по провайдерам.

Обеспечить доступ в спецсеть из ЛВСх.

Обеспечить доступ к особым сайтам через "белый" IP.

Открыть некоторые порты...

РЕШЕНИЕ:

НЕОБХОДИМЫЙ ИНСТРУМЕНТ:

Windows отпал сразу, т.к. без дозакупки дополнительного ПО она мало что умеет, но, при желании, кое-что тоже сделать можно. Но не будем о чепухе!

Linux - любой современный дистр уже имеет в своем комплекте iptables и iproute2. НО! Не все функции работают в различных сборках, о чем будет сказано позже. Мною использовались Ubuntu 16.04.3 server и OpenSUSE Leap 42.3.

Теперь перейдем к теоретическому обоснованию решения.

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

Мы не можем маршрутизировать входящий трафик по нашим каналам! Мы можем только пытаться исходящим корректировать входящий.

Начнем с балансировки:

ВАРИАНТ 1:

Можно отправлять каждый 4-ый (см. ДАНО) пакет через второй канал и надеяться, что что-то из этого выйдет (маршрутизация на уровне пакетов). Но в этом варианте внешний хост будет получать от нас пакеты в одном соединении с разных IP-адресов, что снесет ему крышу и он нас пошлет.

ВАРИАНТ 2:

Можно отправлять каждое 4-ое соединение через второй канал (точнее пакеты каждого 4-го соединения). Этот вариант вполне рабочий, но мы можем упереться в особенности некоторых дистров Linux.

ВАРИАНТ 3:

Можно прописать каждый 4-ый маршрут через второй канал. Этот вариант также рабочий, но у него есть один существенный минус - может получиться так, что более востребованные маршруты пропишутся через один канал и вся нагрузка упадет на него.

ВАРИАНТ 4:

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