вторник, 1 июля 2008 г.

Настройка ADSL-моста, PPPoE во FreeBSD, два провайдера

Сегодня я долго и со смаком занимался любовью с ADSL-модемом ZyXEL Prestige 660.

У нашей компании имеется собственный VPN-сервер (PPTP), к которому подсоединяются через Интернет наши сотрудники в других городах для получения доступа к корпоративной сети. Причём VPN-сервер подключен к Ethernet-провайдеру, а большинство сотрудников ходят через ADSL-провайдера.

Недавно мы узнали, что у ADSL-провайдера внутренний трафик бесплатный и не имеет ограничения по скорости. Поскольку платить за каждый мегабайт Интернет-трафика сразу двум провайдерам довольно дорого, то имеет смысл разместить VPN-сервер в сети ADSL-провайдера.

Конечно качество ADSL-связи не сравнится с качеством Ethernet. ADSL имеет максимальную входящую скорость 8Mbit/s, а исходящую - максимум 1Mbit/s. Таким образом два модема на разных концах соединения ограничивают и входящую и исходящую скорость соединения до 1Mbit/s в каждую сторону.

Подключение к ADSL-провайдеру у нас уже имелось, но до этого модем использовался только в режиме роутера. При этом любой компьютер, выходящий в Интернет через такой модем, автоматически оказывается за NAT'ом. Естественно за NAT'ом бесполезно запускать какой-либо сервер, к нему никто не сможет подключиться. Да, конечно, у многих модемов есть функция проброса TCP-соединений вовнутрь, которая во многих случаях может выручить. Но у VPN-сервера кроме управляющего TCP-соединения на 1723 порту есть ещё двунаправленный поток GRE-пакетов, которые несут полезную нагрузку в виде PPP-пакетов. В этом случае простым пробросом TCP-портов уже не обойтись, поэтому ADSL-модем нужно было перенастроить в режим моста.

В режиме моста модем выполняет разбивку и упаковку кадров Ethernet, поступивших на его Ethernet-порт, внутрь ячеек ATM. Ячейки ATM передаются в направлении провайдера, где и обрабатываются. Для ячеек ATM, приходящих от провайдера, модем выполняет обратные действия: извлекает и собирает частей кадр Ethernet, который отправляет через свой Ethernet-порт.

Но это ещё не всё! Быть может вы подумали, что достаточно на сетевой карте компьютера настроить IP-адрес, маску, шлюз, прописать DNS, как сразу же всё заработает? Нет, компьютер должен установить с провайдером соединение PPPoE, то есть PPP over Ethernet.

Вот именно с этим пунктом у меня и возникли трудности, ни с сервера FreeBSD ни с компьютера Windows соединение установить не удавалось. Я перерыл все настройки модема, перерыл по-интернета, перечитал различные варианты настройки PPPoE-клиента. Перечитал кучу инструкций по настройке различных ADSL-модемов в режиме моста, пробовал поменять модем. Ничего не помогало.

Огромное спасибо одному из специалистов ADSL-провайдера, который действительно вник в суть проблемы, а не предложил в очередной раз сбросить модем на заводские настройки и перепроверить VPI/VCI. В течение около пяти-восьми минут с моих слов он понял, что модем не хочет работать в режиме моста и попросил прверить настройки инкапсуляции. В настройках инкапсуляции должен был значиться RFC1483, у меня же стоял PPPoE.

Я как чайник в технологиях телефонии и как человек, до этого никогда не настраивавший ADSL-модем в режиме моста, совершенно спокойно игнорировал этот пункт. Как только я его поменял, соединение сразу же установилось. Так же легко установилось заранее настроенное соединение на FreeBSD.

От себя добавлю следующее. Чтобы легко и без глюков можно было пользоваться обоими провайдерами, нужно в фаерволл ipfw прописать правила PBR (Policy Based Routing):
ipfw add fwd Gateway1 ip from IP1 to any
ipfw add fwd Gateway2 ip from IP2 to any
Чтобы не получилось так, что в сеть одного из провайдеров уходили пакеты с IP-адресом другого.

Если же машинка выполняет функции NAT-шлюза, то на каждом внешнем интерфейсе нужно запустить по одному экземпляру natd. Кошерно это делается через rc.conf так:
natd_program="/sbin/natd"
natd_enable="YES"
natd_interface="rl0"
natd_flags="-s -f /etc/natd.conf"

ppp_enable="YES"
ppp_mode="ddial"
ppp_nat="YES"
ppp_profile="provider"
Только одно соединение должно устанавливать маршрут по умолчанию. Поэтому через второго провайдера можно назначить специальные маршруты, которые будут указывать на подсети этого провайдера. Выяснить подсети, принадлежащие провайдеру, можно покопавшись на его официальном сайте либо через whois.

Приведу несколько полезных, на мой взгляд, ссылок.
  1. Страница хэндбука FreeBSD, посвященная настройкам PPPoE:
    Использование PPP через Ethernet (PPPoE)
  2. Довольно доходчивое описание протокола PPPoE, позволяющее как минимум понять общие принципы его работы:
    Метод передачи РРР через Ethernet (PPPoE)
  3. Продвинутая настройка PPPoE на FreeBSD:
    Настройка PPPoE на FreeBSD (нужна регистрация на сайте)
  4. Статья в журнале "Системный администратор" об использовании двух каналов:
    Два канала – роскошь? Резервирование и балансировка трафика во FreeBSD

2 комментария:

Folax комментирует...

Спасибо,за статью но абзац про модем в режиме роутера и гре,мне помог очень сильно.Я долго искал ответ на этот вопрос.

Анонимный комментирует...

ОГРОМНОЕ СПАСИБО! Намучился с этим бриджем. выставил RFC и все заработало!