Настройка 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
[править] Примечания
- Некоторым программам, например, cvsup не нравится то, что
локальный IP не имеет DNS-имени. TELECOM вроде бы обещал со временем обеспечить DNS-имена, а пока можно добавить строку в /etc/hosts.conf.
[править] Литература
- man ppp
- man pptp
- man route
- man ifconfig
- man dhclient
- man rc.conf
