Главная »
Документы »
3 prov in net
Три провайдера и сервера внутри сети
Привет !!! Являюсь я админом небольшой провайдерской организации, все у нас идет отлично, но как и везде спокойствию приходит конец :)
Вообчем начальство выставило следующие задачи: - Сами клиенты подключаются по 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 <гейт провайдера>
Ну вот вообчем-то и все :) Все должно работать, для начальной настройки сервера хватит, остальное уж по желанию :) Как всегда пишите murphy[at]sys[тчк]net[тчк]ru или заходите в jabber чат samgtp@conference.sgtp.samara.ru
Комментарии: тута же комент от OMeg:
[13:27:52] <.> замечания сразу
[13:28:26] <.> 1. При выставлении полиси роутинга лучше добавлять приоритет (prio 1000 или какой хочешь)
[13:28:36] <.> так ты сможешь рулить порядком выполнения политик маршрутизации
[13:29:06] <.> 2. маршрут "совсем по-умолчанию" удобнее рулить через те-же самые политики
[13:29:21] <.> ip rule add prio 65000 lookup prov_1
[13:30:27] <.> ещё можешь посмотреть в сторону балансировки трафика через iproute2 и утилиту tc
[13:30:28] <.> очень удобно
[13:31:35] <.> пинги штука достаточно ненадёжная (может тупо потеряться на загруженном канале) - а прыжки каналов дело несовсем приятное
[13:32:25] <.> в этом случае лучше сделать
статистическую пинговалку - 4 пинга по одному пакету, в случае успеха
всё гуд, в случае неудачи через 10 секунд пробуем снова
[13:32:31] <.> если в течении 30 секунд жопа - переключаемся
Написал murphy, 2007-12-05 13:37 Комент 2 от Omeg:
чтобы пинговать с определённого адреса достаточно пользоваться командой: ping -I OUR_IP ping.host
|