Категорії
FreeBSD Linux OpenBSD Routers, GW, Internet

Установка и настройка vpn с помощью mpd

Обновлена 13.09.2011

Задача такая: сделать максимально простым подключение к vpn пользователям на windows. Для этих целей я выбрал mpd, так как он больше всего совместим с windows клиентами.

ВАЖНО! Иногда при работе mpd (серверной части) наблюдаются подвисания процесса mpd, без возможности убить/перегрузить процесс. Если у вас появились такие симптомы, читайте в конце статьи ПРИМЕЧАНИЕ (для 8.1 и младше).

Тестовый стенд: сервер (FreeBSD 8.1, mpd 5.5), клиенты (WindowsXP/7, FreeBSD 8.1/8.0, Debian linux)

1)Установка

Обновляем порты и устанавливаем mpd5:

#cd /usr/ports/net/mpd5 && make install clean

Сдесь вылазит 2 опции, одна для возможности посчёта траффика NG_IPACCT. Лично я не выбирал ни одной опции (так как мне нужен чисто vpn, без netgraph).

2)Настройка сервера

Сделаем заготовку, а точнее добавим строку mpd_enable=”YES” в /etc/rc.conf и создадим файл для логов mpd и сделаем “вырезку” по логам:

#touch /var/log/mpd.log

Добавим следующую строку в начало файла /etc/syslog.conf

!mpd
*.*             /var/log/mpd.log
!-mpd

Приводим файл /usr/local/etc/mpd5/mpd.conf к следующему виду (ОТСТУПЫ ОБЯЗАТЕЛЬНЫ ВЕЗДЕ, КРОМЕ СТРОК startup, default, pptp_server!!!): Скажу сразу: конфиг перетерпел изменения по сравнению с предыдущими версиями, поэтому БУДЬТЕ ВНИМАТЕЛЬНЫ.

startup:
    set user admin Password admin
    # configure the console
    set console self 127.0.0.1 5005
    set console open
    # configure the web server
    set web self 10.1.5.1 5006
    set web open
default:
    load pptp_server
pptp_server:
    create bundle template B
    set iface enable proxy-arp
    set iface idle 0
    set iface enable tcpmssfix
    set iface description "%U on %t"
    set ipcp yes vjcomp
    set ipcp ranges 10.11.0.1/32 10.11.0.0/24
    set ipcp dns 10.1.5.21 10.1.0.5
    # Enable Microsoft Point-to-Point encryption (MPPE)
    set bundle enable compression
    set ccp yes mppc
    set mppc yes compress e40 e56 e128 stateless
    # Create clonable link template named L
    create link template L pptp
    # Set bundle template to use
    set link action bundle B
    set link yes acfcomp protocomp
    set link no pap chap eap
    set link enable chap
    set link enable chap-msv1
    set link enable chap-msv2
    # We reducing link mtu to avoid GRE packet fragmentation.
    set link mtu 1460
    set link keep-alive 10 60
    # Configure PPTP and open link
    set pptp self 11.11.11.11
    # Allow to accept calls
    set link enable incoming

Пару слов об MTU.

MTU – Maximum Transmission Unit. Это максимальный размер блока данных, который может быть передан через интерфейс. Это понятие находится на пересечении L2 и L3 и его интерпретация может различаться для разных вендоров.

Например, типичный размер MTU для физического L3-интерфейса 1500. То есть, грубо говоря, IP-пакет размером 1500 байт будет обработан, а 1501 – отброшен или фрагментирован. Зачастую фрагментация пакетов запрещена, и потому большие пакеты отбрасываются.

Если вы используете туннелирование, размер пакета увеличивается засчёт дополнительных заголовков (GRE, IPSec и т.д.) Например:

– для GRE: 24 байта (GRE, Новый IP).
– для GRE over IPSec: 56 и более байтов (зависит от режима работы и типа шифрования)
– для PPPoE: 36 (PPP, PPPoE, Ethernet)

Если у вас на маршрутизаторе MTU=1514, но у провайдера на физическом интерфейсе стоит MTU=1500, и на нём пакет будет отброшен.

Зачастую у вас нет возможности влиять на MTU по пути. Поэтому вы можете уменьшить MTU, на локальной стороне, использовать механизм Path MTU Discovery или даже настраивать MSS – Maximum Segment Size (относится уже к TCP). Подробнее о проблемах с MTU читайте тут и тут

