Обновлена 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 оно уже внедерено по умолчанию