Vpn server на MPD

Материал из rrv-wiki
Перейти к навигации Перейти к поиску

Задача стояла в следующем:

Установить и настроить VPN сервер на FreeBSD 6.2 с использованием программного обеспечения

mpd-3.18_5 

на момент написаня статьи,это была последняя версия.

В принципе, рекомендуется перед конфигурацией mpd включить опции FreeBSD-ядра для работы с NETGRAPH. Однако компоненты NETGRAPH загружаются как модули ядра и ядро я не пересобирал,всё получилось и так.

Вот опции для ядра:

options         NETGRAPH
options         NETGRAPH_ETHER                  
options         NETGRAPH_SOCKET               
options         NETGRAPH_TEE


Source(s): Vpn server на MPD

Шаг 1. Компилируем mpd

Компилируем mpd из дерева FreeBSD-портов. PS. Желательно перед компиляцие пакета mpd обновить дерево портов через cvsup, для того, чтобы установить последнюю версию. Компилируем и инсталлируем mpd:

cd /usr/ports/net/mpd
make
make install

Шаг 2. Конфигурируем mpd

Для того, чтобы настроить mpd нужно создать 3 файла (все файлы должны по умолчанию находиться в каталоге /usr/local/etc/mpd):

Внимание! Важно, что бы после метки в начале каждой строки присутствовал таб а перед меткой пустая строка!

1. mpd.conf - файл описывающий конфигурацию интерфейсов 2. mpd.links - файл, описывающий конфигурацию соединений 3. mpd.secret - файл с паролями пользователей.

Так же в папке буду лежать файлы с примерами .sample Для краткости и конкретики ниже приводятся все 3 файла, взятые с работающей системы. Конфигурация написана для одного соединения (сетевые устройства ng0). При необходимости можно добавить их по аналогии (ng0-ng6) и т.д

mpd.conf:

default:
        load pptp0
        load pptp1 
pptp0:
        #так создается новый интерфейс, второй параметр - название соединения, который этот 
        #интерфейс будет использовать (из файла mpd.links)
        new -i ng0 pptp0 pptp0
        #Задается вспомогательный ip-адрес и свободный ip-адрес из удаленной локальной сети к которой подключаемся 
        set ipcp ranges 10.157.43.100/32 192.168.0.100/32
        #Загружаются паремтры, одинаковые для всех интерфейсов
        load pptp_standart
pptp1:
        new -i ng1 pptp1 pptp1
        set ipcp ranges 10.157.43.101/32 192.168.0.101/32
        load pptp_standart
pptp_standart:
        set iface disable on-demand
        set bundle disable multilink
        set link yes acfcomp protocomp
        #Требуем chap авторизации
        set link no pap chap
        set link enable chap
        set link keep-alive 60 180
        set ipcp yes vjcomp
        #Устанавливаем DNS и Wins,у меня стоит свой dns,я прописал один set ipcp dns 192.168.0.1 
        set ipcp dns XXX.XXX.XXX.XXX
        set ipcp nbns XXX.XXX.XXX.XXX
        #Включаем proxy-arp, чтобы компьютер "видел" без маршрутизации  корпоративную сеть (по протоколу arp)
        set iface enable proxy-arp
        #Включаем компрессию данных
        set bundle enable compression
         #Включаем компрессию данных, совместимую с Microsoft-клиентами
        set ccp yes mppc
        #Включаем шифрование, совместимое с Microsoft-клиентами
        set ccp yes mpp-e40
        set ccp yes mpp-e128
        set ccp yes mpp-stateless
        set bundle yes crypt-reqd
        #Задаем адрес для входящих соединений (интерфейс на котором слушает mdp)
        set pptp self YYY.YYY.YYY.YYY
        #Разрешаем входящие соединения
        set pptp enable incoming
        set pptp disable originate
        #Помогает при потере пакетов:
        set iface enable tcpmssfix
        set pptp enable always-ack
        set pptp disable delayed-ack
        set pptp disable windowing

Как видно, создается 2 "бандлов" (pptp0-pptp1), которые обслуживают 2 интерфейсов. На каждый "бандл" накладываются определенные параметры работы на интерфейс. Кроме того к каждому "бандлу" прикрепляется "линк" (второй (pptpX) параметр в команде new -i ng5 pptp5 pptp5), который должен быть описан в файле mpd.links.

