Шлюз на два провайдера

ROSA Enterprise Linux Server -- вопросы и проблемы
Правила форума
Уважаемые пользователи! Поддержка, ответы на вопросы и проблемы по серверу принимаются:
1) на багзилле http://bugs.rosalinux.ru/enter_bug.cgi? ... A%20Server
2) или после заполнения формы на http://www.rosalab.ru/products/server/download вы получаете 30 дней БЕСПЛАТНОЙ техподдержки по серверу.
Ответы на ваши вопросы на форуме НЕ ГАРАНТИРУЮТСЯ. Спасибо за понимание!
Ответить
Аватара пользователя
Yamah
Сообщения: 1387
Зарегистрирован: 04 май 2012, 06:30
Operating system: Десктоп (дом): Rosa Fresh R8.1, Rosa Fresh R10
Десктоп (работа): Rosa Fresh R8.1/Rosa Fresh R10
Сервер (работа): Rosa Enterprise Linux Sercver 6.7
Нетбук: Rosa Fresh R10
Контактная информация:

Шлюз на два провайдера

Сообщение Yamah » 12 авг 2014, 14:32

Может кому пригодиться.
Может не сильно

Дано: локальная сеть и два (мое решение предусматривает и большее количество) разных провайдера, а так же ЭВМ (ПК или сервере) с тремя сетевыми картами и установленной RELS 6.5
Нужно: обеспечить локальную сеть доступом в интернет через оба канала с примитивной балансировкой.
Решение:
1. Настраиваем сетевые интерфейсы. Для внешних интерфейсов настраиваем getway
2. Создаем каталог /etc/static-routes
Его содержимое
eth1 # - файл с именем сетевого интерфейса, "смотрящего" на провайдера
eth2 # - файл с именем сетевого интерфейса, "смотрящего" на провайдера
local_int.lst # - Файл с указанием локальных интерфейсов и локальных сетей с префиксом в формате : {DEVICE}::{NET_IP}/{PREFIX} , по одному на строку
к примеру

Код: Выделить всё

eth0::192.168.0.0/24
eth3::192.171.4.8/29
У меня в указанных файлах сетевых интерфейсов, смотрящих на провайдера хранятся IP узлов, маршруты к которым должны проходить только через данный интерфейс:
64.233.165.101
64.233.165.113
64.233.165.138
В соответствующий файл статических маршрутов эти IP я добавляю скриптом
route_add.sh <Имя-интерфейса> <Номер таблицы маршрутизации>

route_add.sh eth2 1

Код: Выделить всё

#!/bin/bash

ETH=$1
TBR=$2
STPATH="/etc/static-routes"

VAR_DATA=( "" )
funk_read_array ()
{
    VAR_DATA=( "" )
    ind=0
    for line in `cat $STPATH/$1 | grep -v "#" | awk -F' //' '{print $1}'`
        do
            if [ "$line" != "" ]
                then
                    VAR_DATA[$ind]=$line
                    ind=$[$ind+1]
            fi
        done
}

STATIC_ROUTE="/etc/sysconfig/network-scripts/route-$ETH"

GW=$(cat /etc/sysconfig/network-scripts/ifcfg-$ETH | grep GATEWAY | awk -F'=' '{print $2}')
IP=$(cat /etc/sysconfig/network-scripts/ifcfg-$ETH | grep IPADDR | awk -F'=' '{print $2}')

ROUTELIST=""
#echo -e
LOCIN=( "" )
LOCNET=( "" )
while read line
    do
        LOCIN=$(echo $line | awk -F'::' '{print $1}' )
        LIP=$(cat /etc/sysconfig/network-scripts/ifcfg-$LOCIN | grep IPADDR | awk -F'=' '{print $2}')
        LOCNET=$(echo $line | awk -F'::' '{print $2}' )
        ROUTELIST="$ROUTELIST$LOCNET via $LIP table $TBR""\n"
    done < <(cat $STPATH/local_int.lst)
        ROUTELIST="$ROUTELIST""0/0 via $GW table $TBR""\n"

