Категорії
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.

MTUMaximum 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 или даже настраивать MSSMaximum 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
Powered by Muff