четверг, 10 сентября 2009 г.

Настройка PPTP-сервера

На работе возникла необходимость под Linux настроить PPTP-сервер для Windows-клиентов. На всякий случай решил описать пример настройки.

Ставим ppp и pptpd:
# aptitude install ppp pptpd
Настраиваем сам сервер pptpd, прописывая в его конфигурационном файле /etc/pptpd.conf:
option /etc/ppp/pptpd-options
logwtmp
localip 10.3.17.1
remoteip 10.3.17.2-254
Опция localip задаёт IP-адрес на локальной стороне создаваемых туннелей, опция remoteip - задаёт соответственно диапазон IP-адресов, которые будут выдаваться клиентам, в качестве адресов с их стороны.

Настроим pppd для туннелей, поднимаемых сервером pptpd. Зададим настройки в файле /etc/ppp/pptpd-options:
10.3.17.1:
name pptpd
refuse-pap
refuse-chap
refuse-mschap
require-mschap-v2
require-mppe-128
ms-dns 10.3.1.3
ms-dns 10.3.1.4
ms-wins 10.3.1.4
ms-wins 10.3.1.5
nodefaultroute
lock
nobsdcomp
idle 900
Первая опция задаёт IP-адрес локальной стороны туннеля (почему-то настройка, указанная в /etc/pptpd.conf не действует).

Опция name pptpd задаёт имя сервера. Оно будет использоваться для поиска записей в файле паролей (см. ниже).

Опции refuse-pap, refuse-chap, refuse-mschap, require-mschap-v2 отклоняют различные способы аутентификации, требуя использовать только аутентификацию по MS-CHAPv2.

Опция require-mppe-128 указывает на необходимость шифрования передаваемых по туннелю данных с помощью протокола MPPE с длиной ключа 128 бит.

Опции ms-dns 10.3.1.3 и ms-dns 10.3.1.4 задают адреса DNS-серверов, которые будут сообщены подключившемуся клиенту.

Опции ms-wins 10.3.1.4 и ms-wins 10.3.1.5 задают адреса WINS-серверов, которые будут сообщены подключившемуся клиенту.

Опция nodefaultroute заставляет pppd не устанавливать маршрут по умолчанию через подключившегося клиента.

Опция lock создаёт файл блокировки интерфейса, который позволяет избежать попыток использовать этот интерфейс другими соединениями, пока он используется.

Опция nobsdcomp отключает сжатие потока данных по алгоритму BSD.

Опция idle задаёт количество секунд простоя, по истечении которых простаивающее соединение будет отключено.

Теперь нужно прописать клиентов в файле паролей /etc/ppp/chap-secrets:
elvira          pptpd   "111111"                10.3.17.23
#kon_sv         pptpd   "passwd"                *
igor            pptpd   "paroli"                10.3.17.28
Символ решётки говорит о том, что данная запись отключена (закомментирована).

Символ звёздочки говорит о том, что этому клиенту будет выдан любой свободный адрес из диапазона 10.3.17.2-254, который указан в настройках pptpd.

Клиентам, для которых указан IP-адрес в последней колонке, всегда будут выдаваться этот IP-адрес.

Теперь перезапускаем PPTP-сервер, чтобы настройки вступили в силу:
# /etc/init.d/pptpd restart
Если хочется выполнять какие-то специфические для PPTP-клиента команды, то можно создать сценарии /etc/ppp/ip-up.d/pptp-clients и /etc/ppp/ip-down.d/pptp-clients, шаблон для которых представлен ниже:
#!/bin/sh

case "$PPP_IPPARAM" in
  "pptp-clients")
    # ваши команды
  ;;
  *)
    echo "No PPP_IPPARAM defined"
  ;;
esac
Теперь в файле /etc/pptpd.conf нужно прописать опцию noipparam, которая заставит pptp-сервер не передавать в качестве ipparam IP-адрес, с которого было установлено подключение.

Чтобы отличать pptp-клиентов от других PPP-подключений, добавим опцию ipparam в файл /etc/ppp/pptpd-options:
ipparam "pptp-clients"
В случае если ipparam будет равен pptp-clients, выполнятся указанные для этого случая команды. Например таким образом можно настраивать разрешающие правила в фаерволле. В том числе можно делать дополнительные проверки, идентифицируя клиента по IP-адресу внутри тоннеля или по логину, с которым клиент подключился.

Другие источники информации по этой теме:
  1. Настройка PPTP-сервера в Debian/Ubuntu
  2. Русский перевод man pppd(8) - демон протокола точка-точка (Point-to-Point Protocol Daemon)
  3. Русский перевод man pptpd(8) - PPTP VPN-демон
  4. Русский перевод man pptpd.conf(5) - конфигурация PPTP VPN демона
Последняя правка: 22-09-2009

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

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

Спасибо большое за статью!
Но как сделать чтобы pptpd сервер работал с другими сетями (за Natoом)?
В логах постоянные сообщения типа
GRE: read from PTY failed: status =-1 error = input output error usually caused by unexpected termination of pppd, check option syntax
PTY read of GRE write failed (pty, gre) = (6,7)
Reaping child PPP

У клиента 619 ошибка
В пределах одной сети все работает.

Пробовал добавлять в ядро параметры
nf_conntrack_pptp, nf_nat_pptp, но не помогает. С iptables тоже все в порядке
Cистема Debian Squeeze, связь через adsl модем с интернетом, удаленные клиенты тоже выходят с модема

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

Бывает, что провайдер запрещает GRE и такая ошибка возникает. Еще может быть проблема в firewall.