среда, 11 февраля 2009 г.

Пакет RP-PPPoE

Решил объединить три своих заметки о пакете RP-PPPoE.

1. О пакете

RP-PPPoE (Roaring Peguin PPP over Ethernet) - это пакет программ, предназначенных для работы с PPPoE-соединениями. В пакет входят клиент, сервер, релей, различные служебные утилиты и сценарии, модуль для PPP-демона, обеспечивающий поддержку соединений PPPoE в режиме ядра Linux.

Пакет написан Дэвидом Сколлом, домашняя страница проекта находится по адресу http://www.roaringpenguin.com/pppoe/.

Клиента можно использовать для подключения к сети DSL-провайдера или Ethernet-провайдера, раздающего доступ к интернет через PPPoE-соединения. Сервер и агент ретрансляции можно использовать для построения серверов доступа небольших Ethernet-провайдеров.

2. Переводы man-страниц

2.1. man pppoe(8) - PPPoE-клиент пространства пользователя
2.2. man pppoe-server(8) - PPPoE-сервер пространства пользователя
2.3. man pppoe-relay(8) - PPPoE-агент ретрансляции пространства пользователя
2.4. man pppoe-sniff(8) - поиск в сети нестандартных кадров PPPoE
2.5. man pppoe-connect(8) - сценарий для управления каналом PPPoE
2.6. man pppoe-start(8) - сценарий для установки канала PPPoE
2.7. man pppoe-stop(8) - сценарий для закрытия канала PPPoE
2.8. man pppoe-setup(8) - сценарий для настройки PPPoE-клиента Roaring Penguin
2.9. man pppoe-status(8) - сценарий просмотра состояния канала PPPoE
2.10. man pppoe.conf(5) - файл конфигурации, используемый pppoe-start(8), pppoe-stop(8), pppoe-status(8) и pppoe-connect(8)
2.11. man pppoe-wrapper(1) − SUID-посредник для включения и отключения PPPoE-соединений

Переводы страниц руководства выполнены на сайте коллективных переводов http://translated.by. Несмотря на то, что это сайт коллективных переводов, в переводе мне никто не помогал, поэтому все переводы были выполнены мной.

Результаты перевода размещены на сайте http://manpages.ylsoftware.com/. Автор сайта http://ylsoftware.com/ Вадим Калинников aka MooSE любезно предложил место для размещения моих переводов man-страниц.

Несмотря на то, что в названии страниц 2.1-2.3 написано, что программы работают в пространстве пользователя, из самой документации чётко видно, что каждая программа может работать в связке с модулем ядра Linux.

На некоторых системах можно встретить сценарии 2.5-9 под именами, в которых pppoe заменено на adsl: adsl-connect, adsl-start, adsl-stop, adsl-setup и adsl-status. По содержанию это абсолютно те же самые сценарии.

Использования сценариев и конфигурационного файла, описанных в пунктах 2.5-2.11, на мой взгляд, следует избегать. В большинстве систем обычно имеются собственные сценарии настройки соединений точка-точка.

В частности, в Debian PPPoE-соединения нужно настраивать точно так же, как и любые другие PPP-соединения, создав соответствующий файл в каталоге /etc/ppp/peers. В этом файле нужно указать все необходимые опции демона pppd. Управлять соединениями можно с помощью сценариев pon и poff. Подробнее настройки рассмотрены ниже.

3. Модуль rp-pppoe.so

Перед тем, как приступить к описанию настройки, я хочу рассказать о модуле rp-pppoe.so демона pppd. Этот модуль работает в связке с модулем ядра Linux для поддержки PPPoE-соединений.

Так как при обработке пакетов PPPoE программой, работающей в пространстве пользователя, происходит постоянное переключение из режима ядра в режим пользователя и обратно, довольно большая часть процессорного времени уходит собственно на переключения: на сохранение и восстановление контекста ядра и контеста задачи.

При обработке PPPoE-пакетов драйвером ядра переключений контекста не происходит. Это позволяет добиться высокой производительности PPPoE-содеинений и сильно снизить нагрузку на центральный процессор.