mpd.links:

pptp0:
    set link type pptp

pptp1:
     set link type pptp

Т.к. все параметры уже были установлены в файле mpd.conf, то для "линков" достаточно обозначить их тип (pptp). Авторизация пользователей осуществляется на основе данных из файла mpd.secret. Он имеет простой формат: "логин" "пароль" IP-пользователя (необязательно),можно поставить * тогда ип будут выдаваться рандомом,в соответсвии с параметрами сети описанными в файле mpd.conf Например, мой mpd.secret:

andrew    pass1    192.168.0.4
mod          pass2    *
1234         pass3     192.168.0.100
users         pass3     192.168.0.0/24

Логин\пароль могут совпадать с доменными именами, а могут и не совпадать. Если указано поле IP-пользователя, то пользователю будет выдан персональный IP-адрес.

Шаг 3. Запускаем mpd

Перед запуском,нужн добавить привила для mpd,по-умолчанию ipfw

# разрешаем коннект к серверу по VPN
${fwcmd} add allow tcp from any to me 1723
${fwcmd} add allow gre from any to any

По умолчанию mpd работает в интерактивном режиме. Т.е. он загружает конфигурацию из файлов и предоставляет оболочку для изменения параметров. Первый раз его можно пустить именно в таком режиме:

  /usr/local/sbin/mpd
# /usr/local/sbin/mpd
Multi-link PPP for FreeBSD, by Archie L. Cobbs.
Based on iij-ppp, by Toshiharu OHNO.
mpd: pid 9344, version 3.18 (root@ 14:07 18-Jun-2007)
[pptp0] ppp node is "mpd9344-pptp0"
[pptp0] using interface ng0
Usage: set ipcp ranges self/width peer/width
Usage: load system
[pptp1] ppp node is "mpd9344-pptp1"
[pptp1] using interface ng1
mpd: local IP address for PPTP is 192.168.0.1
[pptp1:pptp1]

При этом должны загрузиться все "бандлы", и создаться интерфейсы ng0-ng1 (проверить можно командой ifconfig -a).

# ifconfig -a
ng0: flags=8890<POINTOPOINT,NOARP,SIMPLEX,MULTICAST> mtu 1500
ng1: flags=8890<POINTOPOINT,NOARP,SIMPLEX,MULTICAST> mtu 1500

После провероки правильности работы в дальнейшем mpd можно запускать как демон:

/usr/local/sbin/mpd -b


После провероки правильности работы в дальнейшем mpd можно запускать как демон: /usr/local/sbin/mpd -b, а результаты работы смотреть через лог-файл.

PS. Во время тестирования mpd в системе часто оставались интерфейсы ngXX после принудительной выгрузки mpd. При этом команда ifconfig ng0 down delete не удаляла интерфейс. Опытным путем выяснилось, что для того чтобы удалить интерфейс нужно набрать команду ngctl и в появившейся оболочке написать "shutdown ngX:" (двоеточние в конце обязательно). PPS. Для создания Лог-файла нужно:

- добавить строчки в /etc/syslog.conf: 
  !mpd
  *.* /var/log/mpd.log   