Для всевозможных туннелей это совершенно типичная проблема.

Что касается типов авторизации, то в документации сканано так:

CHAP style authentication. This style of authentication is safer than PAP, because only a hash of the password is passed over the link. Mpd supports MD5 style CHAP and Microsoft style CHAP versions 1 and 2. Mpd will prefer Microsoft CHAP over MD5 CHAP to get encryption keys.
This option is an alias for chap-md5 chap-msv1 chap-msv2

Отдельно хочется сказать про опцию set iface enable tcpmssfix. Обычно она решает проблемы при высоком потреблении трафика. Вот, что говорится в справке к ней:

set iface enable tcpmssfix – позволяет MPD управлять настройкой входящих и исходящих TCP SYN сегментов таким образом, чтобы не превышать MTU, допустимый на интерфейсе

Но иногда с ней могут быть глюки. Поэтому, если у вас проблемы, попробуйте убрать/добавить её.

При изменении MTU рекомендую так же ознакомится со статьёй

И ещё пару слов о параметре set ipcp ranges. Всё ниже сказанное относится к windows клиентам, которые будут подключаться.

Если вы используете внутреннюю подсеть за шлюзом из диапазона 192.168.0.0/16, то в параметре set ipcp ranges нужно прописывать именно диапазон из этой подсети, иначе придётся каждый раз добавлять маршрут вручную в вашу подсеть. Если же у вас используется внутренняя подсеть 10.0.0.0/8, то разницы нет. Но главное, что бы подсеть для vpn’a была из этого же класса.

Внимание: опция set iface description появилась начиная с 5.7 (точнее с 5.6, но нельзя было задавать шаблоны). Шаблоны:

%a – локальный адрес интерфейса или UNSPEC, если адрес ещё не согласован;
%A – адрес пира или UNSPEC, если адрес ещё не согласован;
%i – системный индекс интерфейса (он же SNMP-индекс в ifTable из MIB-II);
%I – имя интерфейса;
%l – имя первого линка (link name) бандла, его mpd5 генерирует сам для динамических линков и посылает RADIUS-серверу, а также получает от него обратно в Packet Of Disconnect (POD);
%S – состояние интерфейса (DoD/UP/DOWN);
%t – тип линка (pppoe, pptp, l2tp etc.);
%u – своё имя пользователя; если же мы не авторизовались пиру, то дефис в качестве placeholder;
%U – имя пользователя пира, если он авторизовался, иначе дефис в качестве placeholder;
%% – заменяется на один символ процента.

Пустая строка (“”) удаляет описание.

Так же есть возможность использовать такие опции:

set iface name ifname – вместо ngX будет использовать ifnameX
set iface group – добавляет интерфейс в группы:

$ ifconfig -v
ng0: flags=88d1 metric 0 mtu 1396
     inet 10.11.0.1 --> 10.11.0.190 netmask 0xffffffff
     groups: GoodUser
ng1: flags=88d1 metric 0 mtu 1396
     inet 10.11.0.1 --> 10.11.0.191 netmask 0xffffffff
     groups: GoodUser
ng2: flags=88d1 metric 0 mtu 1396
     inet 10.11.0.1 --> 10.11.0.192 netmask 0xffffffff
     groups: BadUser
$ ifonfig -g GoodUser
ng0
ng1

Теперь создаём файл /usr/local/etc/mpd5/mpd.secret с парами login/password (можно ещё указывать ip адрес, который будет назначаться клиенту; если этот параметр не указан, будет браться свободный из параметра set ippool add poolsat 10.11.0.100. 10.11.0.220, который в этой конфигурации не используется) Не забываем выставить эту файлу права 0600 для безопасности.

joe             "foobar"        10.11.0.13
sal             "yipee"         10.11.0.54
skeletor        "12345"

Третье поле является необязательным, и указывает какой IP должен получать клиент, с соотвествующим login/pass.

3)Запуск и мониторинг.

Запускаем mpd и бегом смотреть логи.

#/usr/local/etc/rc.d/mpd start

Starting mpd5.

#tail -f /var/log/mpd.log

