Используем 2+ Провайдеров (Вторая Часть)

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

Напомню, там мы настроили правила маршрутизации, теперь нам нужно поработать над iptables. Теперь настроим сеть, состоящую из шлюза и сервера.

На шлюзе будут работать SSH и DNS, а на нем у нас будет Windows-сервер с RDP и SMTP. Сеть будет настроена таким образом, что через любой из внешних IP мы сможем подключиться к любому из серверов, а SMTP-сервер будет выходить через основного провайдера.

И конечно, начнем с переменных, а следующие настройки вынесем в отдельный файл, это нам очень пригодится в будущем:

#!/бин/баш экспортировать GLOBAL_ETH_PRIM=eth1 экспортировать GLOBAL_ETH_SEC=eth2 экспортировать GLOBAL_IP_PRIM=10.10.10.10 экспортировать GLOBAL_IP_SEC=20.20.20.20 экспорт MARK_PRIM=10 экспорт MARK_SEC=20
Назовем этот файл ipt_p1.conf .

И содержит данные о том, какой интерфейс является основным, а какой резервным (PRIM и SEC соответственно) и значения маркировки пакетов.

Перейдем к основному файлу конфигурации iptables, назовем его ipt.conf .

Запишем переменные ;-)

#!/бин/баш IPTABLES=/sbin/iptables MODPROBE=/sbin/modprobe
Это для того, чтобы меньше зависеть от дистрибутива - пути к исполняемым файлам.

LOCAL_ETH=eth0 GLOBAL_ETH_P1=eth1 GLOBAL_ETH_P2=eth2 ЛОКАЛ_IP=192.168.0.1 ЛОКАЛ_NET=192.168.0.0/24 ГЛОБАЛ_IP_P1=10.10.10.10 ГЛОБАЛ_IP_P2=20.20.20.20
Здесь мы описали конфигурацию нашей сети по порядку: локальный интерфейс, интерфейсы, которые смотрят на провайдеров, локальный IP-адрес и подсеть, IP-адреса, выданные провайдерами.

СРВ11=192.168.0.11 СРВ12=192.168.0.12
А это наш сервер, для которого мы настроили маршрутизацию на основе политик с помощью меток.

Как я уже говорил, этот сервер имеет на своем сетевом интерфейсе два IP-адреса, чуть ниже я расскажу, чем это нам пригодится.

.

$1

Мы подключили внешние настройки, в данном случае это будет наш файл ipt_p1.conf .

Хватит о скучном, приступим к настройке и постараемся сделать все красиво:

echo "[+] Сброс существующих правил iptables." $IPTABLES -F $IPTABLES -F -t физ.

$IPTABLES -F -t необработанный $IPTABLES -F -t искажать $IPTABLES -X $IPTABLES -P ПАДЕНИЕ ВХОДА $IPTABLES -P ПАДЕНИЕ ВЫХОДА $IPTABLES -P ПРЯМОЕ ПЕРЕДАЧА

Очищаем все правила iptables, в первой строке говорим, что делаем, почему на английском и чтобы не было проблем с кодировками.

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

$MODPROBE ip_conntrack $MODPROBE iptable_nat
Мы загрузили модули ядра, которые будем использовать.

Теперь пройдемся по цепочкам iptables и наполним их необходимыми правилами:

echo "[+] Настройка цепочки INPUT." $IPTABLES -A INPUT -m состояние --state НЕДЕЙСТВИТЕЛЬНО -j DROP $IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Использование возможностей модуля состояние мы отбрасываем неправильные пакеты и принимаем пакеты, относящиеся к уже установленным соединениям или вторичным соединениям (например, передача данных на ftp).

$IPTABLES -A INPUT -p tcp --dport 22 --syn -m state --state NEW -j ПРИНЯТЬ
Мы принимаем подключения по SSH из любой точки мира.

$IPTABLES -A INPUT -i $LOCAL_ETH -s $LOCAL_NET -j ПРИНЯТЬ
Местный трафик будет идти без ограничений, хотя это не всегда правильно.

$IPTABLES -A INPUT -i lo -j ПРИНЯТЬ
Также на локальном хосте.

Продолжаем цепочку OUTPUT:

echo "[+] Настройка цепочки OUTPUT." $IPTABLES -A OUTPUT -m состояние --state НЕДЕЙСТВИТЕЛЬНО -j DROP $IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Эти правила аналогичны правилам цепочки INPUT.
$IPTABLES -A OUTPUT -o $GLOBAL_ETH_PRIM -p udp --dport 53 -j ПРИНЯТЬ
Мы разрешили нашему DNS-серверу работать через основного провайдера
$IPTABLES -A OUTPUT -o $GLOBAL_ETH_PRIM -p tcp --dport 22 --syn -m state --state NEW -j ПРИНЯТЬ
Им также разрешили выходить на улицу через SSH.
$IPTABLES -A OUTPUT -o $LOCAL_ETH -d $LOCAL_NET -m состояние --state NEW -j ПРИНЯТЬ
Опять же, ограничений на исходящий локальный трафик нет. Перейдем к обработке трафика из локальной сети:
echo "[+] Настройка цепочки FORWARD." $IPTABLES -A FORWARD -m состояние --state НЕВЕРНО -j DROP $IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Все те же два удобных правила.

