FreeBSD. Использование mpd5 в качестве vpn-клиента (pptp)
После танцев с бубном с pptpclient, особенно напрягала проблема с “/bin/ip not found”, я всётаки решил использовать в качестве vpn-клиента mpd5! :)
Предыстория
У меня не было интернета, поэтому я скачивал пакеты с ftp.freebsd.org (с другой машины), клал на флешку и устанавливал на “сервер” которому нужен был vpn-клиент для работы в интернете.
Итак, действующие лица:
- На стороне клиента (то есть меня)
- Лептоп с Windows XP
- Сервер с FreeBSD 7.1
- Сетевой интерфейс rl1 для подключения к интернету
- Сетевой интерфейс rl0 для подключения к локальной сети (нам это не интересно)
- На стороне сервера (Провайдер AirNet)
- FreeBSD 5.2.1 (SPARC)
- DHCP-сервер
- Gateway: 192.168.128.33
- DNS: 192.168.128.33
- VPN: vpn.airnet.lan (192.168.128.7)
При подключении в Windows наблюдаем следующую картину:
- Используется “Безопасный пароль”
- Шифрование отключено
Установка mpd5
Заходим на ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-7.1-release/ и на http://www.freshports.org/ (для поиска пакетов).
- Качаем mpd (net/mpd-5.1_1.tbz)
- Качаем expat (textproc/expat-2.0.1.tbz)
- Качаем libpdel (devel/libpdel-0.5.3_4.tbz)
Сливаем все на флешку и монтируем ее во фрю:
# mount_msdosfs /dev/da0s1 /mnt
Устанавливаем мопед
# pkg_add mpd-5.1_1.tbz
Остальные пакеты (зависимости) сами поставятся, если они находятся на одном уровне с mpd-5.1_1.tbz
Вы можете скачать все эти пакеты с моего сайта: mpd-51_1, expat-201 и libpdel-053_4
Настройка pptp_client
Отредактируем /etc/rc.conf до вида:
# Запускаем при загрузке MPD
mpd_enable="YES"
# Для интерфейса rl1 используем DHCP
ifconfig_rl1="DHCP"
Отредактируем файл /etc/resolv.conf и добавим DNS-адреса
nameserver 192.168.128.33
Отредактируем файл /usr/local/etc/mpd5/mpd.conf до вида:
startup:
default:
load pptp_client
pptp_client:
create bundle static B1
set iface route default
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
create link static L1 pptp
set link action bundle B1
set auth authname "ЛОГИН"
set auth password "ПАРОЛЬ"
set link max-redial 0
set link mtu 1460
set link keep-alive 20 75
set pptp peer vpn.airnet.lan
set pptp disable windowing
open
Для дополнительной информации о коммандах и опциях обращайтесь к оф. страницам руководства.
Для рестарта DHCP-клиента используйте: # dhclient -d rl1
Теперь у вас должно все заработать! Если нет, пишите камменты :)
А теперь, продолжение моей истории…
Конфиг был полностью рабочий, однако подключение не удавалось создать!
Multi-link PPP daemon for FreeBSD
process 1080 started, version 5.1 (root@freebsd.org 18:20 9-Sep-2008)
[B1] Bundle: Interface ng1 created
[L1] [L1] Link: OPEN event
[L1] LCP: Open event
[L1] LCP: state change Initial --> Starting
[L1] LCP: LayerStart
[L1] PPTP call successful
[L1] Link: UP event
[L1] Link: origination is local
[L1] LCP: Up event
[L1] LCP: state change Starting --> Req-Sent
[L1] LCP: SendConfigReq #1
[L1] ACFCOMP
[L1] PROTOCOMP
[L1] ACCMAP 0x000a0000
[L1] MRU 1500
[L1] MAGICNUM a04506b0
[L1] LCP: rec'd Configure Ack #1 (Req-Sent)
[L1] ACFCOMP
[L1] PROTOCOMP
[L1] ACCMAP 0x000a0000
[L1] MRU 1500
[L1] MAGICNUM a04506b0
[L1] LCP: state change Req-Sent --> Ack-Rcvd
[L1] LCP: state change Ack-Rcvd --> Req-Sent
[L1] LCP: SendConfigReq #2
[L1] ACFCOMP
[L1] PROTOCOMP
[L1] ACCMAP 0x000a0000
[L1] MRU 1500
[L1] MAGICNUM a04506b0
[L1] LCP: rec'd Configure Ack #2 (Req-Sent)
[L1] ACFCOMP
[L1] PROTOCOMP
[L1] ACCMAP 0x000a0000
[L1] MRU 1500
[L1] MAGICNUM a04506b0
[L1] LCP: state change Req-Sent --> Ack-Rcvd
[L1] LCP: rec'd Configure Request #148 (Ack-Rcvd)
[L1] ACFCOMP
[L1] PROTOCOMP
[L1] MRU 1500
[L1] MAGICNUM 4a711d50
[L1] AUTHPROTO CHAP MSOFTv2
[L1] LCP: SendConfigAck #148
[L1] ACFCOMP
[L1] PROTOCOMP
[L1] MRU 1500
[L1] MAGICNUM 4a711d50
[L1] AUTHPROTO CHAP MSOFTv2
[L1] LCP: state change Ack-Rcvd --> Opened
[L1] LCP: auth: peer wants CHAP, I want nothing
[L1] LCP: LayerUp
[L1] CHAP: rec'd CHALLENGE #1 len: 21
[L1] Name: ""
[L1] CHAP: Using authname "andreevmv"
[L1] CHAP: sending RESPONSE #1 len: 63
[L1] CHAP: sending RESPONSE #1 len: 63
[L1] CHAP: rec'd FAILURE #1 len: 31
[L1] MESG: E=691 R=0 M=Login incorrect
[L1] LCP: authorization failed
[L1] LCP: parameter negotiation failed
[L1] LCP: state change Opened --> Stopping
...
Была найдена проблема, провайдер не выдавал нормальный IP-адрес по DHCP оборудованию, не закрепленному за пользователем. То есть моя сетевая карта на сервере являлась не зарегистрированной, а карта на лептопе - являлась зарегистрированной в биллинговой системе.
Было тут же найдено решение, использовать поддельный MAC-адрес от сетевой карты лептопа!
Подменяем MAC на сервере:
# ifconfig rl1 ether 00:00:00:00:00:00
И получилось у нас сменить MAC и получить по DHCP нормальный IP-адрес:
...
rl1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=8<VLAN_MTU>
ether 00:00:00:00:00:00
inet 192.168.135.18 netmask 0xffff0000 broadcast 192.168.255.255
media: Ethernet autoselect (none)
status: no carrier
...
Для того чтобы не менять каждый раз, я добавил в /etc/rc.conf:
# Для rl1 подменяем MAC-адрес
ifconfig_rl1="ether 00:00:00:00:00:00"
После чего еще раз попробовал подсоединится по vpn:
# mpd5
И у меня получилось авторизоваться и получить внешний IP-адрес!
...
[L1] CHAP: Using authname "andreevmv"
[L1] CHAP: sending RESPONSE #1 len: 63
[L1] CHAP: rec'd SUCCESS #1 len: 46
[L1] MESG: S=7E9FBD94F23E66ED6EF6E8105664B9F8A20982C8
[L1] LCP: authorization successful
...
[B1] IPCP: LayerUp
[B1] 172.16.4.41 -> 93.92.200.24
[B1] IFACE: Up event
...
Наконец-то получилось поднять интерфейс ng1 и выйти в интернет!
...
rl1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=8<VLAN_MTU>
ether 00:00:00:00:00:00
inet 192.168.135.18 netmask 0xffff0000 broadcast 192.168.255.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
...
ng0: flags=8890<POINTOPOINT,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1500
ng1: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1460
inet 172.16.4.41 --> 93.92.200.20 netmask 0xffffffff
Мои благодарности:
- Родному форуму Pyha.ru, а так же phpdude за поддержание дискуссии :)
- Форуму провайдера AirNet (к сожалению форум доступен только изнутри http://forum.airnet.lan/showthread.php?t=1759) и конкретно пользователям CoDe и Technogen за помощь в поиске бага!
- Пользователю alexshur за провокации в сторону mpd5 :)


