Не работает PPTP VPN?

pptp poptopsНастройка VPN-канала типа PPTP в *nix-системах традиционно считается нетривиальной задачей, связанной с кучей различных проблем, неправильной настройкой и т.д. В этой статье я постараюсь собрать воедино все проблемы, которые могут возникнуть, и подскажу что делать в каждой ситуации.

1. Попингуйте PPTP-сервер

Убедитесь, что PPTP-сервер возвращает ответ на ICMP echo запрос. Если ответ приходит, то уже хорошо – вы можете связаться с сервером. Если же ответа не приходит, то это еще ни о чем не говорит – ICMP-пакеты могут фильтроваться файрволлом сервера.

# ping pptpserver

2. Сделайте трейс до PPTP-сервера

Убедитесь, что traceroute до сервера проходит. Если и правда проходит, то аналогично с пингом – у вас есть связь на уровне сети. Если же трассировка не проходит, опять же, это ни о чем не говорит, т.к. может фильтровать файрволл.

# traceroute pptpserver

3. Проверьте порт 1723 на PPTP-сервере

Убедитесь, что можно подключиться на служебный TCP/IP-порт PPTP-сервера. Если telnet проходит нормально, то полдела сделано. Если же подключение “висит”, нужно чинить именно эту проблему (например, настройки своего файрволла). Вот так выглядит нормальный рабочий вывод telnet:

# telnet pptpserver 1723
Trying 91.229.176.7...
Connected to pptpserver.
Escape character is '^]'.

4. Проверьте работу протокола GRE

Проверьте, что вы можете обмениваться GRE-пакетами между PPTP-сервером и клиентом (т.е. вами). Для этого запустите сниффер пакетов, например tcpdump, в момент создания туннеля. Вы должны увидеть соединение на порт 1723, за которым последует обмен GRE-пакетами в обеих направлениях. Если вы новичок в tcpdump, вот краткие инструкции.

Чтобы определить, в какой точке маршрута GRE-пакеты теряются;

Обратите внимание: при сегодняшнем засилье дешевых маршрутизаторов потребительского класса, утилиты hping2 и GRE-трейс могут работать некорректно. Причина этого – то, что большинство NAT-маршрутизаторов используют контроль трафика с учетом состояний управляющего PPTP-соединения для определения перенаправления GRE-пакетов. Вам лучше сконцентрироваться на анализе GRE-трафика в конечных точках 🙂

Наиболее распространенными причинами, по которым не работает GRE, являются:

  • Файрволлы и шлюзы
    Промежуточные хосты на пути между клиентом и сервером могут быть настроены на блокировку протокола GRE. Использование traceroute программ GRE-протокола, упомянутых выше, может выявить хост, ставшего причиной блокировки.
    В некоторых версиях Linux поможет загрузка модуля nf_nat_pptp:

    # modprobe nf_nat_pptp
    
  • Локальные правила фильтрации
    На самом клиенте может быть настроена блокировка приема или отправки GRE-пакетов. Проверьте правила iptables (или какой там у вас файрволл).
  • Несколько одновременных подключений через NAT
    Если у вас NAT-маршрутизатор, например, DSL-роутер, который в глобальной сети представляет один IP-адрес, тогда активным может быть лишь одно PPTP-соединение. PPTP-сервер примет лишь одно соединение.
    Запуск второго туннеля на другой IP-адрес (т.е. на другой PPTP-сервер) также может не состояться, если система NAT на маршрутизаторе не в состоянии различить два отдельных PPTP-соединения. От этого может даже упасть первое соединение.
  • Неправильные настройки PPTP-сервера
    Если PPTP-сервер не может запустить демона pppd, по причине синтаксической ошибки в конфигурационном файле или в аргументах командной строки, внешне это выглядит как потеря GRE-пакетов со стороны сервера. Внимательно просмотрите логи сервера. Для проверки настроек полезно запускать pppd на сервере вручную.

5. Проверьте поддержку MPPE

Поддержка шифрования MPPE необходима, если вы собираетесь подключаться, например, к Microsoft Windows VPN Server, либо просто хотите иметь зашифрованный канал. Для версий PPP 2.4.2 и более поздних MPPE поставляется в виде модуля ядра Linux, и в виде патча для PPP 2.4.0. Чтобы шифрование MPPE корректно работало, необходимо выполнение обеих следующих пунктов.

6. Поддержка MPPE в ядре

Проверьте, что модуль MPPE загружен:

# modprobe ppp-compress-18
# modprobe ppp_mppe

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

  • Вы не запустили команду depmod -a после загрузки RPM-файла kernel-mppe
  • Модуль MPPE не существует в соответствующем каталоге /lib/modules
  • Существующий модуль MPPE не может быть загружен по причине конфликта версий
  • В системе остался старый файл mppe.o, поэтому новый файл ppp_mppe.o не может загрузиться (выводимая ошибка “init_module: File exists”)
  • Модуль ppp_generic не может активировать модуль MPPE, хотя и нашел его. Возможно, у вас используется PPP-MPPE 2.4.0, а в файле /etc/modules.conf отсутствует запись alias ppp-compress-18 mppe
  • Модули PPP статически скомпилированы в ядро (чтобы MPPE работал как модуль, они также должны быть скомпилированы в виде модулей)
  • Не загружен модуль ppp_async (хотя pptp в своей работе не использует последовательный порт, но модуль ppp_async необходим для передачи данных по псевдо-терминалам)

7. Поддержка MPPE в pppd

Проверьте, что программа pppd поддерживает MPPE. Это можно сделать, поискав строки, содержащие ключевое слово mppe. Если таких строк не наблюдается, нужно найти версию pppd с поддержкой MPPE.

# strings `which pppd`|grep -i mppe|wc --lines

Если поддержки MPPE нет, то в консоль выведется число 0. Если же поддержка есть, то число будет в районе 40.

Это вольный перевод статьи PPTP Client – Fault Tree

Похожие статьи

Leave a Reply

Your email address will not be published. Required fields are marked *