Vpn server на MPD
Содержание
Задача стояла в следующем:
Установить и настроить 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
Вот вроде бы и всё...по мере работы с впн,может что-нибудь и допишу.