funk_read_array $ETH
i=0
while [ "$i" -lt ${#VAR_DATA[@]} ]
    do
        ROUTELIST="$ROUTELIST""${VAR_DATA[$i]} dev $ETH src $IP""\n"
        i=$[$i+1]
    done
echo -e $ROUTELIST > $STATIC_ROUTE

exit 0
3. Создаем файл /etc/sysconfig/network-scripts/setmultiroutes.sh

Код: Выделить всё

#!/bin/bash

ETH=$1
TBR=$2
STPATH="/etc/static-routes"

EXTDEV=( "" )
i=0

while read line
    do
        if [ "$(ifconfig | grep $line)" != "" ]
            then
                EXTDEV[$i]=$line
                i=$[$i+1]
        fi
    done < <(ls -1 $STPATH | grep -v "local_int.lst")

if [ "${#EXTDEV[@]}" -gt 1 ]
    then
        DEFROUTE=""
        i=0
        while [ "$i" -lt ${#EXTDEV[@]} ]
            do
                GW=$(cat /etc/sysconfig/network-scripts/ifcfg-${EXTDEV[$i]} | grep GATEWAY | awk -F'=' '{print $2}')
                DEFROUTE="$DEFROUTE nexthop via $GW dev ${EXTDEV[$i]}"
                i=$[$i+1]
            done
        if [ "$(ip route | grep "default equalize")" == "" ]
            then
                ip route del default
                ip route add default equalize $DEFROUTE
            elif [ "${#EXTDEV[@]}" -gt 2 ]
                then
                    i=0
                    FLAG=1
                    while [ "$i" -lt ${#EXTDEV[@]} ]
                        do
                            if [ "$(ip route | grep "nexthop" | grep ${EXTDEV[$i]})" == "" ]
                                then
                                    FLAG=0
                            fi
                            i=$[$i+1]
                        done
                    if [ "$FLAG" = 0 ]
                        then
                            ip route del default
                            ip route add default equalize $DEFROUTE
                    fi
        fi
fi

exit 0
4. Дописываем в конец файла /etc/sysconfig/network-scripts/ifup-post (перед финальным "exit 0")
exec /etc/sysconfig/network-scripts/setmultiroutes.sh
(Есть готовый патч)
/etc/sysconfig/network-scripts/ifup-post

Код: Выделить всё

cat ifup-post.patch
--- ifup-post_orig      2013-10-10 21:48:43.000000000 +0700
+++ ifup-post   2014-08-12 16:49:50.667590073 +0700
@@ -100,4 +100,6 @@
     /sbin/ifup-local ${DEVICE}
 fi
 
+exec /etc/sysconfig/network-scripts/setmultiroutes.sh
+
 exit 0

Перезапускаем сетевую службу:

Код: Выделить всё

service network restart
и прописываем соответствующие правила iptable для NAT

Аватара пользователя
Yamah
Сообщения: 1387
Зарегистрирован: 04 май 2012, 06:30
Operating system: Десктоп (дом): Rosa Fresh R8.1, Rosa Fresh R10
Десктоп (работа): Rosa Fresh R8.1/Rosa Fresh R10
Сервер (работа): Rosa Enterprise Linux Sercver 6.7
Нетбук: Rosa Fresh R10
Контактная информация:

Re: Шлюз на два провайдера

Сообщение Yamah » 05 сен 2014, 07:42

Есть готовые скрипты для настройки роутинга на несколько провайдеров.
Есть готовые скрипты для настройки правил IPTABLES (для доступа к внешним почтовым серверам, skype, к сервисам для бухгалтеров, ограничение доступа к ресурсам глобальной сети по IP, проброс портов извне, доступ по IP извне...), через файлы настройки.
(Количество локальных и глобальных интерфейсов не менее одного.)

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

Аватара пользователя
ДроноваЮ
Сообщения: 2636
Зарегистрирован: 01 июн 2011, 13:11
Operating system: Ubuntu/ROSA
Откуда: Москва

Re: Шлюз на два провайдера

Сообщение ДроноваЮ » 05 сен 2014, 14:36

Yamah писал(а):Могу выложить архив с скриптами и примерами настроек с разрешения администрации
Выкладывай, Ярослав. Только напиши рядом обязательно: «Никаких гарантий, используйте на свой страх и риск», чтобы потом криворукие тебя не замучили. Ну или текст GPL приложи.

Аватара пользователя
Yamah
Сообщения: 1387
Зарегистрирован: 04 май 2012, 06:30
Operating system: Десктоп (дом): Rosa Fresh R8.1, Rosa Fresh R10
Десктоп (работа): Rosa Fresh R8.1/Rosa Fresh R10
Сервер (работа): Rosa Enterprise Linux Sercver 6.7
Нетбук: Rosa Fresh R10
Контактная информация:

Re: Шлюз на два провайдера

Сообщение Yamah » 08 сен 2014, 10:54

routes.tar.gz
(21.59 КБ) 1039 скачиваний
Описание:

/etc/firewall - каталог, где я сложил файлы для настройки файервола

/etc/firewall/accountant - каталог, где лежат конфиги для доступа бухгалтерии к их внешним службам. Количество файлов не ограничено, в названиях не должно содержаться пробелов и служебных символов BASH. Файлы должны содержать записи по одной на строку. Формат записи Domen_or_IP[:Ports (separated by commas)[:Protocols]]

/etc/firewall/free_getway - каталог для указания хостов локальных сетей, для которых нет ограничений на доступ к ресурсам глобальной сети. Имена файлов должны соответствовать имени интерфейса и иметь расширение "lst". Формат записи - IP хоста (один на строку)

/etc/firewall/mail - каталог, в котором хранятся настройки для свободного доступа к разрешенным почтовым серверам из локальных сетей. Для каждого почтового сервиса нужно создать подкаталог с его названием и в нем в файлах imap.lst, pop3.lst и smtp.lst указать IP-адреса соответственно IMAP, POP3 и SMTP серверов.

/etc/firewall/open_ports - каталог содержит файлы со списками портов, которые должны быть открыты на внутренних или внешних интерфейсах. Список файлов:
service_global.lst и service_local.lst - файл с названием сервисов, порты для которых должны быть открыты на внешних и внутренних интерфейсах соответственно. Пока доступны следующие службы: ssh, http, https, pop3, smtp, imap, pop3s, smtps, imaps, svn, rsync, mysql, squid, ldap, ldaps, kasswd5, kerberos-adm, cups, smb, nfs, xmpp, dns, dhcp (будет открыт только на внутреннем интерфейсе) (не проверял - DHCP-сервер у меня на не на шлюзе настроен), ntp, vpn.
tcp_global.lst, tcp_local.lst - списки портов для протокола TCP, которые должны быть открыты на глобальных и локальных интерфейсах соответственно, по одному на строку.
udp_global.lst, udp_local.lst - списки портов для протокола UDP, которые должны быть открыты на глобальных и локальных интерфейсах соответственно, по одному на строку.
tcp-udp_global.lst, tcp-udp_local.lst - списки портов для протоколов TCP и UDP сразу, которые должны быть открыты на глобальных и локальных интерфейсах соответственно, по одному на строку.
Если никакие файлы не будут найдены, то по умолчанию будут доступны только ssh, http и https - порты.

/etc/firewall/accountant.lst - файл с указанием IP компьютеров бухгалтерии.

/etc/firewall/acm_host.lst - файл настроек внешних хостов, которым разрешено подключаться по определенным портам. Формат записи: <DOMEN-or_IP>|<PORT> (Можно указать порты через запятую или диапазон портов через двоеточие - поэтому такой разделитель. Оба этих варианта не проверял.)

/etc/firewall/adm_out_host.lst - внешние хосты администратора - доступ по всем портам.

/etc/firewall/dns.lst - список DNS-серверов, к которым разрешены подключения из локальных сетей.

/etc/firewall/have_skype.lst - IP-адреса хостов локальных сетей, которым разрешено пользоваться сервисами Skype. В клиенте нужно будет настроить порт один из следующих 9592,13840,50179

/etc/firewall/kp.lst - Список для доступа к ресурсам одной из фирм, предоставляющих доступ к нормативным (юридическим) базам из их клиента. (В будущем может быть изменено название и формат записей.)

/etc/firewall/port_fw.lst - данные для проброса портов.

Что бы изменения применились нужно выполнить

Код: Выделить всё

/usr/local/bin/firewall.sh start
Для сохранения настроек файервола (для автоматического применения при старте системы, если настроено):

Код: Выделить всё

/usr/local/bin/firewall.sh save
/etc/static-routes - каталог, содержащий настройки для статической маршрутизации. Записи (IP хоста) должны быть в файле с названием глобального интерфейса, через который прокладывать маршрут.
После изменения настроек нужно запустить скрипт
/usr/local/bin/route_add.sh <InterFace_Name> <Number_of_RouteTable>
(или, если у Вас RELS 6.4: /usr/local/bin/route_add_6.4.sh <InterFace_Name> <Number_of_RouteTable> )
где Number_of_RouteTable - номер таблицы маршрутизации, который вы решили присвоить для данного интерфейса.
Так к примеру, если у вас eth2 "смотрит" на провайдера, которому вы присвоили свой номер 1:
/usr/local/bin/route_add.sh eth2 1

Замечание: Все записи должны быть по одной на строку. Символ "#" (увы пока в любом месте строки) указывает конфигуратору файервола игнорировать строку. "//" - разделитель основной части и комментария.

Новые файлы в /etc/sysconfig/network-scripts:
ifup-post.patch - патч, который нужно наложить на файл /etc/sysconfig/network-scripts/ifup-post
multiroutes.cfg - файл с указанием того, куда смотрит интерфейс.
setmultiroutes.sh - скрипт для активации мультироутинга.

/usr/local/bin/firewall.sh - скрипт настройки файервола. Его команды:
start - запуск файервола
stop - остановка файервола
restart - перезапуск (можно использовать просто start)
pause - все кроме NAT отключается.
status - стату
save - сохранит в файл /etc/sysconfig/iptables
restore - восстановит настройки iptables, если новые настройки сбоят, и старые ще не переписаны.

/usr/local/bin/route_add.sh - скрипт для формирования правил статических маршрутов.

Внимание: Я писал под себя. Проверял на работоспособность в своей сети (маршрутизацию между локальными сетями не проверял). Гарантий, что подойдет абсолютно всем, нет.
(Я не читаю, что нужно такой код лицензировать, но на всякий случай выкладываю все это под лицензией GNU GPLv3.)
В настройках предполагается, что большинство пользователей локальной сети в интернет выходят через кэширующий прокси-сервер (SQUID в моем случае), поднятом не на шлюзе.

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

Ответить

Вернуться в «Сервер»