Mar 18 15:59:20 query2 mpd: Multi-link PPP daemon for FreeBSD
Mar 18 15:59:20 query2 mpd:
Mar 18 15:59:20 query2 mpd: process 38909 started, version 5.2 (root@server 14:52 18-Mar-2009)
Mar 18 15:59:20 query2 mpd: web: listening on 127.0.0.1 5005
Mar 18 15:59:20 query2 mpd: PPTP: waiting for connection on 11.11.11.11 1723

Теперь подключаемся и смотрим в логи (логи будут расти очень быстро):

Mar 18 15:59:33 query2 mpd: [L-1] Accepting PPTP connection
Mar 18 15:59:33 query2 mpd: [L-1] Link: OPEN event
Mar 18 15:59:33 query2 mpd: [L-1] LCP: Open event
Mar 18 15:59:33 query2 mpd: [L-1] LCP: state change Initial --> Starting
Mar 18 15:59:33 query2 mpd: [L-1] LCP: LayerStart
Mar 18 15:59:33 query2 mpd: [L-1] PPTP: attaching to peer's outgoing call
Mar 18 15:59:33 query2 mpd: [L-1] Link: UP event
Mar 18 15:59:33 query2 mpd: [L-1] LCP: Up event
Mar 18 15:59:33 query2 mpd: [L-1] LCP: state change Starting --> Req-Sent
Mar 18 15:59:33 query2 mpd: [L-1] LCP: SendConfigReq #1
Mar 18 15:59:33 query2 mpd: [L-1]   ACFCOMP
Mar 18 15:59:33 query2 mpd: [L-1]   PROTOCOMP
Mar 18 15:59:33 query2 mpd: [L-1]   MRU 1500
Mar 18 15:59:33 query2 mpd: [L-1]   MAGICNUM 6a38cb4c
Mar 18 15:59:33 query2 mpd: [L-1]   AUTHPROTO CHAP MSOFTv2
Mar 18 15:59:33 query2 mpd: [L-1]   MP MRRU 2048
Mar 18 15:59:33 query2 mpd: [L-1]   MP SHORTSEQ
Mar 18 15:59:33 query2 mpd: [L-1]   ENDPOINTDISC [802.1] 00 1a 4d fa 2e e8
Mar 18 15:59:33 query2 mpd: [L-1] LCP: rec'd Configure Request #0 (Req-Sent)
Mar 18 15:59:33 query2 mpd: [L-1]   MRU 1400
Mar 18 15:59:33 query2 mpd: [L-1]   MAGICNUM 1f2a219b
Mar 18 15:59:33 query2 mpd: [L-1]   PROTOCOMP
Mar 18 15:59:33 query2 mpd: [L-1]   ACFCOMP
Mar 18 15:59:33 query2 mpd: [L-1]   CALLBACK 6
Mar 18 15:59:33 query2 mpd: [L-1] LCP: SendConfigRej #0
Mar 18 15:59:33 query2 mpd: [L-1]   CALLBACK 6
Mar 18 15:59:33 query2 mpd: [L-1] LCP: rec'd Configure Request #1 (Req-Sent)
Mar 18 15:59:33 query2 mpd: [L-1]   MRU 1400
Mar 18 15:59:33 query2 mpd: [L-1]   MAGICNUM 1f2a219b
Mar 18 15:59:33 query2 mpd: [L-1]   PROTOCOMP
Mar 18 15:59:33 query2 mpd: [L-1]   ACFCOMP
Mar 18 15:59:33 query2 mpd: [L-1] LCP: SendConfigAck #1
Mar 18 15:59:33 query2 mpd: [L-1]   MRU 1400
Mar 18 15:59:33 query2 mpd: [L-1]   MAGICNUM 1f2a219b
Mar 18 15:59:33 query2 mpd: [L-1]   PROTOCOMP
Mar 18 15:59:33 query2 mpd: [L-1]   ACFCOMP
Mar 18 15:59:33 query2 mpd: [L-1] LCP: state change Req-Sent --> Ack-Sent
Mar 18 15:59:35 query2 mpd: [L-1] LCP: SendConfigReq #2
Mar 18 15:59:35 query2 mpd: [L-1]   ACFCOMP
Mar 18 15:59:35 query2 mpd: [L-1]   PROTOCOMP
Mar 18 15:59:35 query2 mpd: [L-1]   MRU 1500
Mar 18 15:59:35 query2 mpd: [L-1]   MAGICNUM 6a38cb4c
Mar 18 15:59:35 query2 mpd: [L-1]   AUTHPROTO CHAP MSOFTv2
Mar 18 15:59:35 query2 mpd: [L-1]   MP MRRU 2048
Mar 18 15:59:35 query2 mpd: [L-1]   MP SHORTSEQ
Mar 18 15:59:35 query2 mpd: [L-1]   ENDPOINTDISC [802.1] 00 1a 4d fa 2e e8
Mar 18 15:59:35 query2 mpd: [L-1] LCP: rec'd Configure Reject #2 (Ack-Sent)
Mar 18 15:59:35 query2 mpd: [L-1]   MP MRRU 2048
Mar 18 15:59:35 query2 mpd: [L-1]   MP SHORTSEQ
Mar 18 15:59:35 query2 mpd: [L-1]   ENDPOINTDISC [802.1] 00 1a 4d fa 2e e8
Mar 18 15:59:35 query2 mpd: [L-1] LCP: SendConfigReq #3
Mar 18 15:59:35 query2 mpd: [L-1]   ACFCOMP
Mar 18 15:59:35 query2 mpd: [L-1]   PROTOCOMP
Mar 18 15:59:35 query2 mpd: [L-1]   MRU 1500
Mar 18 15:59:35 query2 mpd: [L-1]   MAGICNUM 6a38cb4c
Mar 18 15:59:35 query2 mpd: [L-1]   AUTHPROTO CHAP MSOFTv2
Mar 18 15:59:35 query2 mpd: [L-1] LCP: rec'd Configure Ack #3 (Ack-Sent)
Mar 18 15:59:35 query2 mpd: [L-1]   ACFCOMP
Mar 18 15:59:35 query2 mpd: [L-1]   PROTOCOMP
Mar 18 15:59:35 query2 mpd: [L-1]   MRU 1500
Mar 18 15:59:35 query2 mpd: [L-1]   MAGICNUM 6a38cb4c
Mar 18 15:59:35 query2 mpd: [L-1]   AUTHPROTO CHAP MSOFTv2
Mar 18 15:59:35 query2 mpd: [L-1] LCP: state change Ack-Sent --> Opened
Mar 18 15:59:35 query2 mpd: [L-1] LCP: auth: peer wants nothing, I want CHAP
Mar 18 15:59:35 query2 mpd: [L-1] CHAP: sending CHALLENGE #1 len: 21
Mar 18 15:59:35 query2 mpd: [L-1] LCP: LayerUp
Mar 18 15:59:35 query2 mpd: [L-1] LCP: rec'd Ident #2 (Opened)
Mar 18 15:59:35 query2 mpd: [L-1]   MESG: MSRASV5.10
Mar 18 15:59:35 query2 mpd: [L-1] LCP: rec'd Ident #3 (Opened)
Mar 18 15:59:35 query2 mpd: [L-1]   MESG: MSRAS-0-SKELETOR
Mar 18 15:59:35 query2 mpd: [L-1] CHAP: rec'd RESPONSE #1 len: 62
Mar 18 15:59:35 query2 mpd: [L-1]   Name: "skeletor"
Mar 18 15:59:35 query2 mpd: [L-1] AUTH: Trying INTERNAL
Mar 18 15:59:35 query2 mpd: [L-1] AUTH: INTERNAL returned: undefined
Mar 18 15:59:35 query2 mpd: [L-1] CHAP: Auth return status: undefined
Mar 18 15:59:35 query2 mpd: [L-1] CHAP: Response is valid
Mar 18 15:59:35 query2 mpd: [L-1] CHAP: Reply message: S=2901A6FC92E2E0897BCB81E3FCA55B8A08A4C697
Mar 18 15:59:35 query2 mpd: [L-1] CHAP: sending SUCCESS #1 len: 46
Mar 18 15:59:35 query2 mpd: [L-1] LCP: authorization successful
Mar 18 15:59:35 query2 mpd: [L-1] Link: Matched action 'bundle "B" ""'
Mar 18 15:59:35 query2 mpd: [L-1] Creating new bundle using template "B".
Mar 18 15:59:35 query2 mpd: [B-1] Bundle: Interface ng0 created
Mar 18 15:59:35 query2 mpd: [L-1] Link: Join bundle "B-1"
Mar 18 15:59:35 query2 mpd: [B-1] Bundle: Status update: up 1 link, total bandwidth 64000 bps
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: Open event
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: state change Initial --> Starting
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: LayerStart
Mar 18 15:59:35 query2 mpd: [B-1] CCP: Open event
Mar 18 15:59:35 query2 mpd: [B-1] CCP: state change Initial --> Starting
Mar 18 15:59:35 query2 mpd: [B-1] CCP: LayerStart
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: Up event
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: Got IP 10.11.0.190 from pool "poolsat" for peer
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: state change Starting --> Req-Sent
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: SendConfigReq #1
Mar 18 15:59:35 query2 mpd: [B-1]   IPADDR 10.11.0.1
Mar 18 15:59:35 query2 mpd: [B-1]   COMPPROTO VJCOMP, 16 comp. channels, no comp-cid
Mar 18 15:59:35 query2 mpd: [B-1] CCP: Up event
Mar 18 15:59:35 query2 mpd: [B-1] CCP: state change Starting --> Req-Sent
Mar 18 15:59:35 query2 mpd: [B-1] CCP: SendConfigReq #1
Mar 18 15:59:35 query2 mpd: [B-1]   MPPC
Mar 18 15:59:35 query2 mpd: [B-1]     0x010000e0:MPPE(40, 56, 128 bits), stateless
Mar 18 15:59:35 query2 mpd: [B-1] CCP: rec'd Configure Request #4 (Req-Sent)
Mar 18 15:59:35 query2 mpd: [B-1]   MPPC
Mar 18 15:59:35 query2 mpd: [B-1]     0x010000e1:MPPC, MPPE(40, 56, 128 bits), stateless
Mar 18 15:59:35 query2 mpd: [B-1] CCP: SendConfigNak #4
Mar 18 15:59:35 query2 mpd: [B-1]   MPPC
Mar 18 15:59:35 query2 mpd: [B-1]     0x01000040:MPPE(128 bits), stateless
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: rec'd Configure Request #5 (Req-Sent)
Mar 18 15:59:35 query2 mpd: [B-1]   IPADDR 0.0.0.0
Mar 18 15:59:35 query2 mpd: [B-1]     NAKing with 10.11.0.190
Mar 18 15:59:35 query2 mpd: [B-1]   PRIDNS 0.0.0.0
Mar 18 15:59:35 query2 mpd: [B-1]     NAKing with 10.11.0.1
Mar 18 15:59:35 query2 mpd: [B-1]   PRINBNS 0.0.0.0
Mar 18 15:59:35 query2 mpd: [B-1]   SECDNS 0.0.0.0
Mar 18 15:59:35 query2 mpd: [B-1]   SECNBNS 0.0.0.0
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: SendConfigRej #5
Mar 18 15:59:35 query2 mpd: [B-1]   PRINBNS 0.0.0.0
Mar 18 15:59:35 query2 mpd: [B-1]   SECDNS 0.0.0.0
Mar 18 15:59:35 query2 mpd: [B-1]   SECNBNS 0.0.0.0
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: rec'd Configure Reject #1 (Req-Sent)
Mar 18 15:59:35 query2 mpd: [B-1]   COMPPROTO VJCOMP, 16 comp. channels, no comp-cid
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: SendConfigReq #2
Mar 18 15:59:35 query2 mpd: [B-1]   IPADDR 10.11.0.1
Mar 18 15:59:35 query2 mpd: [B-1] CCP: rec'd Configure Nak #1 (Req-Sent)
Mar 18 15:59:35 query2 mpd: [B-1]   MPPC
Mar 18 15:59:35 query2 mpd: [B-1]     0x01000040:MPPE(128 bits), stateless
Mar 18 15:59:35 query2 mpd: [B-1] CCP: SendConfigReq #2
Mar 18 15:59:35 query2 mpd: [B-1]   MPPC
Mar 18 15:59:35 query2 mpd: [B-1]     0x01000040:MPPE(128 bits), stateless
Mar 18 15:59:35 query2 mpd: [B-1] CCP: rec'd Configure Request #6 (Req-Sent)
Mar 18 15:59:35 query2 mpd: [B-1]   MPPC
Mar 18 15:59:35 query2 mpd: [B-1]     0x01000040:MPPE(128 bits), stateless
Mar 18 15:59:35 query2 mpd: [B-1] CCP: SendConfigAck #6
Mar 18 15:59:35 query2 mpd: [B-1]   MPPC
Mar 18 15:59:35 query2 mpd: [B-1]     0x01000040:MPPE(128 bits), stateless
Mar 18 15:59:35 query2 mpd: [B-1] CCP: state change Req-Sent --> Ack-Sent
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: rec'd Configure Request #7 (Req-Sent)
Mar 18 15:59:35 query2 mpd: [B-1]   IPADDR 0.0.0.0
Mar 18 15:59:35 query2 mpd: [B-1]     NAKing with 10.11.0.190
Mar 18 15:59:35 query2 mpd: [B-1]   PRIDNS 0.0.0.0
Mar 18 15:59:35 query2 mpd: [B-1]     NAKing with 10.11.0.1
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: SendConfigNak #7
Mar 18 15:59:35 query2 mpd: [B-1]   IPADDR 10.11.0.190
Mar 18 15:59:35 query2 mpd: [B-1]   PRIDNS 10.1.5.21
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: rec'd Configure Ack #2 (Req-Sent)
Mar 18 15:59:35 query2 mpd: [B-1]   IPADDR 10.11.0.1
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: state change Req-Sent --> Ack-Rcvd
Mar 18 15:59:35 query2 mpd: [B-1] CCP: rec'd Configure Ack #2 (Ack-Sent)
Mar 18 15:59:35 query2 mpd: [B-1]   MPPC
Mar 18 15:59:35 query2 mpd: [B-1]     0x01000040:MPPE(128 bits), stateless
Mar 18 15:59:35 query2 mpd: [B-1] CCP: state change Ack-Sent --> Opened
Mar 18 15:59:35 query2 mpd: [B-1] CCP: LayerUp
Mar 18 15:59:35 query2 mpd: [B-1] CCP: Compress using: mppc (MPPE(128 bits), stateless)
Mar 18 15:59:35 query2 mpd: [B-1] CCP: Decompress using: mppc (MPPE(128 bits), stateless)
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: rec'd Configure Request #8 (Ack-Rcvd)
Mar 18 15:59:35 query2 mpd: [B-1]   IPADDR 10.11.0.190
Mar 18 15:59:35 query2 mpd: [B-1]     10.11.0.190is OK
Mar 18 15:59:35 query2 mpd: [B-1]   PRIDNS 10.1.5.21
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: SendConfigAck #8
Mar 18 15:59:35 query2 mpd: [B-1]   IPADDR 10.11.0.190
Mar 18 15:59:35 query2 mpd: [B-1]   PRIDNS 10.1.5.21
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: state change Ack-Rcvd --> Opened
Mar 18 15:59:35 query2 mpd: [B-1] IPCP: LayerUp
Mar 18 15:59:35 query2 mpd: [B-1]   10.11.0.1 -> 10.11.0.190
Mar 18 15:59:35 query2 mpd: [B-1] IFACE: No interface to proxy arp on for 10.11.0.190
Mar 18 15:59:35 query2 mpd: [B-1] IFACE: Up event

Теперь посмотрим состояние интерфейсов и маршрутизации (оставил только то, что касается vpn-подключения):

(ifconfig)

ng0: flags=88d1 metric 0 mtu 1396
inet 10.11.0.1 --> 10.11.0.190 netmask 0xffffffff

(netstat)

10.11.0.190       10.11.0.1       UH          0        2    ng0

Консоль управления.

Очень удобно, если надо сбросить чью-то сессию, не трогая остальных. По дефолтну она доступна на 127.0.0.1 на порту 5005. Покажу пример сбрасывания сессии:

# telnet 127.0.0.1 5005
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Multi-link PPP daemon for FreeBSD

Username: admin
Password:

Welcome!
Mpd pid 1459, version 5.5 (root@gate.domain.ua 11:41  4-jan-2011)
[] show sessions
ng0  10.11.0.107  B-2  5173145-B-2   LINK-4  4  5173145-LINK-4  userA  AA.AA.AA.AA
ng3  10.11.0.108  B-5  4536796-B-5   LINK-5  5  4536796-LINK-5  userB  BB.BB.BB.BB
ng2  10.11.0.121  B-4  5189878-B-4   LINK-6  6  5189878-LINK-6  userC  CC.CC.CC.CC
[] link LINK-4
[LINK-4] close
[LINK-4] show sessions
ng3  10.11.0.108  B-5  4536796-B-5   LINK-5  5 4536796-LINK-5  userB  BB.BB.BB.BB
ng2  10.11.0.121  B-4  5189878-B-4   LINK-6  6 5189878-LINK-6  userC  CC.CC.CC.CC
[LINK-4] exit
Console closed.

Передача роутинга клиенту.

Для передачи роутинга нужно что бы ваш DHCP-сервер и клиент поддерживали RFC 3442 и тогда можно использовать DHCP-опции 249, 121. Вот описание для isc-dhcpd:

option ms-classless-static-routes code 249 = array of unsigned integer 8;
option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;

А вот пример:

option ms-classless-static-routes 24, 192,168,33, 10,0,128,1, 24, 10,254,213, 10,0,128,1;
option rfc3442-classless-static-routes 24, 192,168,33, 10,0,128,1, 24, 10,254,213, 10,0,128,1;

Так же можно прочесть обсуждение здесь по этому поводу

4) Настройка клиента FreeBSD

Устанавливаем всё тот же mpd. Открываем файл /usr/local/etc/mpd5/mpd.conf и приводим к такому виду (все строки, кромер default и pptp_client – с отступом):

default:
    load pptp_client
pptp_client:
    create bundle static B1
    set iface up-script /usr/local/etc/mpd5/up-script.sh
    set iface down-script /usr/local/etc/mpd5/down-script.sh
    create link static L1 pptp
    set link action bundle B1
    set auth authname client
    set auth password client_pass
    set link max-redial 0
    # set link mtu 1460
    set link keep-alive 20 75
    set pptp peer 11.11.11.11
    set iface idle 0 #не разрывать связь при отсутствии исходящих пакетов
    set pptp disable windowing
    open

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

