You are here
Настройка VPN для Beeline в FreeBSD
Как оказалось, подключение компьютера с FreeBSD на борту к провайдеру Corbina / Beeline нетривиальная задача. Ни одно из найденных в сети руководств не помогло в этом деле. Скорее всего, по причине изменения версий как ОС, так и PPP клиента MPD. В результате нам пришлось разбираться с этим самим, что и вылилось в данную статью.
Была установлена свежая система FreeBSD 8.2-RELEASE. Впоследствии, то же самое было проделано с FreeBSD 9.1. Машина является роутером и имеет локальный 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 #Делаем доступной локалку при поднятом соединении route delete 85.21.72.80/28 route delete 217.118.84.0/24 #Пропиликаем "Ура!" (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 ipcp ranges 0.0.0.0/0 1.1.1.1/32 #Костыль для FreeBSD 9.2+ 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.
Содержимое файла /etc/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 клиент
Содержимое файла /etc/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]
Comments