Настройка VPN FreeBSD

Материал из МФТИ-телеком.

Перейти к: навигация, поиск

Содержание

[править] Обозначения

$iface обозначает интерфейс, подключенный к сети кампуса.

[править] Настройка DHCP

Если повезло, и команда

dhclient $iface

успешно конфигурирует интерфейс, то этот успех можно закрепить, добавив строку

ifconfig_$iface="DHCP"

в /etc/rc.conf для обеспечения автоматической конфигурации при загрузке. К сожалению, dhclient по умолчанию не настраивает роутинг должным образом, но чтение dhclient.conf(5) оставим пытливому читателю, в связи с тем, что у автора dhclient вообще не работает. В любом случае роутинг можно настроить с помощью следующего скрипта:

#!/bin/sh
#Полученные по DHCP, но игнорированные  роуты
route=/sbin/route
$route add 194.85.80.0 10.55.88.1 255.255.255.128
$route add 81.5.64.0 10.55.88.1 255.255.192.0
$route add 10.0.0.0 10.55.88.1 255.0.0.0
$route add 172.16.0.0 10.55.88.1 255.240.0.0
$route add 193.125.142.0 10.55.88.1 255.255.254.0
$route add 192.188.189.0 10.55.88.1 255.255.255.0
$route add 192.168.0.0 10.55.88.1 255.255.0.0
$route add 10.55.0.0 10.55.88.1 255.255.0.0
#Мультикаст
$route add -net 224.0.0.0 -interface $iface

У кого проблема с тем что не работает как надо dhclient , необходимо просто конфиг для него написать примерно следующего вида .
ee /etc/dhclient.conf

interface "em0" {
send host-name "hostname";
fixed-address xx.xx.xx.xx;
option subnet-mask 255.255.255.255;
request subnet-mask, broadcast-address, time-offset,
domain-name, domain-name-servers, host-name;
require subnet-mask, domain-name-servers;
}

em0 - мой сетевой интерфейс, к которому собственно и подключена локалка .


[править] Альтернативная настройка DHCP

Если dhclient не работает по каким-то причинам, то для конфигурации можно использовать dhcpcd.

cd /usr/ports/net/dhcpcd
#Достать исходный код dhcpcd
make install clean

Конфигурационный скрипт

#!/bin/sh
ROUTE=/sbin/route
iface=bfe0 # change to the name of yours

/usr/local/sbin/dhcpcd -T $iface
/usr/local/sbin/dhcpcd -t 30 -T $iface >/tmp/ifconfig.nfe0
chmod +x /tmp/ifconfig.nfe0
. /tmp/ifconfig.nfe0
/sbin/ifconfig $iface inet $IPADDR netmask $NETMASK
$ROUTE flush
add_route () {
        net=$1
        mask=$2
        gate=$3
        $ROUTE add $net $gate $mask
}
for i in $ROUTES
do
        add_route `echo $i|sed 's/,/ /g'`
done
$ROUTE add -net 224.0.0.0 -interface $iface

поднимает интерфейс и настраивает роутинг. Также следует настроить DNS, указав следующее в /etc/resolv.conf

nameserver 193.125.142.237
nameserver 193.125.143.173
.

[править] Указание роутов в /etc/rc.conf

Вместо скрипта, приведённого выше, можно указать статическую таблицу, создаваемую при загрузке, через /etc/rc.conf, вставив в него следующие строки:

# Create routes for MIPT UPCHK network

default_route="NO"
static_routes="mcast r1 r2 r3 r4 r5 r6 r7"
# На самом деле роутеры, по-видиму, зависят от общаги
route_r1="194.85.80.0 10.55.88.1 255.255.255.128"
route_r2="81.5.64.0 10.55.88.1 255.255.192.0"
route_r3="10.0.0.0 10.55.88.1 255.0.0.0"
route_r4="172.16.0.0 10.55.88.1 255.240.0.0"
route_r4="193.125.142.0 10.55.88.1 255.255.254.0"
route_r5="192.188.189.0 10.55.88.1 255.255.255.0"
route_r6="192.168.0.0 10.55.88.1 255.255.0.0"
route_r7="10.55.0.0 10.55.88.1 255.255.0.0"