Комментарии 16
Архив обсуждения. Новые комментарии закрыты.
Однако. Я почему-то всегда был уверен что к vpn можно средствами “по умолчанию” во FreeBSD приконнектится. Век живи век учись :)
Ну VPN это не обязаловка, даже в *ubunta, которые очень дружелюбны - нет pptp клиента :)
Похожая проблема, но не получается получить настройки по dhcp при подмене mac-адреса:
rc.conf:
когда вставляю “родную” сетевуху, dhcp отдается… :(
Может подменять надо раньше чем подключатся к DHCP?
Попробуйте:
ng0: flags=88d1 metric 0 mtu 1456
inet 62.33.239.136 –> 172.18.100.1 netmask 0xffffffff
Коннект есть. Сессия весит около 1 мин, потом рвется, внешнея сеть не пингуется. МОжет маршрут нужен?
Вообще, столкнулся с ситуацией, когда невозможно было сделать ifconfig ether из rc-скрипта. Дело в том, что сеть (mpd5) поднималась быстрее, чем менялся MAC карты.
Выход:
touch /etc/start_if.%ifname%
echo ifconfig %ifname% ether 00:11:22:33:44:55 >/etc/start_if.%ifname%
где %ifname% - имя нужного нам сетевого интерфейса.
А где мы говорим, что именно rl1 смотрит в нет???
Спасибо огромное !!!!!))))
неделю мучился и твой конфиг оказался 100% рабочий !!!
Думаю сменить мак-адрес и указать DHCP аналогично как тут
Не сработает только через alias:
ifconfig_r11_alias0=“ether 00:00:00:00:00:00”
Раньше работало
есть такая штука, называется ман так вот - man dhclient.conf
и там:
send dhcp-client-identifier 1:0:a0:24:ab:fb:9c;
Здравствуйте, а можно ли в freebsd подключить 2 параллельных vpn соединения?
Можно, разброс трафика можно сделать через ipfw, почитайте про шейпинг
Хорошая статья третий день ищу чтото подобное
чисто для сведения, чтобы не городить в файрволле странных конструкций
00900 0 0 allow tcp from any to any via ng*
01000 10 1060 allow udp from any to any via ng*
01100 33 2604 allow icmp from any to any via ng*
01200 0 0 allow ip from any to any via ng*