Модуль rp-pppoe.so входит в состав пакета pppd, однако документацию на него мне найти не удалось. Поэтому я решил заглянуть в webgit и посмотреть исходники плагина. На странице по ссылке http://git.ozlabs.org/?p=ppp.git;a=blob;f=pppd/plugins/rp-pppoe/plugin.c;h=e94494b96cc08587e05def9f7f1ec5023dc8bd9a;hb=HEAD я нашёл следующие опции:

3.1. device name - PPPoE device name

Первая опция не имеет названия. Её значение должно быть указано сразу после строчки подключения плагина. В ней передаётся имя Ethernet-интерфейса, подключенного к ADSL-модему.

Эта опция соответствует опции -I pppoe-клиента, работающего в пространстве пользователя.

3.2. rp_pppoe_service - Desired PPPoE service name

Желаемое имя службы PPPoE.

Соответствует опции -S pppoe.

3.3. rp_pppoe_ac - Desired PPPoE access concentrator name

Желаемое имя концентратора доступа PPPoE.

Соответствует опции -C pppoe.

3.4. rp_pppoe_sess - Attach to existing session (sessid:macaddr)

Подключиться к существующему сеансу идентификатор_сеанса:mac_адрес.

Соответствует опции -e pppoe.

3.5. rp_pppoe_verbose - Be verbose about discovered access concentrators

Сообщать об обнаруженных концентраторах доступа.

Соответствует опции -A pppoe, однако не предназначена для интерактивного использования, т.к. информация будет оправляться в журнал, а не на стандартный вывод.

3.6. pppoe-mac - Only connect to specified MAC address

Подключаться только к указанному MAC-адресу.

У этой опции нет аналогов в pppoe.

4. Настройка PPPoE-интерфейсов в Debian

Произведём настройку интерфейсов. В файл /etc/network/interfaces впишем следующие строки:
auto eth0
iface eth0 inet manual

auto dsl-provider
iface dsl-provider inet ppp
  pre-up /sbin/ifconfig eth0 up
  provider dsl-provider
eth0 - Ethernet-интерфейс, к которому подключен кабель от провайдера.
dsl-provider - имя файла в каталоге /etc/ppp/peers/ с настройками подключения к провайдеру.

Эти настройки заставят систему пытаться установить PPPoE-соединение сразу после загрузки компьютера. Чтобы соединение было успешно установлено, нужно прописать настройки в файле /etc/ppp/peers/dsl-provider. Настроить PPPoE-соединение можно одним из двух способов: с использованием описанного выше модуля rp-pppoe.so, работающего совместно с PPPoE-модулем ядра или используя pppoe-клиент, работающий в пространстве пользователя.

5. Настройка подключения с использованием модуля rp-pppoe.so

Сначала нужно убедиться, что ваше ядро имеет поддержку модуля PPPoE. Попробуем загрузить PPPoE-модуль ядра вручную:
# modprobe -q pppoe
Теперь посмотрим, существует ли файл /proc/net/pppoe. Если модуль был вкомпилирован в ядро статически или модуль успешно загрузился, то этот файл должен появиться. Если нет - нужно разбираться с конфигурацией вашего ядра. Не будем отвлекаться на это, поскольку подавляющее большинство современных дистрибутивов Linux позволяет загрузить этот модуль приведённой выше командой.

Теперь займёмся настройкой подключения. Для этого в файле /etc/ppp/peers/dsl-provider пропишем настройки подключения:
# Здесь указываем имя пользователя, с которым pppd будет подключаться к dsl-провайдеру.
# Пароль для соединения будет взят из файла /etc/ppp/pap-secrets или /etc/ppp/chap-secrets
user "ваш_логин"

# Указываем загрузить модуль
plugin rp-pppoe.so

# Указываем интерфейс, к которому подключен модем
eth0

# Говорим, что провайдер выдаёт IP-адрес динамически
noipdefault

# Пытаемся получить IP-адреса DNS-серверов провайдера
usepeerdns

