19.02.2011, Обновление сайта
15.02.2011, Mozilla Firefox 4.0
Как оказалось, подключение компьютера с FreeBSD на борту к провайдеру Corbina / Beeline нетривиальная задача. Ни одно из найденных в сети руководств не помогло в этом деле. Скорее всего, по причине изменения версий как ОС, так и PPP клиента MPD. В результате нам пришлось разбираться с этим самим, что и вылилось в данную статью.
Была установлена свежая система FreeBSD 8.2-RELEASE. Машина является роутером и имеет локальный IP 192.168.1.1
В качестве программы-клиента VPN выбрана MPD5:
Mpd is a netgraph(4) based implementation of the multi-link PPP protocol for FreeBSD. It is designed to be both fast and flexible. It handles configuration and negotiation in user land, while routing all data packets strictly in the kernel. It supports several of the numerous PPP sub-protocols and extensions, such as:
Multi-link PPP capability PAP, CHAP, MS-CHAP and EAP authentication PPP compression and encryption IPCP and IPV6CP parameter negotiation.
Для того, чтобы задействовать ядерный NAT, пересоберите ядро со следующими опциями:
options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=50
options IPFIREWALL_FORWARD
options IPDIVERT
options IPFIREWALL_NAT
options LIBALIAS
options ROUTETABLES=2
В файл sysctl.conf добавляем
net.inet.ip.fw.one_pass=1
Ставим MPD5:
#cd /usr/ports/net/mpd5 && make install clean
Следующие файлы должны лежать в директории /usr/local/etc/mpd5/:
up.sh, down.sh, mpd.conf.
Содержимое файла up.sh:
#!/bin/sh
gw=`netstat -rn | awk '$1=="default"{print $2}'`
route delete $4
route add $4 $gw
route delete default
route add default $4
echo $4 > /tmp/mpd_dr
echo $gw > /tmp/mpd_gw
sleep 20
#Удаляем правило NAT для локалки
ipfw delete 1000
###Rules for kernel NAT
ipfw nat 2 config log if ng0 deny_in reset same_ports
#Добавляем правило NAT через ng0
ipfw add 1000 nat 2 ip from any to any via ng0
#Пропиликаем "Ура!"
(kldload speaker && /bin/echo -e "l2b.f+.p16a.c+.p" > /dev/speaker && kldunload speaker)&
Содержимое файла down.sh:
#!/bin/sh dr=`cat /tmp/mpd_dr` gw=`cat /tmp/mpd_gw` route delete $dr route delete default route add default $gw rm -f /tmp/mpd_dr rm -f /tmp/mpd_gw #Удаляем NAT через ng0 ipfw delete 1000 #Возвращаем NAT в локалку Корбины ipfw add 1000 nat 1 ip from any to any via fxp0 #Пропиликаем "Оторвалось!" kldload speaker /bin/echo -e "gc.c8dee2" > /dev/speaker kldunload speaker
Содержимое файла mpd.conf:
startup:
#детальный лог без событий и пакетов
log +ALL -EVENTS -FRAME
# configure mpd users
set user <пользователь> <пароль> admin
set user foo1 bar1
# консоль доступна с любого IP (опасно, укажите свой IP!)
set console self 0.0.0.0 5005
#открыть консоль
set console open
#WEB-сервер доступен с любого IP (опасно, укажите свой IP!)
set web self 0.0.0.0 5006
#открыть WEB-сервер
set web open
#По-умолчанию подключение следующее:
default:
# load Corbina_L2TP
load Corbina_PPTP
Corbina_L2TP:
create bundle static L2TP
set bundle disable compression
set bundle disable round-robin
set bundle disable encryption
set bundle disable crypt-reqd
set bundle disable bw-manage
set bundle disable ipv6cp
set bundle enable ipcp
set ipcp no vjcomp
set iface mtu 1460
set iface idle 0
set iface enable tcpmssfix
set iface up-script /usr/local/etc/mpd5/up.sh
set iface down-script /usr/local/etc/mpd5/down.sh
create link static L2 l2tp
set link action bundle L2TP
set link latency 0
#Пытаться связаться до опупенья
set link max-redial 0
#Пауза между попытками поднять туннель, по рекомендации провайдера
set link redial-delay 60
set link disable incoming acfcomp protocomp magicnum check-magic shortseq
set link deny chap-msv2 chap-msv1 pap eap acfcomp protocomp shortseq
set link accept chap-md5
#После 10 секунд отсутствия активности проверить соединение LCP пакетами,
#повторять каждые 10 секунд. По истечении 75 секунд разорвать линк.
set link keep-alive 10 75
#Здесь выбираем рабочий пир для вашей подсетки
#set l2tp peer l2tp.corbina.net
set l2tp peer tp.corbina.net
#set l2tp peer 85.21.0.255
#set l2tp peer tp.internet.beeline.ru
set auth authname "<ВАШ ЛОГИН>"
set auth password "<ВАШ ПАРОЛЬ>"
open
Corbina_PPTP:
create bundle static PPTP
set bundle disable compression
set bundle disable round-robin
set bundle disable encryption
set bundle disable crypt-reqd
set bundle disable bw-manage
set bundle disable ipv6cp
set bundle enable ipcp
set ipcp no vjcomp
set iface mtu 1460
set iface idle 0
set iface enable tcpmssfix
set iface up-script /usr/local/etc/mpd5/up.sh
set iface down-script /usr/local/etc/mpd5/down.sh
create link static L1 pptp
set link action bundle PPTP
set link latency 0
#Пытаться связаться до опупенья
set link max-redial 0
#Пауза между попытками поднять туннель, по рекомендации провайдера
set link redial-delay 60
set link disable incoming acfcomp protocomp magicnum check-magic shortseq
set link deny chap-msv2 chap-msv1 pap eap acfcomp protocomp shortseq
set link accept chap-md5
#После 10 секунд отсутствия активности проверить соединение LCP пакетами,
#повторять каждые 10 секунд. По истечении 75 секунд разорвать линк.
set link keep-alive 10 75
set pptp peer vpn.corbina.net
set auth authname "<ВАШ ЛОГИН>"
set auth password "<ВАШ ПАРОЛЬ>"
open
Дать права на запуск скриптов:
chmod +x /usr/local/etc/mpd5/*.sh
Следующие файлы должны лежать в директории /etc:
rc.conf, ipfw/firewall.sh.
Содержимое файла rc.conf, указанные строки обязательны для нашей сети, у вас могут быть и другие помимо них.
synchronous_dhclient="YES"
defaultrouter="10.213.8.1" #Здесь шлюз по умолчанию, можно узнать с помощью netstat -rn
inetd_enable="YES"
ifconfig_fxp0="dhcp" #Сетевой интерфейс, подключенный к провайдеру.
ifconfig_nfe0="inet 192.168.1.1 netmask 255.255.255.0" #Сетевой интерфейс, подключенный
#к локальной сети
firewall_enable="YES" #правила из файла /etc/rc.firewall
firewall_nat_enable="YES" #Включаем ядерный NAT
firewall_script="/etc/ipfw/firewall.sh" #набор правил брандмауэра
gateway_enable="YES" #выступать в качестве шлюза
firewall_nat_interface="fxp0" #обозначаем, через какой интерфейс будем ходить в интернет
mpd_enable="YES" #PPP клиент
mpd_flags="-b" #PPP клиент
Содержимое файла ipfw/firewall.sh.
#!/bin/sh
#set variables
fwcmd="ipfw -q" #command ipfw
LanIf="nfe0" #Interface LAN
LanNet="192.168.0.0/16" #LAN IP
LanIp=`ifconfig nfe0 | grep inet | awk '{print $2}'`WanIf="fxp0" #Interface WAN
#определяем IP WAN
WanIp=`ifconfig fxp0 | grep inet | awk '{print $2}'`ipfw -q -f flush #Сбрасываем правила
${fwcmd} add 1 allow ip from any to any via lo0 #Loopback${fwcmd} add 300 deny ip from any to 127.0.0.0/8 via ${WanIf} #Loopback${fwcmd} add 301 deny ip from 127.0.0.0/8 to any via ${WanIf} #Loopback#Beeline! ${fwcmd} add 302 deny ip from any to 10.0.0.0/8 in via ${WanIf} #RFC 1918 private IP${fwcmd} add 303 deny ip from any to 172.16.0.0/12 in via ${WanIf} #RFC 1918 private IP${fwcmd} add 304 deny ip from any to 192.168.0.0/16 in via ${WanIf} #RFC 1918 private IP${fwcmd} add 305 deny ip from any to 0.0.0.0/8 in via ${WanIf} #Loopback${fwcmd} add 306 deny all from 169.254.0.0/16 to any in via ${WanIf} #DHCP auto-config${fwcmd} add 307 deny all from 192.0.2.0/24 to any in via ${WanIf} #reserved for docs${fwcmd} add 308 deny all from 204.152.64.0/23 to any in via ${WanIf} #Sun cluster interconnect${fwcmd} add 309 deny all from 224.0.0.0/3 to any in via ${WanIf} #Class D, E multicast${fwcmd} add 500 check-state #check method keep-state${fwcmd} add 600 allow all from any to me via ${LanIf} #Пускаем на машину из локалки#NAT
${fwcmd} nat 1 config log if ${WanIf} deny_in reset same_ports${fwcmd} add 1000 nat 1 ip from any to any via ${WanIf}${fwcmd} add 1001 allow all from any to any #for NAT${fwcmd} add 65000 deny ip from any to any #The END.WEB-интерфейс MPD открывается по адресу http://192.168.1.1:5006/
Подключение и отключение VPN производится нажатием ссылок [open] [close]