- создать файл /var/log/mpd.log (# touch /var/log/mpd.log)
- перепустить syslogd (killall -1 syslogd) 

Шаг 4. Настраиваем клиента

После этого нужно настроить какого-нибудь Windows-клиента для работы с VPN. Все установки можно оставить по умолчанию, а адрес VPN-сервера нужно поставить такой же как в параметре set pptp self 192.168.0.1. Более подробную инструкцию по конфигурированию Windows-клиента можно получить из документации по Windows.

Шаг 5. Проверяем в работе

Теперь нужно "зайти" с любого Windows клиента на PPTP-сервер и проверить правильность работы. Если все было установлено правильно, то в Windows должна пройти авторизация и вход в сеть и как минимум стать доступной корпоративная сеть. mpd сервер при "правильном" входе должен написать в лог-файл нечто вроде приведенного ниже:

[pptp1] ppp node is "mpd9735-pptp1"
[pptp1] using interface ng1
mpd: local IP address for PPTP is 192.168.0.1
[pptp1:pptp1] mpd: PPTP connection from 192.168.0.2:4811
pptp0: attached to connection with 192.168.0.2:4811
[pptp1] IFACE: Open event
[pptp1] IPCP: Open event
[pptp1] IPCP: state change Initial --> Starting
[pptp1] IPCP: LayerStart
[pptp1] IPCP: Open event
[pptp1] bundle: OPEN event in state CLOSED
[pptp1] opening link "pptp1"...
[pptp1] link: OPEN event
[pptp1] LCP: Open event
[pptp1] LCP: state change Initial --> Starting
[pptp1] LCP: LayerStart
[pptp1] device: OPEN event in state DOWN
[pptp1] attaching to peer's outgoing call
[pptp1] device is now in state OPENING
[pptp1] device: UP event in state OPENING
[pptp1] device is now in state UP
[pptp1] link: UP event
[pptp1] link: origination is remote
[pptp1] LCP: Up event
[pptp1] LCP: state change Starting --> Req-Sent
[pptp1] LCP: phase shift DEAD --> ESTABLISH
[pptp1] LCP: SendConfigReq #1
ACFCOMP
PROTOCOMP
MRU 1500
MAGICNUM 05a0c194
AUTHPROTO CHAP MSOFTv2
pptp0-0: ignoring SetLinkInfo
[pptp1] LCP: rec'd Configure Request #0 link 0 (Req-Sent)
MRU 1400
MAGICNUM 52d27676
PROTOCOMP
ACFCOMP
CALLBACK
Not supported
[pptp1] LCP: SendConfigRej #0
CALLBACK
[pptp1] LCP: rec'd Configure Request #1 link 0 (Req-Sent)
MRU 1400
MAGICNUM 52d27676
PROTOCOMP
ACFCOMP
[pptp1] LCP: SendConfigAck #1
MRU 1400
MAGICNUM 52d27676
PROTOCOMP
ACFCOMP
[pptp1] LCP: state change Req-Sent --> Ack-Sent
[pptp1] LCP: SendConfigReq #2
ACFCOMP
PROTOCOMP
MRU 1500
MAGICNUM 05a0c194
AUTHPROTO CHAP MSOFTv2
[pptp1] LCP: rec'd Configure Ack #2 link 0 (Ack-Sent)
ACFCOMP
PROTOCOMP
MRU 1500
MAGICNUM 05a0c194
AUTHPROTO CHAP MSOFTv2
[pptp1] LCP: state change Ack-Sent --> Opened
[pptp1] LCP: phase shift ESTABLISH --> AUTHENTICATE
[pptp1] LCP: auth: peer wants nothing, I want CHAP
[pptp1] CHAP: sending CHALLENGE
[pptp1] LCP: LayerUp
pptp0-0: ignoring SetLinkInfo
[pptp1] LCP: rec'd Ident #2 link 0 (Opened)
MESG: MSRASV5.10
[pptp1] LCP: rec'd Ident #3 link 0 (Opened)
MESG: MSRAS-0-ANDREW
[pptp1] CHAP: rec'd RESPONSE #1
Name: "andrew"
Peer name: "andrew"
Response is valid
[pptp1] CHAP: sending SUCCESS
[pptp1] LCP: authorization successful
[pptp1] LCP: phase shift AUTHENTICATE --> NETWORK
[pptp1] setting interface ng1 MTU to 1400 bytes
[pptp1] up: 1 link, total bandwidth 64000 bps
[pptp1] IPCP: Up event
[pptp1] IPCP: state change Starting --> Req-Sent
[pptp1] IPCP: SendConfigReq #1
IPADDR 192.168.0.1
COMPPROTO VJCOMP, 16 comp. channels, no comp-cid
[pptp1] CCP: Open event
[pptp1] CCP: state change Initial --> Starting
[pptp1] CCP: LayerStart
[pptp1] CCP: Up event
[pptp1] CCP: state change Starting --> Req-Sent
[pptp1] CCP: SendConfigReq #1
[pptp1] CCP: Checking whether 40 bits are enabled -> yes
[pptp1] CCP: Checking whether 56 bits are enabled -> no
[pptp1] CCP: Checking whether 128 bits are enabled -> yes
MPPC
0x01000060: MPPE, 40 bit, 128 bit, stateless
[pptp1] CCP: rec'd Configure Request #4 link 0 (Req-Sent)
MPPC
0x010000e1: MPPC MPPE, 40 bit, 56 bit, 128 bit, stateless
[pptp1] CCP: Checking whether 40 bits are acceptable -> yes
[pptp1] CCP: Checking whether 56 bits are acceptable -> no
[pptp1] CCP: Checking whether 128 bits are acceptable -> yes
[pptp1] CCP: SendConfigNak #4
MPPC
0x01000040: MPPE, 128 bit, stateless
[pptp1] IPCP: rec'd Configure Request #5 link 0 (Req-Sent)
IPADDR 0.0.0.0
NAKing with 192.168.0.4
PRIDNS 0.0.0.0
NAKing with 192.168.0.1
PRINBNS 0.0.0.0
SECDNS 0.0.0.0
SECNBNS 0.0.0.0
[pptp1] IPCP: SendConfigRej #5
PRINBNS 0.0.0.0
SECDNS 0.0.0.0
SECNBNS 0.0.0.0
[pptp1] IPCP: rec'd Configure Reject #1 link 0 (Req-Sent)
COMPPROTO VJCOMP, 16 comp. channels, no comp-cid
[pptp1] IPCP: SendConfigReq #2
IPADDR 192.168.0.1
[pptp1] CCP: rec'd Configure Nak #1 link 0 (Req-Sent)
MPPC
0x01000040: MPPE, 128 bit, stateless
[pptp1] CCP: SendConfigReq #2
[pptp1] CCP: Checking whether 40 bits are enabled -> no
[pptp1] CCP: Checking whether 56 bits are enabled -> no
[pptp1] CCP: Checking whether 128 bits are enabled -> yes
MPPC
0x01000040: MPPE, 128 bit, stateless
[pptp1] CCP: rec'd Configure Request #6 link 0 (Req-Sent)
MPPC
0x01000040: MPPE, 128 bit, stateless
[pptp1] CCP: Checking whether 128 bits are acceptable -> yes
[pptp1] CCP: SendConfigAck #6
MPPC
0x01000040: MPPE, 128 bit, stateless
[pptp1] CCP: state change Req-Sent --> Ack-Sent
[pptp1] IPCP: rec'd Configure Request #7 link 0 (Req-Sent)
IPADDR 0.0.0.0
NAKing with 192.168.0.4
PRIDNS 0.0.0.0
NAKing with 192.168.0.1
[pptp1] IPCP: SendConfigNak #7
IPADDR 192.168.0.4
PRIDNS 192.168.0.1
[pptp1] IPCP: rec'd Configure Ack #2 link 0 (Req-Sent)
IPADDR 192.168.0.1
[pptp1] IPCP: state change Req-Sent --> Ack-Rcvd
[pptp1] CCP: rec'd Configure Ack #2 link 0 (Ack-Sent)
MPPC
0x01000040: MPPE, 128 bit, stateless
[pptp1] CCP: state change Ack-Sent --> Opened
[pptp1] CCP: LayerUp
Compress using: MPPE, 128 bit, stateless
Decompress using: MPPE, 128 bit, stateless
[pptp1] setting interface ng1 MTU to 1396 bytes
[pptp1] IPCP: rec'd Configure Request #8 link 0 (Ack-Rcvd)
IPADDR 192.168.0.4
192.168.0.4 is OK
PRIDNS 192.168.0.1
[pptp1] IPCP: SendConfigAck #8
IPADDR 192.168.0.4
PRIDNS 192.168.0.1
[pptp1] IPCP: state change Ack-Rcvd --> Opened
[pptp1] IPCP: LayerUp
192.168.0.1 -> 192.168.0.4
[pptp1] IFACE: Up event
[pptp1] setting interface ng1 MTU to 1396 bytes
[pptp1] exec: /sbin/ifconfig ng1 192.168.0.1 192.168.0.4 netmask 0xffffffff -link0
[pptp1] exec: /usr/sbin/arp -s 192.168.0.4 0:4:75:fe:ed:bd pub
[pptp1] exec: /sbin/route add 192.168.0.1 -iface lo0
[pptp1] IFACE: Up event


И должен появиться сетевой интерфейс, обслуживающий соединение:

ng1: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1396
       inet 192.168.0.1 --> 192.168.0.4 netmask 0xffffffff

Вот вроде бы и всё...по мере работы с впн,может что-нибудь и допишу.