$IPTABLES -A FORWARD -i $GLOBAL_ETH_P1 -d $SRV11 -p tcp --dport 25 --syn -m state --state NEW -j ПРИНЯТЬ $IPTABLES -A FORWARD -i $GLOBAL_ETH_P2 -d $SRV12 -p tcp --dport 25 --syn -m state --state NEW -j ПРИНЯТЬ $IPTABLES -A FORWARD -i $GLOBAL_ETH_P1 -d $SRV11 -p tcp --dport 3389 --syn -m state --state NEW -j ПРИНЯТЬ $IPTABLES -A FORWARD -i $GLOBAL_ETH_P2 -d $SRV12 -p tcp --dport 3389 --syn -m state --state NEW -j ПРИНЯТЬ
Вот и получается, что пакеты, приходящие к первому провайдеру, передаются только на первый IP-адрес сервера, второй — на второй.

$IPTABLES -A FORWARD -i $LOCAL_ETH -s $SRV11 -j ПРИНЯТЬ $IPTABLES -A FORWARD -i $LOCAL_ETH -s $SRV12 -j ПРИНЯТЬ
Мы разрешаем весь исходящий трафик с нашего сервера, опять же это не совсем правильно.

Далее идут правила NAT:

$IPTABLES -t nat -A POSTROUTING -s $SRV11 -p tcp --dport 25 -j SNAT --to-source $GLOBAL_IP_PRIM $IPTABLES -t nat -A POSTROUTING -s $SRV12 -p tcp --dport 25 -j SNAT --to-source $GLOBAL_IP_PRIM
Все, что наш сервер пытается отправить через SMTP, будет проходить через основного провайдера.

И снова самое интересное мы оставили напоследок.

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

добавить правило ip из $SRV11 таблицы fwmark 10 T1 добавить правило IP из $SRV12 таблицы fwmark 20 T2
Итак, наши правила:
$IPTABLES -t mangle -A PREROUTING -i $LOCAL_ETH -s $SRV11 -p tcp --dport 25 -j MARK --set-mark $MARK_PRIM $IPTABLES -t mangle -A PREROUTING -i $LOCAL_ETH -s $SRV12 -p tcp --dport 25 -j MARK --set-mark $MARK_PRIM
Мы помечаем все пакеты, покидающие наш внутренний сервер через порт 25, значением $MARK_PRIM. Посмотрим, что нам это дает: исходящий пакет помечен значением 10, значит, он будет маршрутизироваться по таблице Т1, и согласно этой таблице пакет должен пройти через первого провайдера, в таблице есть разрешающее правило.

Цепочка FORWARD, чтобы пакет прошел беспрепятственно — для нас все правильно и требуется.

Теперь нам нужно разобраться с приходящим к нам соединениям.

Во-первых, конечно, ДНАТ должен работать:

$IPTABLES -t nat -A PREROUTING -i $GLOBAL_ETH_P1 -d $GLOBAL_IP_P1 -p tcp --dport 25 -j DNAT --к месту назначения $SRV11 $IPTABLES -t nat -A PREROUTING -i $GLOBAL_ETH_P1 -d $GLOBAL_IP_P1 -p tcp --dport 3389 -j DNAT --к месту назначения $SRV11 $IPTABLES -t nat -A PREROUTING -i $GLOBAL_ETH_P2 -d $GLOBAL_IP_P2 -p tcp --dport 25 -j DNAT --к месту назначения $SRV12 $IPTABLES -t nat -A PREROUTING -i $GLOBAL_ETH_P2 -d $GLOBAL_IP_P2 -p tcp --dport 3389 -j DNAT --к месту назначения $SRV12
Вроде все правильно, проверяем: пакет приходит на внешний интерфейс шлюза, в зависимости от принадлежности интерфейса провайдеру, перенаправляется на первый или второй IP-адрес внутреннего сервера, сервер отвечает с тот же (!) IP-адрес, пакет на шлюзе маршрутизируется по основной таблице, проходит через FORWARD и отправляется через основного провайдера, но это уже не правильно, потому что пакет мог прийти через резервного провайдера.

Исправляем это, добавляя правила:

$IPTABLES -t mangle -A PREROUTING -i $LOCAL_ETH -s $SRV11 -p tcp --sport 25 -j MARK --set-mark $MARK_PRIM $IPTABLES -t mangle -A PREROUTING -i $LOCAL_ETH -s $SRV11 -p tcp --sport 3389 -j MARK --set-mark $MARK_PRIM $IPTABLES -t mangle -A PREROUTING -i $LOCAL_ETH -s $SRV12 -p tcp --sport 25 -j MARK --set-mark $MARK_SEC $IPTABLES -t mangle -A PREROUTING -i $LOCAL_ETH -s $SRV12 -p tcp --sport 3389 -j MARK --set-mark $MARK_SEC
Теперь на обратном пути маркируем пакеты по адресу, с которого они отправлены.

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

Все! Готовый.

Чтобы применить правила, выполните команду ".

/ipt.conf ipt_p1.conf" .

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

Скачать скрипты из первой и второй частей.

оригинальная статья в моем блоге Используем 2+ провайдеров (вторая часть) п.

с.

Написано, чтобы понять себя и рассказать другим.

Теги: #настройка Linux #iptables #IP #nat #iproute2 #policy маршрутизации #iproute #dnat

Вместе с данным постом часто просматривают: