Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #113, МАЙ 2008 г.

Прорыв сквозь PPP

Юрий «bober» Раззоренов (zloy.bobr@gmail.com, linuxforum.org.ua)

Хакер, номер #113, стр. 113-090-1

Настраиваем PPPoE и PPTP подключения в Linux

C появлением высокоскоростных соединений широкое распространение получили подключения по протоколам PPPoE и PPTP. Как правило, документация на сайтах интернет-провайдеров заточена под Windows. Что делать брату-линуксоиду? Не сидеть же, сложа руки. Попробуем разобраться, как настроить клиентский PPPoE/PPTP, взяв в качестве примера дистрибутив KUbuntu.

Настройка PPPoE соединения

PPPoE (Point-to-Point Protocol over Ethernet) – протокол передачи фреймов PPP через Ethernet соединения. Используется для подключения с традиционной связкой логин/пароль и поэтому популярен в xDSL и тому подобных сервисах, где нет встроенных механизмов аутентификации пользователя.

В современных дистрибутивах есть все, что нужно для работы с ним (учитывая, что в ядре этот протокол поддерживается, начиная с версии 2.3). Однако командой «grep PPP /usr/src/linux/.config» все равно стоит проверить параметры ядра, относящиеся к PPP.

Подключение по PPPoE реализовано подобно обычному PPP соединению с использованием демона pppd – так что опыт модемных разборок лишним не будет. Чтобы установить PPPoE соединение, потребуется наличие в системе следующих пакетов: ppp, pppoe и pppoeconf. По умолчанию в KUbuntu они уже инсталлированы:

$ dpkg -s pppoeconf

Package: pppoeconf

Status: install ok installed

В RPM дистрибутивах нужно ввести «rpm –qa | grep ppp». Следующим шагом настраиваем Ethernet интерфейс или ставим драйвер для ADSL модема (иначе дальнейшие действия не имеют смысла). Настроить Ethernet можно, зайдя в «Системные настройки» -> «Настройка сети». Для ручной настройки открываем файл /etc/network/interfaces.

$ sudo mcedit /etc/network/interfaces

# Если IP-адрес назначается динамически с помощью DHCP, прописываем:

iface eth0 inet dhcp

# Статический IP устанавливается так:

iface eth1 inet static

address 192.168.0.25

network 192.168.0.0

gateway 192.168.0.1

netmask 255.255.255.0

mtu 1492

В файле /etc/resolv.conf обязательно указываем адрес хотя бы одного DNS сервера (а лучше двух):

$ sudo mcedit /etc/resolv.conf

nameserver 111.33.44.55

nameserver 222.44.55.66

После того, как все готово, переходим к настройке клиентского PPPoE соединения. Вариантов опять же несколько. Самый простой – ручное редактирование двух файлов: /etc/ppp/pap-secrets (либо chap-secrets, если провайдер использует CHAP аутентификацию; формат *-secrets файлов одинаков) и /etc/ppp/peers/dsl-provider. Имя второго используется в качестве аргумента команды pon и может быть выбрано любое.

В состав (K)Ubuntu для удобства включена утилита pppoeconf. Запускаем «sudo pppoeconf» – появится псевдографическое меню настройки. Следуй указаниям утилиты, в большинстве случаев просто подтверждая предлагаемые по умолчанию параметры. Утилита попытается сама найти подходящий Ethernet интерфейс, используя пакеты PADI (PPPoE Active Discovery Initiation), с помощью которых идет поиск активных концентраторов доступа. Далее pppoeconf сохраняет оригинальный файл dsl-provider. После чего вводим логин и пароль, разрешаем, если нужно, автоматическое соединение при загрузке системы… вот и все. Для подключения предлагается использовать скрипт /usr/bin/pon. Если заглянуть внутрь, можно увидеть, что, кроме проверки наличия некоторых файлов, фактически выполняется всего одна команда «/usr/sbin/pppd call $PROVIDER».

