Настройка VPN-соединения (PPTP) в Linux.

К сожалению, на сегодняшний день настройка данного вида подключения в ОС Linux не так удобна, как, например, у ОС Windows. Однако работа в этом направлении активно ведется и скоро настройка этого вида VPN-соединения войдет в состав NetworkManager — утилиты пользователя для управления сетевыми подключениями, а в некоторых дистрибутивах эта настройка уже есть в штатных средствах. Так же существуют сторонние проекты, например KVPNC, но он перенасыщен опциями, и не работает нормально от лица обычного пользователя системы.

    Правда заключается в том, что все графические конфигураторы, и даже в каком-то смысле и в ОС Windows, являются всего лишь удобными оболочками для настройки опций и запуска консольных программ для установления соединения, а конкретно pptp и pppd, поэтому знать как их заставить работать без удобных конфигураторов может быть весьма полезным. Комменты пользователей в стиле «ну вот видишь, я же тебе говорил, это говеный и необтесанный Линукс» рассматриваться не будут, потому как, если вы заинтересовались этой системой, то должны были осознавать тот факт, что эта система абсолютно другая, и пока еще требует несколько иной, отличный от домохозяйки, более высокий уровень подготовки пользователя и желание местами немного в ней поразбираться.

Справка:

PPTP (англ. Point-to-point tunneling protocol) — туннельный протокол типа точка-точка, позволяющий компьютеру устанавливать защищённое соединение с сервером за счёт создания специального туннеля в стандартной, незащищённой, сети. PPTP помещает (инкапсулирует) кадры PPP в IP-пакеты для передачи по глобальной IP-сети, например Интернет. PPTP может также использоваться для организации туннеля между двумя локальными сетями. РРТР использует дополнительное TCP-соединение для обслуживания туннеля.

По материалам свободной Интернет-энциклопедии Wikipedia

Настройка данного вида подключения в разных дистрибутивах может отличаться, поэтому я попытаюсь дать инструкции максимально подходящие для всех пользователей разных дистрибутивов. Я пользуюсь дистрибутивом Fedora Core 9.

Рассмотрим последовательность действий, которую необходимо выполнить, для того, что-бы успешно соединиться с нашим VPN-сервером.

Адрес нашего VPN-сервера: vpn.d-group.lan

Мой компьютер находится в сети: 192.168.126.0 и имеет адрес: 192.168.126.251 .

Шлюз по умолчанию для меня: 192.168.125.254 .

Все действия необходимо производить от лица суперпользователя системы — root и выполнять их будем в консоли.

Что-бы им стать необходимо выполнить команду su —

[user@comp ~]$

[user@comp ~]$ su —

Пароль:

[root@comp ~]#

Прежде чем продолжить всего необходимо убедиться в наличии необходимых программ в системе. Нам необходимы две: pppd и pptp. Проверить можно так:

[root@den ~]# whereis pppd

pppd: /usr/sbin/pppd /usr/lib/pppd /usr/share/man/man8/pppd.8.gz

программа pppd расположена в каталоге /usr/sbin

[root@comp ~]# whereis pptp

pptp: /usr/sbin/pptp /usr/share/man/man8/pptp.8.gz

программа pptp расположена в каталоге /usr/sbin

или так:

[root@comp ~]# rpm -qi pptp

Name : pptp

Version : 1.7.1

Release : 4.fc9

Group : Applications/Internet

Summary : Point-to-Point Tunneling Protocol (PPTP) Client

Description :

Client for the proprietary Microsoft Point-to-Point Tunneling

Protocol, PPTP. Allows connection to a PPTP based VPN as used

by employers and some cable and ADSL service providers.

[root@den ~]# rpm -qi ppp

Name : ppp

Version : 2.4.4

Release : 7.fc9

Group : System Environment/Daemons

Summary : The PPP (Point-to-Point Protocol) daemon.

Description :

The ppp package contains the PPP (Point-to-Point Protocol) daemon and

documentation for PPP support. The PPP protocol provides a method for

transmitting datagrams over serial point-to-point links. PPP is

usually used to dial in to an ISP (Internet Service Provider) or other

organization over a modem and phone line.

[root@comp ~]#

Если вы увидели примерно то же самое, что и я, то значит необходимые программы установлены в вашей системе. Если же вы не нашли их у себя, то необходимо установить их с инсталляционного CD или DVD (если они там есть, иногда бывает, что их там нет).