set iface name MY_IFACE_NAME

где MY_IFACE_NAME – любое допустимое имя кроме зарезервированных ngX.

Строки со скриптами нужны тогда, когда vpn сеть и удалённая локальная сеть находятся в разных подсетях.

cat up-script.sh

#!/bin/sh
/sbin/route add 10.1.0.0/16 10.11.0.1

cat down-script.sh

#!/bin/sh
/sbin/route delete 10.1.0.0

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

10.9.0.0/24 (lan) <----> 10.9.0.1 /10.11.0.109 (mpd client) <----inet_vpn----->10.11.0.1 (mpd server) <-----> 10.1.0.0/16 (office net)

Так вот, для того, что бы клиенты из под сети 10.9.0.0/24 имели доступ к сети 10.1.0.0/16 нужно на сервере добавить такую строку:

/sbin/route add -net 10.9.0.0/24 10.11.0.109

Есть правда в этом варианте один минус: если интернет часто обрывается, то при падении маршрут в сеть 10.9.0.0/24 удаляется. Соответственно при подключении клиента, нужно если опять добавлять. Я пока придумал такое (временное) решение: запускать проверку, если клиент подключён – добавлять маршрут

cat mpd_client.sh

#!/bin/sh
/usr/bin/netstat -rn | /usr/bin/grep 10.9.0.0
if [ $? != 0 ]
then
/sbin/route add -net 10.9.0.0/24 10.11.0.109 > /dev/null 2>&1
fi

и добавил его в cron на запуск каждую минуту:

*/1     *       *       *       *       root    /scripts/mpd_client.sh > /dev/null 2>&1

5) Настройка клиента Linux (Debian)

Всё описанное проводилось на Debian lenny 5. Для успешной работы нам потребуется пакет pptp-linux. Ставим его:

#apt-get install pptp-linux

После установки переходим в папку /etc/ppp/peers и создаём файл vpn:

name skeletor
remotename skeletor
debug
lock
deflate 0
file /etc/ppp/options.pptp
pty "pptp 11.11.11.11 --nolaunchpppd"
hide-password

где 11.11.11.11 адрес vpn-сервера, name и remotename – логин для подключения к vpn.

Добавляем логин и пароль в файл /etc/ppp/chap-secrets (поскольку сервер использует chap-авторизацию):

skeletor        *       skeletor_password     *

Запускать будем так:

#pon 11.11.11.11 vpn &

Останавливать

#poff vpn

6) Настройка клиента OpenBSD

Все настройки проводились на OpenBSD 4.7.

Установку буду производить из портов:

cd /usr/ports/net/pptp/ && make install clean

После установки приводим файл /etc/ppp/ppp.conf к такому виду:

default:
set log Phase Chat LCP IPCP CCP tun command
vpn:
set authname VPN_login
set authkey VPN_password
set timeout 0
set ifaddr 0 0
disable ipv6cp
set mppe 128 stateless
add 10.1.0.0/16 HISADDR
set device "!/usr/local/sbin/pptp  VPN_server --nolaunchpppd"