В общем виде вызов pon выглядит так:

pon [OPTIONS] [provider] [arguments]

В качестве аргумента provider указывается файл из каталога /etc/ppp/peers. По умолчанию используется provider (это и есть переменная $PROVIDER). В нашем случае набираем:

$ pon dsl-provider

К сожалению, везет не всегда, и порой (например, при наличии нескольких интерфейсов) приходится забуриваться в конфиги. Но ничего сложного в этом нет. Если подключиться можно только через sudo, то не надо выдумывать и мудрить, просто добавь себя в нужную группу (в Ubuntu и некоторых других дистрибутивах для этих целей используется dip).

Конфиги PPPoE

Начнем с самого простого файла /etc/ppp/pap-secrets (или chap-secrets). Открыв его, ты найдешь свои логин и пароль для соединения в таком виде (результат работы pppoeconf):

user * password

Здесь достаточно проверить правильность данных или вписать строку самому, если pppoeconf не использовался. Параметры соединения описываются в /etc/ppp/peers/dsl-provider. У меня после работы pppoeconf он принял следующий вид:

$ sudo mcedit /etc/ppp/peers/dsl-provider

noipdefault

# В таблице маршрутизации сделать данное соединение маршрутом по умолчанию

defaultroute

replacedefaultroute

hide-password

#lcp-echo-interval 30

#lcp-echo-failure 4

noauth

# Восстановить связь в случае разрыва

persist

# Использовать максимальный размер передаваемого пакета в 1492 байт

mtu 1492

usepeerdns

В принципе, все параметры заданы, – но не указано, с кем и чем соединяться, а так как интерфейсов у меня несколько, возникает путаница. Чтобы это исправить, добавим следующую строку:

pty "/usr/sbin/pppoe -I eth0 -T 80 -m 1452"

Если после работы pppoeconf заглянуть в файл /etc/network/interfaces, можно заметить появление новых строк:

auto dsl-provider

iface dsl-provider inet ppp

provider dsl-provider

# added by pppoeconf

auto eth0

iface eth0 inet manual

pre-up /sbin/ifconfig eth0 up

Если при загрузке системы не требуется автоматическое подключение по PPPoE, просто комментируем эти строки. Повторяем попытку соединения. Для контроля можно ввести команду:

$ ifconfig ppp0

ppp0 Link encap:Point-to-Point Protocol

inet addr:157.33.34.178 P-t-P:192.168.101.1 Mask:255.255.255.255

UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1480 Metric:1

RX packets:283 errors:0 dropped:0 overruns:0 frame:0

TX packets:284 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:3

RX bytes:3004 (2.9 KiB) TX bytes:2744 (2.6 KiB)

За ходом подключения можно следить в системном журнале /var/log/messages. Для этого в другой консоли перед началом подключения вводим:

$ tail –f /var/log/messages

Возможна ситуация, когда адрес есть, но доступ к ресурсам получить не удается. В этом случае, введя «route –n», убедись, что маршрутизация настроена правильно. Маршрут, помеченный как default, должен показывать на интерфейс ppp0. Если это не так, вводим «route add default ppp0» и проверяем: работает?

Настройка нескольких соединений

Бывает, что пользователям требуется работать сразу с несколькими серверами, использующими PAP (например, PPPoE и резервное модемное соединение, VPN и другие). Если логин для каждого сервиса отличается, PPP, как правило, способен сам разрулить ситуацию. Но многие предпочитают использовать один и тот же логин для всех серверов, к которым подключаются (надеюсь, хоть пароли разные). Это может вызвать траблы, поскольку демон должен правильно выбрать нужную строку из файла pap-secrets для аутентификации. Ему нужно помочь. Для начала в файле /etc/ppp/pap-secrets знак астериска '*' заменяем условным именем сервера. Примерно так:

user server1 password1

user server2 password2

Создаем два файла, взяв за основу dsl-provider. В каждом из них при помощи параметров name и remotename задаем логин и сервер для подключения.

