Skip to content


Строим VPN-сервер на основе pptpd

Eupalinos tunnel at Samos islandVPN расшифровывается как Virtual Private Network, а PPTP – это Point-to-Point Tunelling Protocol, используется чаще всего для организации защищенного подключения удаленных пользователей во внутреннюю сеть компании через публичные сети, такие как Интернет, а также некоторыми Интернет-провайдерами с ограниченным адресным пространством для экономии "белых" IP-адресов при предоставлении услуги доступа в Интернет. Далее описиан пошаговый алгоритм настройки VPN-сервера:

  1. Качаем и устанавливаем пакет pptpd, подходящий для нашей системы. Для моей CentOS 5.5 i386 это выглядело так:
    rpm -ivh http://poptop.sourceforge.net/yum/stable/packages/pptpd-1.3.4-2.rhel5.i386.rpm
  2. В файл /etc/ppp/chap-secrets дописываем информацию о пользователях, которым необходим удаленный доступ:
    $ cat /etc/ppp/chap-secrets
    # Secrets for authentication using CHAP
    # client      server          secret           IP addresses
    user1         pptpd           passwOrD1        10.0.10.2
    user2         pptpd           qWeRPDW2a        10.0.10.3
  3. Проверяем, что в ядре включен форфардинг пакетов между интерфейсами, если нет – включаем:
    echo 1 > /proc/sys/net/ipv4/ip_forward
    sysctl -w net.ipv4.ip_forward=1
  4. Проверяем, что в firewall-е открыты подключения извне на TCP-порт 1723 и что разрешен протокол #47:
    /sbin/iptables -I INPUT -p tcp --dport 1723 -j ACCEPT
    /sbin/iptables -I INPUT -p 47 -j ACCEPT
  5. Проверяем, что в файле /etc/ppp/options.pptpd присутствуют следующие опции:
    name pptpd
    refuse-pap
    refuse-chap
    refuse-mschap
    require-mschap-v2
    require-mppe-128
    ms-dns 10.0.0.253
    ms-dns 10.0.0.252
    proxyarp
    lock
    nobsdcomp
    novj
    novjccomp
    nologfd

    Опции ms-dns – это те DNS-сервера, которые выдаются клиенту. Нужно изменить на те, которые реально используются в Вашей сети. Если клиент в состоянии использовать DNS-сервера (по умолчанию клиент получит в качестве шлюза свой IP-адрес, который прописан в файле chap-secrets и DNS-сервера по этой причине могут стать недоступны), которые он использовал до установки vpn-подключения, эти опции можно убрать.

  6. Редактируем /etc/pptpd.conf, нужно чтобы в нем были следующие строки:
    option /etc/ppp/options.pptpd
    logwtmp
    localip 10.0.0.1
    remoteip 10.0.0.2-20

    Параметры localip и remoteip изменяем в соответствии с IP-адресацией в Вашей сети.

  7. Запускаем сервис:
    /etc/init.d/pptpd start
  8. Включаем автозагрузку сервиса при старте системы:
    /sbin/chkconfig pptpd on
  9. Пробуем подключаться. Если в качестве клиента Windows XP и имеются проблемы с подключением, то в настройках подключения на вкладке "Безопасность" нужно снять галочку "Требуется шифрование данных".

Возможные проблемы:

  1. 1. Если какая-то машинка за NAT-ом испытывает трудности с подключением к внешнему VPN-серверу и винда показывает ошибку №619, то стоит попробовать включить модуль ядра ip_nat_pptp на linux-роутере, который исполняет NAT:
    modprobe ip_nat_pptp
  2. Если в логе (/var/log/messages) сервера с pptpd имеется нечто такое
    Feb 17 08:09:29 zeon pppd[28671]: Plugin /usr/lib64/pptpd/pptpd-logwtmp.so is for pppd version 2.4.3, this is 2.4.4

    то наиболее простым решением является убирание опции logwtmp из файла /etc/pptpd.conf. Это приведёт к тому, что сеансы связи клиентов не будут отбражаться командой last (которая как раз и работает с /var/log/wtmp). Ну а правильным решением будет найти rpm-ку соответсвующую вашей системе или пересобрать pptpd руками из исходников.

  3. Если в логе (/var/log/messages) сервера с pptpd наблюдается

    Feb 17 11:18:12 zeon kernel: pptpctrl[30130]: segfault at 00000000 rip 005a34b0 rsp ffe60810 error 4

    а клиенты на windows-машинках при подключении получают ошибку 800, то, скорей всего, исчерпался лимит одновременных подключений, который задаётся опцией remoteip в файле /etc/pptpd.conf. Такой segfault у меня был когда в /etc/pptpd.conf я сдуру втулил строчку "remoteip 192.168.0.2-192.168.0.254" (пускало только первого юзера, а все последующие получали ошибку 800 и segfault в логе сервера). После того, как заменил на "remoteip 192.168.0.2-254" всё заработало как надо.

Posted in *nix, Howto.

Tagged with , , , , .


4 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Admin says

    А настройка VPN-клиента описана тут: http://www.posix.ru/network/vpn_linux/

  2. Вася says

    10 статья уже про VPN и без костылей ниче не работает

  3. Толян says

    Если надо потюнить MTU, то надо создать файл

    /etc/ppp/ip-up.local примерно вот такого содержания:

    #!/bin/bash
    NEW_MTU_VALUE=1446
    /sbin/ifconfig "$1" mtu $NEW_MTU_VALUE
    logger "MTU set to $NEW_MTU_VALUE for device $1"

    Ну и про chmod +x не забыть.

    Без этого действа у меня pptpd на CentOS 6 клиенту с Win 7 почему-то выдавал MTU 1396, нагло игнорируя прописанное в /etc/ppp/options.pptpd. И у клиента некоторые сайты из-за этого не открывались.

  4. инвестор says

    Спасибо, статейка пригодилась. Настраивал сегодня это дело под CentOS 7 по этому мануалу, все заработало. Правда, пришлось подгрузить модуль ядра nf_nat_pptp на стороне сервера - без этого винда (win XP и win 7) показывали ошибку 619. В статье об этом не упомянуто вроде.

You must be logged in to post a comment.