# Multicast
route_mcast="-net 224.0.0.0 -interface bfe0"    

Команда /etc/rc.d/routing restart перечитает конфигурацию и установит роуты без перезагрузки.

[править] Настройка VPN

Используем pptp

cd /usr/ports/net/pptpclient

В файл /etc/ppp/ppp.conf добавим строки

TELECOM:
 set authname ЛОГИН
 set authkey ПАРОЛЬ
 set timeout 0
 set ifaddr 0 0
 disable ipv6cp
 disable windowing
 enable ipcp
 #add 194.85.80.0/23 HISADDR
 add default HISADDR
 disable deflate
 alias enable yes

Теперь команда (193.125.142.233 --- это IP-адрес vpdn-campus.mipt.ru)

pptp 193.125.142.233 TELECOM

должна поднять интерфейс tun0.

#ifconfig |grep tun0 -A 2
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
        inet 194.85.82.107 --> 193.125.142.233 netmask 0xffffffff
        Opened by PID 1128

Разрешаем цикл в роутинге. Без этого ничего не заработает.

route delete -host 193.125.142.233 

193.125.142.233 --- это по-прежнему IP-адрес vpdn-campus.mipt.ru. Сделать это надо до того, как телеком поймет, что на клентской стороне что-то не так, т.к. мы не отвечаем на пинги. Это где-то 60 секунд. Должна заработать связь интернетом:

$ping -c 2 ya.ru
PING ya.ru (213.180.204.8): 56 data bytes
64 bytes from 213.180.204.8: icmp_seq=0 ttl=61 time=3.577 ms
64 bytes from 213.180.204.8: icmp_seq=1 ttl=61 time=2.516 ms

Не должна пропасть связь с локальными серверами:

PING mipt.ru (193.125.143.57): 56 data bytes
64 bytes from 193.125.143.57: icmp_seq=0 ttl=63 time=0.306 ms
64 bytes from 193.125.143.57: icmp_seq=1 ttl=63 time=0.299 ms

--- mipt.ru ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.299/0.302/0.306/0.004 ms

[править] Автоматический запуск

Если pptp и настройку роутинга можно запустить из /etc/rc.local, или написав скрипт для /etc/rc.d

#Дождемся, пока появится связь с сетью
while ping -c 1 193.125.142.233|grep "100.0% packet loss"
do
    sleep 1
done
#Подключаемся к VPN
/usr/local/sbin/pptp 193.125.142.233 TELECOM&
#Ждем поднятия интерфейса. Грязно, но работает
while ! ifconfig | grep ' -->'
do
    sleep 1
done
/sbin/route delete -host 193.125.142.233
#,

то dhcpcd капризничает и падает от SIGHUP. Предлагается запуск через cron:

#/etc/crontab
@reboot root sh СКРИПТ

Мой скрипт запуска выглядит так

/sbin/ifconfig re0 link xx:xx:xx:xx:xx:xx #МАС-адрес старой сетевой карты
/root/dhcp #Укзанный выше скрипт, вызывающий dhcpcd
while ping -c 1 193.125.142.233|grep "100.0% packet loss"
do
    sleep 1
done
/usr/local/sbin/pptp 193.125.142.233 TELECOM&
#Ждем установления соединения
while ! ifconfig | grep ' -->'
do
    sleep 1
done
/sbin/route delete -host 193.125.142.233

[править] Автоматический запуск. Вариант 2

Для поднятия/опускания соединения методами rc.conf проделайте следующие действия:

  • Создайте файл /usr/local/etc/rc.d/campusnet с таким содержанием
#!/bin/sh
#
# PROVIDE: campusnet
#
# Written by GGG 03.08.08 for UPCHK automated connection.
#
# Add the following line to /etc/rc.conf to enable MIPT UPCHK Internet connection
#
# campusnet_enable="YES"
#

. /etc/rc.subr

name="campusnet"
rcvar=${name}_enable

load_rc_config $name

# : ${campusnet_enable="NO"}

start_cmd=campusnet_start
stop_cmd=campusnet_stop
pidfile=/var/run/tun0.pid

# Can be TELECOM or smth from /etc/ppp/options.pptp
profile="TELECOM"

campusnet_start()
{
	echo "Starting PPTP connection to MIPT UPCHK with $profile"
	
	/usr/local/sbin/pptp 193.125.142.233 $profile&
	# After the link is up, ppp.linkup is executed 
	# NOTE there's 'sleep 5' command, and this period can be too short
	return 0
}

campusnet_stop()
{	
	# FIXME No check if a connection exists is done.
	echo "Stopping ppp pid" `cat $pidfile`
	kill -SIGINT `cat $pidfile` 
	
}

run_rc_command "$1"

Он будет запускать/закрывать соединение в момент старта/останова системы или по команде /usr/local/etc/rc.d/campusnet {start|stop}.

  • Создайте файл /etc/ppp/ppp.linkup:
TELECOM:
  ! sh -c "sleep 5; echo 'Resolving routing loop'; /sbin/route delete -host 193.125.142.233;  "

Он необходим для разрешения ошибки с routing loop и вызывается из предыдущего скрипта после поднятия линка.

  • Файл /etc/ppp/options.pptp
nodeflate
nobsdcomp
noauth
persist
#debug
#nodetach
  • Файл /etc/ppp/ppp.conf
TELECOM:
 set authname "NAME"
 set authkey "PASS"
 set timeout 0
 set ifaddr 0 0
 disable ipv6cp
 disable windowing
 enable ipcp
 add default HISADDR
  • В файле /etc/rc.conf добавьте строку
campusnet_enable="YES" 

Для включения службы.

  • После перезагрузки интерфейс tun0 должен подняться, ps axl |grep pp должен сообщать о процессах ppp и pptp, файл /var/run/tun0.pid должен существовать.

[править] Устранение неполадок

Если DHCP все равно не работает, то можно попробовать указать статический IP (хотя у меня IP меняется, но нам все-таки обещали лиз чуть ли не на год).

Если не работает ppp, то нужно читать /var/log/ppp.log.

Ряд проблем можно обнаружить, наблюдая за своей таблицей маршрутизации на разных стадиях подключения. Проверьте свою, в конечном итоге она должна выглядеть примерно так:

$ netstat -nr
Internet:
Destination        Gateway            Flags    Refs      Use  Netif Expire
default            193.125.142.233    UGS         0     5956   tun0       
10.0.0.0/8         10.55.88.1         UGS         0        0    re0       
10.55.0.0/16       10.55.88.1         UGS         0      147    re0       
10.55.88.0/23      link#1             UC          0        0    re0
10.55.88.1         00:11:5d:bd:b3:46  UHLW        4        0    re0   1192
10.55.88.26        00:14:2a:4a:19:3d  UHLW        1        0    re0   1157
10.55.88.52        00:0f:ea:3c:a3:b3  UHLW        1       25    re0   1157
10.55.89.64        00:00:1c:d8:20:ea  UHLW        1       19    re0   1192
10.55.89.87        00:16:36:57:fa:31  UHLW        1       26    re0   1157
10.55.89.255       ff:ff:ff:ff:ff:ff  UHLWb       1       86    re0
81.5.64.0/18       10.55.88.1         UGS         0        0    re0
127.0.0.1          127.0.0.1          UH          0      763    lo0
172.16.0.0/12      10.55.88.1         UGS         0        0    re0
192.168.0.0/16     10.55.88.1         UGS         0        0    re0
192.188.189.0/24   10.55.88.1         UGS         0        0    re0
193.125.142.0/23   10.55.88.1         UGS         0     7613    re0
194.85.80.0/25     10.55.88.1         UGS         0   113703    re0
224.0.0.0/4        link#1             UCS         0        0    re0

[править] Альтернативная настройка VPN

Более быстрый доступ к VPN обеспечивает MPD. Рассмотрим на примере MPD версии 3. Можно использовать и более поздние версии, но на момент написания статьи в них содержалась ошибка, приводящая к перезагрузке системы при подключении к VPN (в CVS-версии mpd5 ошибка исправлена).

[править] Конфигурация MPD

Установка mpd:

#cd /usr/ports/net/mpd
#make install clean

Конфигурационные файлы MPD находятся в /usr/local/etc/mpd и называются mpd.conf и mpd.links. Пример конфигурации:

#/usr/local/etc/mpd/mpd.links:
pptp-cl:
        set link type pptp
        set pptp enable originate incoming outcall
        set pptp peer 193.125.142.233
#/usr/local/etc/mpd/mpd.links:
defalut:
        load telecom
telecom:
        new -i ng0 pptp-cl pptp-cl
        set bundle authname <username>
        set bundle password <password>
        set bundle disable multilink

        set link no acfcomp protocomp
        set link disable chap
        set link accept chap
        set link keep-alive 30 10
        set ipcp ranges 0.0.0.0/0 0.0.0.0/0

        set iface route default
        set iface disable on-demand
        set iface disable proxy-arp
        set iface idle 0
        open
,

где <username> и <password> --- логин и пароль для доступа к VPN соответственно, 193.125.142.233 --- IP-адрес сервера vpdn-campus.mipt.ru.

[править] Запуск MPD

Теперь комнада

#mpd telecom

должна создать интерфейс ng0 и подключить его к VPN. Для того, чтобы VPN стал доступен, НЕОБХОДИМО устранить кольцо в маршрутизации. Это делается командой

#route delete -host 193.125.142.233

Проверим доступность внешних серверов:

ping ya.ru
PING ya.ru (213.180.204.8): 56 data bytes
64 bytes from 213.180.204.8: icmp_seq=0 ttl=61 time=2.018 ms
64 bytes from 213.180.204.8: icmp_seq=1 ttl=61 time=1.752 ms
64 bytes from 213.180.204.8: icmp_seq=2 ttl=61 time=2.011 ms

Для автоматического запуска можно использовать следующий скрипт:

#!/bin/sh
/usr/local/sbin/mpd -b telecom                           
while ! /sbin/ifconfig ng0| grep ' -->'                  
do                                                       
        sleep 1                                          
done                                                     
/sbin/route delete -host 193.125.142.233

[править] L2TP MPD

Конфиг для l2tp :

$ cat mpd.conf
startup:
        set user xxxx xxxx admin
        set user xxxx xxxx
        set console self 127.0.0.1 xxxx
        set console open
        set web self 0.0.0.0 xxxx
        set web open

default:
        load l2tp_client

l2tp_client:
        create bundle static B1
        set bundle disable crypt-reqd
        set ipcp no vjcomp
        set ipcp ranges 0.0.0.0/0 0.0.0.0/0
        set iface up-script /usr/local/etc/mpd5/up.sh
        set iface down-script /usr/local/etc/mpd5/down.sh
        set iface enable tcpmssfix
        create link static L1 l2tp
        set link action bundle B1
        set link max-redial 0
        set link mtu 1460
        set link keep-alive 20 75
        set link accept chap
        set link no pap
        set auth authname xxxx
        set auth password xxxx
        set l2tp peer vpdn-4.mipt.ru
        open

Скрипты при поднятии линка и дисконекта.

$ cat up.sh 
#!/bin/sh

LocalGW="<ip DG>" #`cat /tmp/Current_Local_GW`

route delete $4
route add $4 $LocalGW
route delete default
route add default $4

echo $4 > /tmp/vpn_GW



$ cat down.sh 
#!/bin/sh

LocalGW="<ip DG>" #`cat /tmp/Current_Local_GW`

vpnGW=`cat /tmp/vpn_GW`
route delete $vpnGW
route delete default
route add default $LocalGW

[править] Примечания

  1. Некоторым программам, например, cvsup не нравится то, что

локальный IP не имеет DNS-имени. TELECOM вроде бы обещал со временем обеспечить DNS-имена, а пока можно добавить строку в /etc/hosts.conf.

[править] Литература

  1. man ppp
  2. man pptp
  3. man route
  4. man ifconfig
  5. man dhclient
  6. man rc.conf
Личные инструменты