name user

remotename server1

Теперь просто указываем нужный файл в качестве аргумента pon. Это не единственный способ. Можно, как советуют man и HOWTO, использовать свой конфиг options и подключать его при помощи параметра file. Этот вариант рассмотрим чуть дальше, при настройке PPTP.

Пакет rp-pppoe

В дистрибутивах вроде Mandriva, VectorLinux и других для настройки PPPoE предлагается более простой вариант с использованием пакета RP-PPPoE. В репозитарии Ubuntu он отсутствует, но его можно установить самостоятельно. Тем более что этот процесс сложностей не вызывает.

Качаем последнюю версию по ссылке на странице www.roaringpenguin.com/products/pppoe. Распаковывам tar.gz архив, заходим внутрь каталога и вводим: «./go-gui» или просто «./go», если первая команда откажется работать. Далее отвечаем на стандартные вопросы: логин, интерфейс, активация при загрузке, DNS, пароль, настройки межсетевого экрана. В последнем случае предлагается на выбор три варианта: NONE (отключен), STANDALONE (применяем, когда компьютер один) и MASQUERADE (когда компьютер используется в качестве сетевого шлюза). По окончании работы скрипта выводится итог:

** Summary of what you entered **

Ethernet Interface: eth1

User name: user

Activate-on-demand: No

Primary DNS: 111.33.44.55

Secondary DNS: 222.44.55.66

Firewalling: STANDALONE

На этом, собственно, установка закончена. После этого в системе можно обнаружить несколько скриптов и утилит: pppoe-relay, pppoe-setup, pppoe-start, pppoe-stop, pppoe-connect, pppoe-server, pppoe-sniff, pppoe-status, pppoe-wrapper и tkpppoe. Кстати, до версии 3.6 имена этих скриптов начинались с приставки adsl-, поэтому в более ранних дистрибутивах следует искать именно их. Да и старые HOWTO тоже нужно читать с этой поправкой.

Чтобы инициировать соединение, достаточно набрать в консоли pppoe-start; для останова – pppoe-stop; чтобы просмотреть статистику – pppoe-status. А снова запустить конфигурационный скрипт можно с помощью pppoe-setup. Для удобства настройки и подключения предлагается свой графический фронтэнд – tkpppoe.

Подключаемся по PPTP

Настройка VPN подключения по протоколу PPTP (Point-to-Point Tunneling Protocol) во многом напоминает подключение по PPPoE. До недавнего времени, из-за опасения лицензионных преследований по поводу протокола MPPE, в Linux отсутствовала нормальная поддержка PPTP, что вызывало проблемы и требовало лишних телодвижений. Полная поддержка этого протокола появилась, начиная с версии 2.6.13. Официальная была начата с 2.6.14, а в 2.6.15 уже включен модуль шифрования PPP MPPE.

Сначала, чтобы было понятней, разберем ручную настройку, а потом посмотрим на GUI.

Для поиска в репозитарии пакетов, относящихся к pptp, вводим:

$ sudo apt-cache search pptp

pptp-linux - Point-to-Point Tunneling Protocol (PPTP) Client

knet - The Knet is a frontend to pppd.

kvpnc - vpn clients frontend for KDE

network-manager-pptp - network management framework (PPTP plugin)

Клиентскую часть обеспечивает проект PPTP Client (pptpclient.sourceforge.net). Поддерживается не только Linux, но и *BSD. Этот клиент совместим со всеми серверами, работающими по протоколу PPTP: Windows VPN, Linux PopTop, Cisco PIX и некоторыми другими. Клиент не обновлялся уже около двух лет, поэтому можно без тени сомнения устанавливать то, что есть в репозитарии.

$ sudo apt-get install pptp-linux

В качестве рекомендуемых пакетов предлагался «kernel-patch-mppe». Надо сказать, что в моем случае все работало и без него, но при появлении проблем вспомни о нем. Имеет смысл поставить самое последнее ядро, где этот протокол поддерживается изначально.