На этом установка и настройка закончена. Для старых версий OpenBSD рекомендуется сделать следующее:

#sysctl -w net.inet.gre.allow=1

Скажу сразу, у меня это значение автоматически становилось 1 при поднятии тунеля VPN. Осталось добавить в автозагрузку поднятие туннеля. Для этого создаём файл /etc/hostname.tun0 такого содержания:

!/usr/sbin/ppp -ddial vpn >/dev/null 2>&1

7) Файервол.

Для успешной работы в файерволе нужно разрешить входящее подключение к порту 1723 сервера, а так же трафик gre. Для ipfw это делается таким образом:

#ipfw add allow tcp from any to ${IpOut} 1723 via ${LanOut} setup
#ipfw add allow gre from any to any via ${LanOut}

где ${IpOut} – внешний IP-адрес сервера, ${LanOut} – внешний сетевой интерфейс сервера.

8 ) Тюнинг.

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

# vmstat -z|egrep 'ITEM|NetGraph'
ITEM SIZE LIMIT USED FREE REQUESTS FAILURES
NetGraph items: 72, 4118, 0, 783, 210304393, 0
NetGraph data items: 72, 522, 0, 522, 264209895, 42

Как видим, переполнений нет. Но если у вас они начали появляться, тогда рекомендуется выставить побольше значение переменных net.graph.maxdata и net.graph.maxalloc. Добавим в /boot/loader.conf такие строки:

net.graph.maxdata=65536
net.graph.maxalloc=65536

и перегрузится.

ПРИМЕЧАНИЕ (для 8.1 и младше).

Актуально для версий 8.1 и младше. На 8.4 таких проблем не наблюдал.

Если у вас начал подвисать процесс mpd без явных на то причин или вы хотите избавить себя от этого в дальнейшем, рекомендуется (рекомендация была предложена в рассылке по FreeBSD) убрать из ядра опцию и пересобрать ядро:

options FLOWTABLE # per-cpu routing cache

Это проблема mpd и FLOWTABLE. Кому интересно, почитайте здесь http://lists.freebsd.org/pipermail/freebsd-net/2010-February/024642.html, http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/144917. Более того, отдельно система с Flowtable при достаточной нагрузке так
же зависает (опять так же объяснение из рассылки) и рекомендуют всё же исключать опцию из ядра.

Так же при включении Flowtable может наблюдаться 100% загрузка CPU. В рассылке uafug пробежало объяснение от Mikolaj Golub по этому поводу:

В случае с flowtable отключение sysctl это далеко не то же, что отключение
опции сборки ядра. flowtable.enable=0 приведет только к отключению
flow_lookup_hash. Но допустим эта треда:

root     19  0.0  0.0     0    16  ??  DL    8:13     0:00.18 [flowcleaner]

будет продолжать бежать. И при удалении интерфейса будет вызываться
flowtable_flush(). А как раз лок между flowcleaner и flowtable_flush может
привести к 100% загрузке CPU: 

Об этом так же упоминается и здесь

Единственно полезное, что делает эта опция, так это распаралеливание процессов

9) Использование polling’a.

При использовании поллинга заметно снижается нагрузка на CPU.  В этом случае выставляем такие переменные:

kern.polling.enable=1
kern.polling.user_frac=10

Последнее означает что система будет делить ресурсы CPU в соотношенииuserland/kernel как 10/90. По умолчанию это значение 50/50.

Примечание.

Что бы включить поллинг, нужно пересобрать ядро с таким опциями:

options DEVICE_POLLING
options HZ=1000

Но в последнее время FreeBSD уходит от использования поллинга в пользу Direct dispatch.

10) Over NAT

Касательно работы сервера за NAT’ом – оно работает. А что бы понять почему, то приведу цитату с одного форума:

этап инициации проходит через 1723 порт tcp потом данные несутся через GRE ну а GRE через nat проходят только через костыли в линуксе это доп модулек
в natd и libalias оно уже внедерено по умолчанию

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP