Являюсь я админом небольшой провайдерской организации, все у нас идет отлично, но как и везде спокойствию приходит конец :) Вообчем начальство выставило следующие задачи:
- Сами клиенты подключаются по PPPoE (конектятся через eth3).
- Будет три магистральных провадера (два дают реальные ip, а один серый).
- Почтовый сервер должен быть доступен на обоих реальных ip’ах.
- Веб-сервер только на одном(самом дешевом) канале.
- Сам веб-сервер (он же почтовый сервер) должен находится внутри серверной сети (те иметь серый адрес, а именно 192.168.2.1 ).
- Каналы должны переключатся автоматически, с более дешевого на более дорогой (ессно при отсутствии более дешевого).
Данные о провайдерах:
- 128.128.128.1 (провайдер) – 128.128.128.2 (мой хост) – маска естественно 255.255.255.248(или 30) (eth0)
- 62.62.62.61 (провайдер) – 62.62.62.62 (мой хост) маска 30 (eth1)
- 192.168.0.1 (провайдер) – 192.168.0.60 маска 24 (eth2)
Хотелки начальства по провайдерам:
- Висит почта и веб и является самым дешевым для всех, но и самым не стабильным :) Юзать по умолчанию для всех клиентов.
- Стоит дорого (почти как GPRS) но супер стабильный, повесить почту. Ну уж когда 1го и 3го нет – тогда можно и этот, куда уж деваться…
- Серединка на половинку, но быстрый. Для клиентов юзать при отсутствии первого.
Итак.. решаем :)
- Берем и настраиваем PPPoE сервер.
- Ну три провайдера это классно, будем юзать 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Ну провайдеры должны со вне теперь мы доступны по всем хостам :)
- Теперь решаем задачи 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
- Теперь пишем скрипт автоматической машрутизации, я написал его на python, но ничто не мешает Вам написать его на своем любимом языке. Не привожу его тут по той причине, что у меня он кроме автоматической машрутизации выполняет тонкую настройку прав клиента. Объясню только основной смысл:
- Выбираем какой-нибудь очень надежный хост в сети наиболее близко расположенный к какждому из провайдеров (я выбра обшегородской ДНС сервер, он всегда доступен от всех 3х провайдеров)
- Устанавливаем роутинг на этого провайдера:
/usr/bin/env ip route add <проверочный адрес>/32 via <гейт провайдера>
- Пингуем данный хост:
/usr/bin/env ping -c1 <проверочный адрес>
- Смотрим что возратил ping (переменная $?)
- Удаляем маршрут на хост провайдера
/usr/bin/env ip route del <проверочный адрес>/32 via <гейт провайдера>
Ну вот вообчем-то и все :) Все должно работать, для начальной настройки сервера хватит, остальное уж по желанию :)