Отмечу, кстати, предусмотрительность ребят из Canonical. Все нужные пакеты для подключения по PPTP находятся на CD-диске (который тебя и попросят вставить в привод после ввода команды). Поэтому если PPTP – это единственная связь с внешним миром, добывать нужные пакеты окольными путями не придется. Если диск в кэше отсутствует, добавь его, набрав команду «sudo apt-cdrom add». По запросу вставь CD и нажми <Enter>.

Теперь приступаем к редактированию конфигурационного файла:

$ sudo mcedit /etc/ppp/options.pptp

lock noauth nobsdcomp nodeflate

# Отключаем ненужные проверки

refuse-pap

refuse-eap

#refuse-chap

refuse-mschap

persist

# Количество попыток подключения в случае обрыва соединения

maxfail 10

defaultroute

replacedefaultroute

В файл /etc/ppp/chap-secrets заносим логин и пароль в виде:

user pptp password *

Если требуется войти в домен, запись должна выглядеть так:

domain\\user pptp password *

И создаем описание подключения, аналогично тому, как делали для PPPoE:

$ sudo mcedit /etc/ppp/peers/pptp

# Указываем адрес PPTP сервера

pty "pptp 10.100.0.1 --nolaunchpppd"

connect /bin/true

name user

# Идентификатор из второго поля в chap-secrets

remotename pptp

# Подключаем файл настроек

file /etc/ppp/options.pptp

#require-mppe-128

require-mppe-40

ipparam pptp

Настройки готовы. Теперь подключаемся:

$ pon pptp

И смотрим вывод команды ifconfig. Если соединение установлено и адрес получен, то считаем, что настройка прошла успешно. Но обычно PPTP требует больше возни, чем PPPoE. В случае неудачи выполняем:

$ pon pptp debug dump logfd 2 nodetach

Как результат, получим все параметры соединения и лог ошибок. Если есть необходимость в автоматическом подключении при загрузке системы, правим /etc/network/interfaces:

$ sudo mcedit /etc/network/interfaces

auto tunnel

iface tunnel inet ppp

provider pptp

Давим батоны

Для настройки и работы ты предпочитаешь программы с графическим интерфейсом? Тогда слушай. Пользователи Mandriva могут найти настройки PPPoE и PPTP в Центре Управления Mandriva Linux, выбрав «Сеть и Интернет» -> «Настройка нового сетевого интерфейса (LAN, ISDN, ADSL)». Учти, что настройка PPTP находится в меню DSL вместе с PPPoE, а не в VPN, где ее обычно начинают искать.

В KUbuntu устанавливаем пакеты:

$ sudo apt-get install network-manager-pptp kvpnc

Первый пакет – это модуль к KNetworkManager. Признаюсь, никогда его не любил и не юзал, наверное, сказывается долгое сидение в слаке, но тебе, может, он и понравится. Чтобы увидеть настройки VPN, после установки пакета нужно перезапустить NetworkManager:

$ sudo /etc/dbus-1/event.d/25NetworkManager restart

* Restarting network connection manager NetworkManager [ OK ]

$ sudo /etc/dbus-1/event.d/26NetworkManagerDispatcher restart

* Restarting network events dispatcher NetworkManagerDispatcher [ OK ]

Теперь все просто. Выбираем «Параметры» -> «Configure» и нажимаем «Добавить». В появившемся окне вводим имя соединения (затем будет именем файла в peers), вводим IP-адрес или имя сервера. Во вкладке Authentication отключаем избыточные методы аутентификации. При желании в Routing укажи DNS сервер и адреса, которые могут использовать это VPN соединение.

Проект PPTP Client предлагает утилиту pptpconfig для настройки подключения. В репозитарии Ubuntu она отсутствует. Чтобы установить ее, добавь информацию о новом репозитарии в /etc/apt/sources.list:

deb http://quozl.netrek.org/pptp/pptpconfig ./

Обновляем список пакетов, устанавливаем и запускаем:

$ sudo apt-get update

$ sudo apt-get install pptpconfig

$ sudo pptpconfig

Появится окно программы, внизу которого расположено пять вкладок. В Server указываем логин, пароль, название соединения и адрес сервера. Перейдя в Routing, можно изменить таблицу маршрутов и, например, разрешить подключаться к нашему туннелю другим компьютерам. По умолчанию берутся системные настройки DNS серверов, переопределить их для туннеля можно во вкладке DNS. В Encryption включаем (Require) используемый провайдером алгоритм шифрования. И, наконец, в Miscellaneous можно указать автоматическое подключение при запуске программы, переподключение при потере соединения и ввести дополнительные параметры для pppd и pptp. По окончании работы программа создаст все нужные файлы, о которых говорилось выше. Выбираем нужное соединение и нажимаем Start.

Программа KVpnc (home.gna.org/kvpnc) является удобным фронтэндом для многих типов VPN. Она поддерживает Cisco VPN, IPSec, PPTP, OpenVPN, L2TP и Vtun. Все настройки выполняются при помощи простого мастера, вызываемого через «Profile» -> «New Profile (Wizard)», который в пошаговом режиме поможет создать новое подключение. Так, на шаге «Select the type of your VPN» выбираем тип VPN (в нашем случае – Microsoft PPTP). На следующем шаге отмечаем дополнительные параметры PPTP, вводим логин и пароль. Выбираем из раскрывающегося списка сетевое устройство, с помощью которого должно производиться подключение. В окне «Network route options» указываем: «Заменять маршрут по умолчанию».

Вот, собственно, и все по настройкам PPPoE и PPTP в современных дистрибутивах. Удачи!

Магия MTU и MSS

Параметр MTU (Maximum Transmit Unit) отвечает за максимальный размер передаваемого пакета. Если размер пакета будет больше, чем может пропустить маршрутизатор, то он будет разделен, что сразу скажется на скорости и пропускной способности. Если параметр не указать принудительно, значение будет выставлено автоматически и, увы, не всегда рационально. Рассчитывать его следует так. Максимальный размер фрейма Ethernet – 1518 байт, из них 14 – заголовок и 4 – контроль (то есть полезная нагрузка равна 1500 байт). Далее PPPoE отбирает еще 6 байт, а PPP – 2. В итоге значение MTU для PPPoE должно составлять не более 1492.

При установлении TCP соединения каждая сторона выставляет параметр Maximum Segment Size (MSS), определяющий максимальный размер TCP сегмента на всем пути. По умолчанию его значение берется, как MTU для исходящего интерфейса минус размер заголовков TCP и IP (40). Исходя из этого, максимальное значение MSS для Ethernet будет равняться 1460, а для PPPoE – 1452.

INFO

В ядро Linux 2.6.15 включен модуль шифрования PPP MPPE для подключения к PPTP серверам.

Пользователи Mandriva могут найти настройки PPPoE и PPTP в Центре Управления Mandriva Linux, выбрав «Сеть и Интернет» -> «Настройка нового сетевого интерфейса (LAN, ISDN, ADSL)».

Не забывай сохранять файлы из /etc/ppp при обновлении или установке другого дистрибутива.

В Ubuntu и некоторых других дистрибутивах для выхода в Сеть пользователь должен входить в группу dip.

Настройку GNU/Linux для работы с PPPoE и VPN мы рассматриваем на примере дистрибутива KUbuntu. Но учитывая, что база у всех одна, сказанное будет действительно и в любом другом дистрибутиве.

О настройке PPPoE в OpenBSD можно прочитать в статье «Нарезаем трафик ломтиками», опубликованной в ][акере #087.

WWW

Подробно протокол PPPoE описан в RFC 2516. Кроме того, полезной будет информация на WiKi странице ru.wikipedia.org/wiki/PPPoE.

Содержание