Теперь, когда мы убедились, что все необходимое для настройки и запуска у нас есть, приступим к написанию файла настроек для pppd.

Положить его можно где угодно, однако я предпочитаю ложить все конфигурационные файлы там, где им положено лежать, а именно, файлы опций для разных ppp-соединений обычно находятся в /etc/ppp/peers

Создадим текстовый файл, назовем его, например, d-group (название может быть любым), и пропишем в нем следующие опции:

lock

name vinni

# Имя пользователя

linkname d-group

# Название соединения

bsdcomp 9,15

# По возможности включить использование алгоритма сжатия BSD

deflate 9,15

# По возможности включить использование альтернативного BSD алгоритма сжатия

 

#mtu 1460

#mru 1460

# Изменить максимальный размер передаваемого (MTU) и принимаемого (MRU) пакета,

# раскомментировать, если соединение установится, но не заработает без этой опции

defaultroute

# Получить от VPN-сервера шлюз по умолчанию и попытаться применить его

# Однако если у вас на компьютере шлюз уже был прописан до попытки установить

# vpn-соединение, то pppd не сможет его заменить, т.к. статически (ручками) прописанные

# маршруты имеют больший приоритет. Далее я более подробно опишу действия с шлюзом перед

# подключением и после.

# Сколько раз должен непройти служебный lcp-пинг между клиентом и сервером,

# что-бы pppd посчитал соединение мертвым и прекратил свою работу

lcp-echo-failure 3

# Через какой интервал в секундах посылать служебный lcp-пинг между клиентом и сервером

# для обнаружения подвисшего соединения

lcp-echo-interval 20

# Включить вывод отладочных сообщений, можно позже закомментировать

debug

# Не отсоединяться от терминала и не уходить в фон, все отладочные сообщения будут

# сыпаться на консоль

# позже тоже можно закомментировать

nodetach

После создания файла опций для нашего vpn-соединения, /etc/ppp/peers/d-group, необходимо прописать пароль для нашего соединения. Пароли для pppd обычно прописываются в двух файлах: /etc/ppp/chap-secrets и /etc/ppp/pap-secrets абсолютно одинаковым способом. Это обычные текстовые файлы, их два, потому что существуют два метода аутентификации: устаревший pap и более новый chap, и прописывать в них логин и пароль нужно так:

# Secrets for authentication using CHAP

# client server secret IP addresses

«ваш логин» * «ваш пароль»

# например

«user» * «34556457645234»

Pppd во время установления соединения посмотрит в файл опций /etc/ppp/peers, увидит там директиву: name user, потом заглянет в /etc/ppp/chap-secrets или /etc/ppp/pap-secrets, в зависимости от того, какой метод аутентификации истребует от него сервер, найдет там запись с логином user, прочитает и передаст соответствующий пароль серверу.

Собственно говоря, это и все настройки для pppd.

Теперь можно было бы попробовать подключиться к vpn-серверу командой:

[root@den ~]# pptp vpn.d-group.lan file /etc/ppp/peers/d-group

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

[root@comp ~]# pptp vpn.d-group.lan file /etc/ppp/peers/d-group

using channel 2

Using interface ppp0

Connect: ppp0 <—> /dev/pts/6

sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0xcb350925> <pcomp> <accomp>]

rcvd [LCP ConfReq id=0x1 <asyncmap 0x0> <auth chap MS-v2> <magic 0xed944e1c> <pcomp> <accomp>]

sent [LCP ConfAck id=0x1 <asyncmap 0x0> <auth chap MS-v2> <magic 0xed944e1c> <pcomp> <accomp>]

rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0xcb350925> <pcomp> <accomp>]

sent [LCP EchoReq id=0x0 magic=0xcb350925]

rcvd [CHAP Challenge id=0xf9 <94025baf2cc9f6737f886e1462250b62>, name = «pptpd»]

sent [CHAP Response id=0xf9 <f65160805ee747e47a33905918e7c200>, name = «user»]

rcvd [LCP EchoRep id=0x0 magic=0xed944e1c]

rcvd [CHAP Success id=0xf9 «S=5B04CC527040BB70E7F5A4B80D5677163812B8E0»]

CHAP authentication succeeded

sent [CCP ConfReq id=0x1 <mppe +H -M +S -L -D -C>]

