You are here

Настройка VPN для Beeline в FreeBSD

FreeBSD Beeline VPN

Как оказалось, подключение компьютера с 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

Добрый день! У меня есть пара вопросов по настройке IPFW, не могли бы вы мне помочь?

Andrey

Задавайте свои вопросы прямо здесь, либо оставьте контакты, если предмет конфидициальный.

Доброго времени!
Эти настройки подойдут для провайдера Flex-подмосковье.(L2TP)?

Спасибо за конфиг особенно за set ipcp ranges 0.0.0.0/0 1.1.1.1/32 #Костыль для FreeBSD 9.2+.Помогло при подключении к TP-Link TL-ER6020 по l2tp с FreeBSD 10.1 !

Нуждаюсь в помощи как раз по настройке дозвона до ISP через VPN на FreeBSD.
Уже мучаюсь пару недель. Добился того, что пинги даже идут (раньше и они не шли до сайтов), но сайты не открываются. Т.е. я вижу, что пакеты выходят, но не приходят.
Спасибо

Viktor

Сайты открываются по IP?

Смотрите, как у вас с DNS.