MPD и VPN PPTP во FreeBSD
У нас в стране достаточно распространен PPTP тип доступа в интернет. В операционках от MS все просто — создал VPN подключение с нужным типом и радуешься жизни. Что касается FreeBSD, то начинающий пользователь этой системы зачастую ставится в тупик вопросом, как же реализовать pptp подключение. Хотя это и странно, потому что исписано по этому поводу пол-интернета. Ну и я внесу свой вклад в загрязнение мировой паутины.
А во FreeBSD есть замечательная штука, называется MPD — Основанная на нетграфах(netgraph) реализация PPP для FreeBSD. Штука очень мощная, гибкая и функциональная, умеющая dial-up, pptp, l2tp, pppoe, и вообще, если документацию внимательно почитать, то и на баяне играющая. Умеет быть как клиентом, так и сервером, в том числе одновременно. Но нам сейчас надо реализовать клиента, чтобы из внутренней сети подключиться к серверу доступа и выйти в Интернет.
В первую голову нам нужен сам mpd, благо он есть в портах, причем в двух реализациях, mpd4 и mpd5. Ставить будем пятую версию, мне она значительно больше нравится, конфиги четвертой рассмотрим в конце.
[cc lang=»bash»]# cd /usr/ports/net/mpd5 && make install clean[/cc]
Конфигурационное окно оставляем без изменений, все, что там конфигурируется нужно скорее серверу, нежели клиенту.
далее идем в /usr/local/etc/mpd5 и копируем mpd.conf.sample в mpd.conf — это наш основной конфигурационный файл.
Теперь правим его, сначала секции [startup] и [default]. Вообще говоря, все, кроме load pptp_client для клиента — опционально, но пароли надо бы сменить.
startup:
# configure mpd users - назначаем пользователей, имеющих право интерактивно управлять mpd
# заменяем %username% и %password% на соответствующие значения. Они не имеют никакого
# отношения парполю и логину на сервер доступа в Интернет.
set user %username% %password% admin
# configure the console
set console self 127.0.0.1 5005
set console open
# configure the web server
# У mpd есть свой web-сервер. зайдя на него браузером можно управлять демоном.
# myip-address заменяем на свой адрес, myport - на порт, на котором будет отвечать вебсервер.
set web self myip-address myport
set web open
set link enable report-mac
default:
Теперь ищем секцию [pptp_client] и правим ее, там у нас находится самое интересное.
pptp_client:
#
# PPTP client: only outgoing calls, auto reconnect,
# ipcp-negotiated address, one-sided authentication,
# default route points on ISP's end
#
create bundle static B1
set iface route default
set iface up-script /usr/local/etc/mpd5/mpd_up.sh
set iface down-script /usr/local/etc/mpd5/mpd_down.sh
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
create link static L1 pptp
set link action bundle B1
# заменяем %pptp_username% и %pptp_password% именем и паролем пользователя, выданным
# провайдером.
set auth authname %pptp_username%
set auth password %pptp_password%
set link max-redial 0
set link mtu 1460
set link keep-alive 20 75
# Заменяем %server_ip_address% на ip адрес сервера, или его dns-имя.
set pptp peer %server_ip_address%
set pptp disable windowing
open
C mpd.conf закончили. Теперь несколько слов о скриптах, выполняющихся при поднятии и закрытии виртуального интерфейса, они у нас описаны в строчках set iface up-script /usr/local/etc/mpd5mpd_up.sh и set iface down-script /usr/local/etc/mpd5/mpd_down.sh
Зачем они нужны: зачастую при поднятии интерфейса нужно произвести какое-либо действие, например, поменять маршрут по умолчанию на сервер доступа в интернет, если до этого такой маршрут был назначен, а потом вернуть его на место. Собственно, в тривиальных ситуациях это единственная задача данных скриптов.
Для начала надо определиться, нужна ли нам смена маршрута. Если в /etc/rc.conf у нас есть строчка
[cc lang=»bash»]defaultrouter=»router_ip_address»[/cc]
значит, маршрут менять надо. В противном случае надо разобраться, почему у нас нет маршрута по умолчанию. Маршрут по умолчанию можно также выполнить командой
# route get default
возможно, вы вносили его вручную. В таком случае его все равно надо менять.
При поднятии интерфейса, mpd запускает на выполнение указанный в конфиге скрипт (up-script.sh) и передает ему ряд параметров, среди которых четвертый — адрес виртуального интерфейса сервера доступа, который будет являться шлюзом по умолчанию.
Так или иначе, создаем файл /usr/local/etc/mpd5/mpd_up.sh и делаем его исполняемым:
# touch mpd_up.sh
# chmod 755 mpd_up.sh
После этого, вставляем в этот скрипт одну строчку:
[cc lang=»bash»]route change default $4[/cc]
При поднятии интерфейса в переменную $4 скрипта передается адрес нужного нам шлюза и весь трафик на чужие сети пойдет через него.
По окончании работы mpd было бы неплохо восстановить предыдущий маршрут по умолчанию, для этого используется скрипт mpd_down.sh (создаем его по аналогии с mpd_up.sh), в котором %router_ip_address% меняем на значение переменной defaultrouter из /etc/rc.conf
/usr/local/etc/mpd5/mpd_down.sh:
[cc lang=»bash»]route change default %router_ip_address%[/cc]
Теперь что делать, если у нас уже установлен mpd4. Здесь нас интересуют два конфигурационных файла: уже известный нам /usr/local/etc/mpd4/mpd.conf и еще /usr/local/etc/mpd4/mpd.links. Начнем с последнего. В нем хранится информация об ip-адресе сервера доступа, а так же о нашем ip-адресе:
# обратите внимание, что перед самим описанием адресов стоит та же метка,
# которую мы загружаем по умолчанию в mpd.conf
pptp_client:
set link type pptp
set pptp self %my_ip_address%
set pptp peer %server_ip_address%
set pptp enable originate incoming outcall
%server_ip_address% меняем на адрес сервера доступа, %my_ip_address% — на свой ip-адрес. Если свой ip-адрес неизвестен (например, в сети получение адресов возложено на DHCP сервер), эту строчку необходимо вовсе убрать. Если она будет содержать неверное значение нашего адреса, то соединение не установится.
Теперь /usr/local/etc/mpd4/mpd.conf — в нем есть отличия:
pptp_client:
new -i ng0 vpn vpn
set iface disable on-demand
set iface addrs 192.168.1.1 192.168.2.1
set iface idle 0
set iface route default
set iface up-script /usr/local/etc/mpd4/mpd_up.sh
set iface down-script /usr/local/etc/mpd4/mpd_down.sh
set bundle disable multilink
set auth authname "%pptp_username%"
set auth password "%pptp_password"
set link yes acfcomp protocomp
set link disable chap pap
set link accept chap pap
# Автовосстановление линка при обрыве - у mpd4 по умолчанию этот параметр установлен
# в enable - при разрыве не происходит попытки восстановления связи.
set bundle disable noretry
set link max-redial 0
# Без следующих строк соединение с windows-сервером не произойдет
set link enable no-orig-auth
set link keep-alive 10 75
set ipcp yes vjcomp
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
# обратите внимание, без следующих строк соединение с windows-серверами будет невозможно.
# У меня без них не получилось соединиться с windows-сервером даже с отключенным шифрованием
# на последнем. Насколько я знаю, отсутствие этих строк в конфиге портит жизнь многим
# начинающим mpd4-водам.
# The five lines below enable Microsoft Point-to-Point encryption
# (MPPE) using the ng_mppc(8) netgraph node type.
#
set bundle enable compression
set ccp yes mppc
set ccp yes mpp-e40
set ccp yes mpp-e128
set bundle enable crypt-reqd
set ccp yes mpp-stateless
open
Собственно, на этом все. Теперь от root даем команду
# mpd4 -b
или
# mpd5 -b
ключ -b заставляет mpd запуститься в фоне. Теперь делаем
# ifconfig
если все нормально, в конце вывода видим что-то вроде того:
[cc lang=»bash»]ng0: flags=88d1 metric 0 mtu 1496
inet 192.168.4.136 —> 192.168.4.1 netmask 0xffffffff
[/cc]
ng0 — мой виртуальный интерфейс, 192.168.4.136 — адрес этого интерфейса, 192.168.4.1 — виртуальный адрес сервера. На последний должен смотреть наш шлюз по умолчанию. Выясняем это с помощью
# route get default
route to: default
destination: default
mask: default
gateway: 192.168.4.1
interface: ng0
flags:
recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire
0 0 0 0 0 0 1496 0
ну вот, все нормально :) Интерфейс поднялся, скрипт отработался, можно идти качать порнуху.
PS: Кстати, если посмотреть в mpd.conf ниже секции [pptp_client], там можно обнаружить секцию [pppoe_client], которая настраивается по аналогии, но позволяет работать с pppoe соединением вместо pptp. Настраиваем и по дефолту грузим ее.
PPS не забываем сделать
chmod 755 /usr/local/etc/mpd5/mpd_up.sh
chmod 755 /usr/local/etc/mpd5/mpd_down.sh
>Если свой ip-адрес неизвестен (например, в сети получение адресов возложено на DHCP сервер), эту строчку >необходимо вовсе убрать.
Можно просто оставитЬ ее пустой :)