rcvd [CCP ConfReq id=0x1 <mppe +H +M +S +L -D +C>]

sent [CCP ConfNak id=0x1 <mppe +H -M +S -L -D -C>]

rcvd [CCP ConfAck id=0x1 <mppe +H -M +S -L -D -C>]

rcvd [CCP ConfReq id=0x2 <mppe +H -M +S -L -D -C>]

sent [CCP ConfAck id=0x2 <mppe +H -M +S -L -D -C>]

sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 0.0.0.0>]

rcvd [IPCP ConfReq id=0x1 <addr 172.16.0.1>]

sent [IPCP ConfAck id=0x1 <addr 172.16.0.1>]

rcvd [IPCP ConfRej id=0x1 <compress VJ 0f 01>]

sent [IPCP ConfReq id=0x2 <addr 0.0.0.0>]

rcvd [IPCP ConfNak id=0x2 <addr 172.17.2.112>]

sent [IPCP ConfReq id=0x3 <addr 172.17.2.112>]

rcvd [IPCP ConfAck id=0x3 <addr 172.17.2.112>]

not replacing existing default route via 192.168.125.254

local IP address 172.17.2.112

remote IP address 172.16.0.1

Script /etc/ppp/ip-up started (pid 29579)

Script ?? finished (pid 29550), status = 0x0

Script /etc/ppp/ip-up finished (pid 29579), status = 0x0

>> not replacing existing default route via 192.168.126.254 <<

это сообщение говорит нам, что pppd получил от сервера новый шлюз по умолчанию, но не может заменить уже прописанный во время загрузки, статический шлюз по умолчанию, на новый. Что мы можем сделать, для того, что-бы обойти эту проблему ? Есть несколько вариантов, но в этом руководстве мы рассмотрим только один из них.

Для начала заглянем в таблицу маршрутизации:

[root@comp ~]# netstat -rn

Kernel IP routing table

Destination Gateway Genmask Flags MSS Window irtt Iface

192.168.125.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

0.0.0.0 192.168.125.254 0.0.0.0 UG 0 0 0 eth0

[root@comp ~]#

Обращаем внимание на последнюю строчку, в которой собственно и прописан наш шлюз по умолчанию

Что-бы все заработало как надо нужно удалить перед установкой vpn-подключения шлюз по умолчанию:

[root@comp ~]# route del default

Снова заглянем в таблицу маршрутизации:

[root@comp ~]# netstat -rn

Kernel IP routing table

Destination Gateway Genmask Flags MSS Window irtt Iface

192.168.126.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

[root@comp ~]#

Т.к. после этого наш компьютер не будет знать через кого добираться до vpn-сервера, мы ему это подскажем еще одной командой:

[root@comp ~]# route add -net 192.168.0.0/16 gw 192.168.126.254

которая означает дословно следующее — все сетевые адреса начинающиеся на 192.168. достижимы через шлюз 192.168.126.254. Соответсвенно под это правило попадет и наш VPN-сервер, имеющий адрес vpn.d-group.lan .

Еще раз посмотрим в таблицу маршрутизации:

[root@comp ~]# netstat -rn

Kernel IP routing table

Destination Gateway Genmask Flags MSS Window irtt Iface

192.168.126.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

192.168.0.0 192.168.126.254 255.255.0.0 UG 0 0 0 eth0

[root@comp ~]#

и уже после этих действий повторно запустим команду для установки vpn-соединения:

[root@comp ~]# pptp vpn.d-group.lan file /etc/ppp/peers/d-group

using channel 3

Using interface ppp0

Connect: ppp0 <—> /dev/pts/6

sent [LCP ConfReq id=0x1 <asyncmap 0x0> <magic 0xac21cb88> <pcomp> <accomp>]

rcvd [LCP ConfReq id=0x1 <asyncmap 0x0> <auth chap MS-v2> <magic 0xdae955ca> <pcomp> <accomp>]

sent [LCP ConfAck id=0x1 <asyncmap 0x0> <auth chap MS-v2> <magic 0xdae955ca> <pcomp> <accomp>]

rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <magic 0xac21cb88> <pcomp> <accomp>]

sent [LCP EchoReq id=0x0 magic=0xac21cb88]

rcvd [CHAP Challenge id=0x63 <78abdfc30ff68c15e5a0b0e003bdb211>, name = «pptpd»]

sent [CHAP Response id=0x63 <8b2e8b589b1c1c4d34843a540741d00>, name = «user»]

