headermask image

Notice: Undefined variable: t in /var/www/user97185/data/www/system-administrators.info/yandex-ad.php on line 15

Notice: Undefined variable: r in /var/www/user97185/data/www/system-administrators.info/yandex-ad.php on line 15
Рекомендую: Фриланс-биржа | Кэшбэк-сервис | Интернет-бухгалтерия

Три провайдера и сервера внутри сети

Являюсь я админом небольшой провайдерской организации, все у нас идет отлично, но как и везде спокойствию приходит конец :) Вообчем начальство выставило следующие задачи:

  1. Сами клиенты подключаются по PPPoE (конектятся через eth3).
  2. Будет три магистральных провадера (два дают реальные ip, а один серый).
  3. Почтовый сервер должен быть доступен на обоих реальных ip’ах.
  4. Веб-сервер только на одном(самом дешевом) канале.
  5. Сам веб-сервер (он же почтовый сервер) должен находится внутри серверной сети (те иметь серый адрес, а именно 192.168.2.1 ).
  6. Каналы должны переключатся автоматически, с более дешевого на более дорогой (ессно при отсутствии более дешевого).

Данные о провайдерах:

  1. 128.128.128.1 (провайдер) – 128.128.128.2 (мой хост) – маска естественно 255.255.255.248(или 30) (eth0)
  2. 62.62.62.61 (провайдер) – 62.62.62.62 (мой хост) маска 30 (eth1)
  3. 192.168.0.1 (провайдер) – 192.168.0.60 маска 24 (eth2)

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

  1. Висит почта и веб и является самым дешевым для всех, но и самым не стабильным :) Юзать по умолчанию для всех клиентов.
  2. Стоит дорого (почти как GPRS) но супер стабильный, повесить почту. Ну уж когда 1го и 3го нет – тогда можно и этот, куда уж деваться…
  3. Серединка на половинку, но быстрый. Для клиентов юзать при отсутствии первого.

Итак.. решаем :)

  1. Берем и настраиваем PPPoE сервер.
  2. Ну три провайдера это классно, будем юзать iproute2 и iptables:
  • Создаем в файле /etc/iproute2/rt_tables записи на таблицы трех провайдеров:
echo 121 prov_1 >> /etc/iproute2/rt_tables
echo 122 prov_2 >> /etc/iproute2/rt_tables
echo 123 prov_3 >> /etc/iproute2/rt_tables
  • Добавляем в iproute маршруты по провайдерам:
/sbin/ip route add default via 128.128.128.1 table prov_1
/sbin/ip route add default via 62.62.62.61 table prov_2
/sbin/ip route add default via 192.168.0.1 table prov_3
  • Теперь добавляем правила для маршрутизации по источнику
/sbin/ip rule add from 128.128.128.2 table prov_1
/sbin/ip rule add from 62.62.62.62 table prov_2
/sbin/ip rule add from 192.168.0.60 table prov_3
  • Устанавливаем самого дешевого провайдера как default гейт
/sbin/ip route add default via 128.128.128.1

Ну провайдеры должны со вне теперь мы доступны по всем хостам :)

  1. Теперь решаем задачи 3,4 и 5, а именно проброс портов.

Тут следует сделать лирическое отступление, перелапатив массу всяких данных, я не нашел, простой доки по совмещению вышепреведенного роутинга и dnat, поэтому пришлось думать самому :) Оказывается, что проброшенные с помощью DNAT пакеты возвращаются обратно через default route, что нам явно не подходит, пакеты должны возращаться именно через тот хост, через который они пришли. В самом возвращаемом пакете информации через какую линию пришли нет, поэтому пришлось идти на хитрость. На внутреннем сервере почтовый порт 25(smtp) у меня одновременно еще висит и на 251 порту. Именно по этому признаку я узнаю откуда приходит пакет.

Выполняем следующее:

