Настройка 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, думаю, что теперь он должен будет заработать.
На этом можно закончить настройку, дополнительные вопросы и пожелания к этому руководству задавайте в форуме.