Продолжим настройку нашего шлюза, о котором я рассказывал в предыдущая статья .
Напомню, там мы настроили правила маршрутизации, теперь нам нужно поработать над 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-адреса, чуть ниже я расскажу, чем это нам пригодится.
.Мы подключили внешние настройки, в данном случае это будет наш файл ipt_p1.conf .$1
Хватит о скучном, приступим к настройке и постараемся сделать все красиво:
echo "[+] Сброс существующих правил iptables." $IPTABLES -F $IPTABLES -F -t физ.Очищаем все правила iptables, в первой строке говорим, что делаем, почему на английском и чтобы не было проблем с кодировками.$IPTABLES -F -t необработанный $IPTABLES -F -t искажать $IPTABLES -X $IPTABLES -P ПАДЕНИЕ ВХОДА $IPTABLES -P ПАДЕНИЕ ВЫХОДА $IPTABLES -P ПРЯМОЕ ПЕРЕДАЧА
Последние три строки задают правила по умолчанию — все пакеты, не соответствующие списку правил, будут просто отброшены.
$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
-
Сделайте Свой Сайт Известным!
19 Oct, 24 -
Хабраравод?
19 Oct, 24 -
Звездные Войны, Повествование И Веб-Дизайн
19 Oct, 24 -
Будет Ли На Gsc Подан Иск За Clear Sky?
19 Oct, 24