# Пробрасываем все пакеты с 128.128.128.2 идущие на порт 80 (www) в локальную сеть, к веб-серверу
/sbin/iptables -t nat -A PREROUTING -d 128.128.128.2 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:80
# Метим обратные пакеты меткой 2, для дальнейшего осуществления роутинга
/sbin/iptables -t mangle -A PREROUTING -p tcp -s 192.168.2.1 --sport 80 -j MARK --set-mark 2

# Пробрасываем 25 порт с первого адреса на наш почтовый сервер
/sbin/iptables -t nat -A PREROUTING -d 128.128.128.2 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.2.1:25
# Обратный пакет метим 2кой
/sbin/iptables -t mangle -A PREROUTING -p tcp -s 192.168.2.1 --sport 25 -j MARK --set-mark 2

# Прокидываем со 2го внешнего адреса и порта 25 на порт 251 внутреннего сервера
/sbin/iptables -t nat -A PREROUTING -d 62.62.62.62 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.2.1:251
# Метим уже 3ей меткой, чтобы различать маршруты
/sbin/iptables -t mangle -A PREROUTING -p tcp -s 192.168.2.1 --sport 251 -j MARK --set-mark 3

# Прописываем правила для форварда трафика по меткам (наш обратный трафик заворачивать куда надо)
# Правило для форвардинга в 128.128.128.2 - 2 цепочка
/sbin/ip rule add fwmark 2 table prov_1

# Правило для форвардинга в 62.62.62.62 - 3 цепочка
/sbin/ip rule add fwmark 3 table prov_2

# Сбрасываем фильтрацию по адресу пакета
for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
echo 0 > $i
done

Все, теперь наш веб и почтовый сервер будет доступен по всем внешним портам, вне зависимости от установленного default route на нашем гейте.

Разрешим теперь все клиентам ходить в Интер:

/sbin/iptables -t nat -A POSTROUTING -s 192.168.10.0/255.255.255.0 -d ! 192.168.0.0/255.255.0.0 -j MASQUERADE
# Сбросим кэш роутинга
/sbin/ip route flush cache
  1. Теперь пишем скрипт автоматической машрутизации, я написал его на python, но ничто не мешает Вам написать его на своем любимом языке. Не привожу его тут по той причине, что у меня он кроме автоматической машрутизации выполняет тонкую настройку прав клиента. Объясню только основной смысл:
  • Выбираем какой-нибудь очень надежный хост в сети наиболее близко расположенный к какждому из провайдеров (я выбра обшегородской ДНС сервер, он всегда доступен от всех 3х провайдеров)
  • Устанавливаем роутинг на этого провайдера:

/usr/bin/env ip route add <проверочный адрес>/32 via <гейт провайдера>

  • Пингуем данный хост:

/usr/bin/env ping -c1 <проверочный адрес>

  • Смотрим что возратил ping (переменная $?)
  • Удаляем маршрут на хост провайдера

/usr/bin/env ip route del <проверочный адрес>/32 via <гейт провайдера>

Ну вот вообчем-то и все :) Все должно работать, для начальной настройки сервера хватит, остальное уж по желанию :)

Похожие посты
  • Смена дефолтного порта терминального сервера
  • Настройка Windows Server 2008 R2 в качестве RADIUS сервера для Cisco ASA, часть 4
  • Настройка Windows Server 2008 R2 в качестве RADIUS сервера для Cisco ASA, часть 2
  • Перемещение базы данных DPM с удаленного SQL сервера на локальный SQL
  • Настройка Windows Server 2008 R2 в качестве RADIUS сервера для Cisco ASA, часть 3
  • Установка Update Rollup 1 для Exchange 2010 на DAG сервера
  • Настройка Windows Server 2008 R2 в качестве RADIUS сервера для Cisco ASA, часть 1
  • DPM 2010 Beta: новые возможности восстановления SQL сервера
  • Высокоскоростная коммутация внутри MPLS домена
  • Настройка SSL для SMTP-сервера postfix (FreeBSD)