rcvd [LCP EchoRep id=0x0 magic=0xdae955ca]

rcvd [CHAP Success id=0x63 «S=28F3C4793F43ECB3ABE099F580E3893DD15C9889»]

CHAP authentication succeeded

sent [CCP ConfReq id=0x1 <mppe +H -M +S -L -D -C>]

rcvd [CCP ConfReq id=0x1 <mppe +H +M +S +L -D +C>]

sent [CCP ConfNak id=0x1 <mppe +H -M +S -L -D -C>]

rcvd [CCP ConfAck id=0x1 <mppe +H -M +S -L -D -C>]

rcvd [CCP ConfReq id=0x2 <mppe +H -M +S -L -D -C>]

sent [CCP ConfAck id=0x2 <mppe +H -M +S -L -D -C>]

sent [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 0.0.0.0>]

rcvd [IPCP ConfReq id=0x1 <addr 172.16.0.1>]

sent [IPCP ConfAck id=0x1 <addr 172.16.0.1>]

rcvd [IPCP ConfRej id=0x1 <compress VJ 0f 01>]

sent [IPCP ConfReq id=0x2 <addr 0.0.0.0>]

rcvd [IPCP ConfNak id=0x2 <addr 172.17.2.112>]

sent [IPCP ConfReq id=0x3 <addr 172.17.2.112>]

rcvd [IPCP ConfAck id=0x3 <addr 172.17.2.112>]

local IP address 172.17.2.112

remote IP address 172.16.0.1

Script /etc/ppp/ip-up started (pid 9719)

Script ?? finished (pid 9704), status = 0x0

Script /etc/ppp/ip-up finished (pid 9719), status = 0x0

Теперь все в порядке, проверим, что действительно соединение установлено и работает.

Запустив еще один терминал (консоль), став root-ом (su -), и запустив в консоли команду ifconfig ppp0 увидим виртуальный сетевой интерфейс vpn-соединения с детальной информацией о нем. Консоль в которой вы запустили pptp закрывать нельзя, потому что pptp привязан к этой консоли пока он работает, закрыв ее мы прекратим его работу и vpn-соединение будет разорвано.

[root@comp ~]$ ifconfig ppp0

ppp0 Link encap:Point-to-Point Protocol

inet addr:172.17.2.112 P-t-P:172.16.0.1 Mask:255.255.255.255

UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1496 Metric:1

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

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

collisions:0 txqueuelen:3

RX bytes:947829 (925.6 KiB) TX bytes:117504 (114.7 KiB)

Убедимся, что шлюз по умолчанию получен и прописан в таблице маршрутизации:

[root@comp ~]# netstat -rn

Kernel IP routing table

Destination Gateway Genmask Flags MSS Window irtt Iface

172.16.0.1 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0

192.168.126.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

192.168.0.0 192.168.126.254 255.255.0.0 UG 0 0 0 eth0

0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 ppp0

[root@comp ~]#

С этого момента вы должны получить возможность работать с Интернетом через установленное vpn-подключение. Прервать его вы можете просто закрыв ту консоль, где вы запустили pptp.

В некоторых дистрибутивах помешать установке vpn-соединения может параноидально настроенный при установки системы frewall. Он просто не пропускает управляющее соединение на tcp-порт 1723 и не пропускает gre-протокол, что необходимо для нормальной работы PPTP.

В частности в моем дистре именно так и было с самого начала. Поэтому я недолго думая его отключил командой system-config-firewall (в других дистрах эта команда наверняка другая), потому как я настраиваю firewall самостоятельно и на свой манер, мне не нужна эта настройка по умолчанию.

Поэтому, если у вас после запуска команды pptp, она долго висит и ничего не происходит, а потом отваливается по таймауту, это скорее всего ваш firewall.

Попробуйте сбросить все его правила командой:

[root@comp ~]# iptables -F

и посмотреть его текущее состояние (со сброшенными правилами он должен выглядеть примерно так:

[root@comp ~]# iptables -L -nxv

Chain INPUT (policy ACCEPT 24 packets, 1526 bytes)

pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 6 packets, 471 bytes)

pkts bytes target prot opt in out source destination

Попробуйте снова запустить pptp, думаю, что теперь он должен будет заработать.

На этом можно закончить настройку, дополнительные вопросы и пожелания к этому руководству задавайте в форуме.