[pptpd] Простой VPN-сервер на базе Ubuntu+pptpd

Приспичило поднять VPN-сервер, с которым смогли бы работать все устройства (Android, Windows) потому, что старый добрый VPN поднятый на базе Cisco работал исключительно через специальное приложение-клиент. Нам хотелось работать просто и без постороннего ПО, пусть даже и просто запускаемого на стороне клиента без всяких установок. Решение было найдено довольно быстро, а главное бесплатно.

Для основы сервера была выбрана Ubuntu Server 14.04 LTS, а в качестве демона VPN был выбран pptpd. Процесс установки Ubuntu я описывать не буду потому, что это проще чем кажется. Все действия производились на виртуальной машине, в которой из плюшек было только наличие двух сетевых адаптеров, а все остальное на усмотрение. После установки и обновления системы приступаем к работе над VPN-сервером. Для начала установим все что нужно (на всякий случай: вы либо уже под рутом как и я, либо все делаете от рута через sudo). Установим pptpd:

apt-get install pptpd

Разрешаем IP-forwarding. Для этого редактируем файл /etc/sysctl.conf и в нём либо расскоментируем, либо добавляем следующую строку, если таковая отсутствует:

net.ipv4.ip_forward = 1

Для принятия изменений в терминале командуем:

sysctl -p

Правим файл /etc/pptpd.conf и приводим его к следующему виду:

option /etc/ppp/pptpd-options  
logwtmp  
localip 172.16.10.1  
remoteip 172.16.10.10-100

Где localip — IP виртуального сетевого интерфейса ppp0. Не нужно прописывать сюда внешний IP сервера, или IP других сетевых интерфейсов сервера. remoteip — диапазон клиентских адресов в количестве девяносто (от 172.16.10.10 и до 172.16.10.100), а так же (через запятую) выделенные адреса (если таковые необходимы). В моём случае выделенный адрес один. Вы можете указать здесь любое приемлемое значение.

Например:

localip 172.16.10.1  
remoteip 172.16.10.1-100

В таком случае динамичные адреса, раздаваемые клиентам присутствуют в количестве ста штук и два адреса зарезервированы.

Далее редактируем файл /etc/ppp/chap-secrets:

user1 pptpd password "*"
user2 pptpd password "172.16.10.15"

В файле у нас два пользователя user1 и user2, password — пароли пользователей, звёздочка в кавычках говорит о том, что user1 получит свободный IP из указанного в /etc/pptpd.conf диапозона, а за user2 закреплён выделенный адрес. Соблюдение синтаксиса обязательно.

Редактируем файл /etc/ppp/pptpd-options:

name pptpd  
refuse-pap  
refuse-chap  
refuse-mschap  
require-mschap-v2  
require-mppe-128  
ms-dns 8.8.8.8  
ms-dns 8.8.4.4  
proxyarp  
nodefaultroute  
lock  
nobsdcomp  
novj  
novjccomp  
nologfd  
noipx  
mtu 1400  
mru 1400

Где ms-dns — DNS сети. Указаны публичные адреса Google, но можно выставить свои, если таковые имеются. MTU и MRU по умолчанию установлены в значение 1500. Если удалить эти две строки, то будет использоваться значение по умолчанию. В моём случае при значениях по умолчанию наблюдается большая потеря пакетов. То есть к этим строкам подход индивидуальный. Всё зависит от настроек клиентской стороны и от скорости соединения в целом.

Перезагружаем pptp сервер:

service pptpd restart

Проверяем:

netstat -alpn | grep :1723

Если получаем нечто похожее на то, что показано ниже, то всё работает как надо.

netstat -alpn | grep :1723
tcp 0 0 0.0.0.0:1723 0.0.0.0:* LISTEN 1756/pptpd

Создаём правила NAT для iptables:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE && iptables-save

Если хотим, чтоб клиенты видели друг друга в локальной сети и могли обмениваться файлами, то прописываем следующие правила:

iptables --table nat --append POSTROUTING --out-interface ppp0 -j MASQUERADE  
iptables -I INPUT -s 10.0.0.0/8 -i ppp0 -j ACCEPT  
iptables --append FORWARD --in-interface eth0 -j ACCEPT

Сохраняем:

iptables-save

На этом все! Profit!

Обсудить статью в чате TG или в Slack