# Использовать это соединение как маршрут по умолчанию
defaultroute

# Заставить pppd переподключаться при обрыве соединения
persist

# Не запрашивать пароль у удалённого партнёра
noauth

Далее в файле /etc/ppp/pap-secrets или /etc/ppp/chap-secrets нужно указать имя и пароль для подключения:
ваш_логин * ваш_пароль *
Имя используемого файла зависит от метода аутентификации, затребованного PPPoE-сервером, но в большинстве случаев это будет файл chap-secrets.

Теперь можно воспользоваться обычными для Debian командами pon для установки подключения и poff для закрытия подключения:
# pon dsl-provider
# poff dsl-provider
6. Настройка подключения с использованием pppoe-клиента, работающего в пространстве пользователя

Файл /etc/ppp/peers/dsl-provider в этом случае практически идентичен предыдущему, за исключением того, что теперь вместо опции plugin используется опция pty, запускающая программу-посредник pppoe:
user ваш_логин
pty "pppoe -I eth0 -T 80 -m 1452"
noipdefault
usepeerdns
defaultroute
persist
noauth
Как и в предыдущем случае, для установки и закрытия подключения можно воспользоваться командами pon и poff:
# pon dsl-provider
# poff dsl-provider
За кадром остались настройка PPPoE-сервера и релея. Возможно я когда-нибудь за них возьмусь и дополню статью соответствующими разделами.

Ссылки на использованные для подготовки статьи материалы:
  1. Домашняя страница RP-PPPoE
  2. Сайт коллективных переводов
  3. Страницы руководства Debian
  4. Мой проект перевода страниц руководства
  5. Web-интерфейс Git-репозитория программы pppd
  6. Настройка PPPoE-соединений в Debian
  7. Настройка pppoe в Debian GNU/Linux на примере провайдера TeNeT

7 комментариев:

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

Интересная статейка. Вопрос в догонку, как передать параметры в модуль, если использовать кернелмоде?

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

Модуль ядра PPPoE работает в связке с плагином pppd, который называется rp-pppoe.so. Этот плагин парсит опции pppd и находит среди них те, которые относятся к нему. Поэтому чтобы передать опции rp-pppoe.so, достаточно прописать их в файл опций pppd.

Вообще же модуль ядра сам по себе не принимает никаких опций. Плагин rp-pppoe.so самостоятельно занимается поиском сервера доступа и сервиса с нужным именем, согласует подключение, а затем передаёт в ядро структуру, соответствующую настройкам уже установленного PPPoE-соединения.

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

Спасибо за статью, очень помогла, вот также кусок из файла doc/KERNEL-MODE-PPPOE:

The rp-pppoe.so plugin adds the following command-line options to pppd:

ethXXX -- Use interface ethXXX as Ethernet interface
brXXX -- Use interface brXXX as Ethernet interface
nic-XXXX -- Use interface XXXX as the Ethernet interface

rp_pppoe_service SERVICE_NAME -- Specify desired service name
rp_pppoe_ac NAME -- Specify desired access concentrator name
rp_pppoe_verbose 0|1 -- Print names of access concentrators

rp_pppoe_sess nnnn:aa:bb:cc:dd:ee:ff -- Attach to existing session 'nnnn'
on AC with Ethernet address aa:bb:cc:dd:ee:ff
This skips the discovery phase.

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

подскажите как сделать, что бы сервер обрабатывал любые service_name(имя службы) абонента.
default_realm - это для пустых И.С.
файл realms не походит , абоненты пишут туда черти-что.

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

Правильнее будет воспитать абонентов. Но если вам хочется испортить себе жизнь, то можно залезть в исходники.

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

Патч для pppoe-server 3.10 (3.11 легко пропатчить по аналогии), позволяющий обрабатывать любые сервиснэймы http://dl.dropbox.com/u/943974/tmp/pppoe-server.c.patch

Mikhail Krylatykh комментирует...

Проходил мимо, забрал rp_pppoe_ac NAME. Большое спасибо, полегчало. =)