Наши
Сайдбары
   
IRC-канал
Linuxportal.ru
   
Импорт новостей
 
Вход Быстрая регистрация На главную

Поиск:
 
   БИБЛИОТЕКА
     Другие статьи этого раздела:
 

    Сеть
Другие разделы библиотеки:
   БИБЛИОТЕКА Сеть    
Автор статьи: Mr.Nobody
Дата: 02.02.2008

Пример настройки vpn-подключения в Linux

ключевые слова для поиска: vpn, клиент, подключение, Linux, Fedora Core 6, провайдер, Corbina

1. Введение.
Эта статья написана для того, чтобы рассказать о способе настройки vpn-подключения в
Linux (Fedora Core 6). В ней объясняются наиболее важные для подключения действия (на
примере подключения к провайдеру Corbina).

2. Основная часть.
Пример, приведённый в статье, является простым, но в то же время работоспособным
(используется самим автором для домашнего vpn-подключения). Простота примера
облегчает его перенос и подгонку к разным дистрибутивам Linux и разным провайдерам.

Данный пример предназначен в основном для использования на рабочих станциях и в меньшей
степени на серверах т.к. в нём не уделено внимание проверке надёжности/работоспособности vpn-подключения. Степень детализации описания достаточна (на взгляд автора) для начального понимания, тонкая настройка под конкретные/личные нужды оставляется на доработку читателей.

Для успешного подключения вам нужно:
1) установить в системе следующие пакеты (если они ещё не установлены): ppp (или pppd) и pptp;
2) наличие поддержки в ядре: как правило, в ядрах, поставляемых с дистрибутивом, она уже есть;
3) информация от провайдера: логин, пароль, маршруты (которые, надо сказать, могут
поменяться в любой момент времени).

Итак, настраиваем. Сначала ppp.
Файл /etc/chap-secrets:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
# profile: corbina

your_login_name corbina your_password *

Файл /etc/ppp/peers/kvpnc.corbina:
#
# profile: corbina
# (for vpn connection)
#

# domain and username, used to select lines in secrets files
name your_login_name

# name of tunnel, used to select lines in secrets files
remotename corbina

# name of tunnel, passed to ip-up scripts
ipparam kvpnc.corbina

# send logs to stderr (fd = 2)
logfd 2

# name of tunnel, used to name /var/run pid file
linkname kvpnc.corbina

# pppd will detach from terminal when successful connection is established
updetach

# add default route on success and remove on disconnect
defaultroute

#
# no additional file with options - they are all here...
#

# lock the device
lock

# we do not require the peer to authenticate itself
noauth

# refuse to authenticate itself to the peer using EAP, CHAP, MSCHAP
# we only accept MSCHAP-V2
refuse-eap
refuse-chap
refuse-mschap

# Dont use BSD compression
nobsdcomp

# Dont use deflate method
nodeflate

# use MPPE encryption

# require the use of MPPE, with 128-bit encryption
#require-mppe-128
#mppe required,stateless

# use MPPE encryption
#require-mppe
#nomppe-stateful
# require the use of MPPE, with 128-bit encryption
#require-mppe-128

# userdefined MTU
mtu 1500

# userdefined MRU
mru 1000

Обратите внимание на наличие defaultroute. это важно. Если у вас выделенная линия (что
скорее всего) и скорость достаточно высокая, то сжатие лучше выключить (опция
nobsdcomp).

Далее добавляем системную службу (service) - создаём файл /etc/rc.d/init.d/vpn:
#!/bin/sh
#
# vpn          Start vpn service
#
# chkconfig:   345 98 01
# description: vpn - start/stop vpn tunnel via pptp protocol \
#              for connection to ISP provider
#

# Source function library.
. /etc/rc.d/init.d/functions

# Get network config
. /etc/sysconfig/network

# Settings
PROTOCOL_PPTP=/usr/sbin/pptp

FILE_LOCK=/var/lock/subsys/vpn
FILE_LOG=/var/log/vpn.log
FILE_PPPD_OPTIONS=kvpnc.corbina

RETVAL=0;
PROG="vpn"

if [ ! -e /usr/sbin/pptp ]; then
    echo "$PROG: global error - file needed for vpn service not found";
    exit 1;
fi

start(){
    echo -n "Starting $PROG: ";
    if [ -e $FILE_LOCK ]; then
        if [ -e /var/run/ppp0.pid ] && [ -e /proc/`cat /var/run/ppp0.pid` ]; then
            failure $"cannot start vpn: vpn is already running"
            echo;
            return 1;
        fi
    fi
    # checking on ethX presence (which must be active)
    if ! ifconfig | grep 'eth[0-9]' &> /dev/null
    then
        failure $"$PROG: error - ethX interface needed for vpn service not found";
        echo;
        return 2;
    fi
    # force add default route, net routes and hosts routes
    /etc/rc.d/rc.routes >/dev/null 2>&1
    # checking on pppX presence
    if ifconfig -a | grep 'ppp[0-9]' &> /dev/null
    then
        failure $"$PROG: error - pppX interface already exist, firstly shutdown it";
        echo;
        return 3;
    fi
    #Connect to ISP
    route del default dev eth0
    vpn_list=`host vpn.corbina.ru | sort -r | awk '{print $NF}'`;
    for vpn in $vpn_list; do
        /usr/sbin/pppd pty "pptp $vpn --nolaunchpppd --loglevel 0 --nobuffer" call $FILE_PPPD_OPTIONS logfile $FILE_LOG;
        sleep 1;
        if [ -f /var/run/ppp0.pid ]; then
            RETVAL=0;
            break;
        else
            RETVAL=4;
        fi
    done
#    echo;
    if [ $RETVAL -eq 0 ]; then
        touch $FILE_LOCK;
        success $"vpn started";
    else
        failure $"vpn cannot be started";
    fi
    echo;
    return $RETVAL;
}

stop(){
    echo -n $"Shutting down $PROG: "
    # checking on ethX presence
    if ifconfig -a | grep 'eth[0-9]' &> /dev/null
    then
        # force add default route, net routes and hosts routes
        /etc/rc.d/rc.routes >/dev/null 2>&1
    fi
    if [ ! -e $FILE_LOCK ]; then
        failure $"cannot stop vpn: vpn is not running"
        echo;
        return 1;
    fi
    killproc pppd
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f $FILE_LOCK;
    return $RETVAL
}

# See how we were called.
case "$1" in
  start)
        start;
        ;;
  stop)
        stop;
        ;;
  status)
        status -p /var/run/ppp0.pid $PROG;
        RETVAL=$?;
        ;;
  restart|reload)
        $0 stop;
        $0 start;
        RETVAL=$?
        ;;
  *)
        echo "Usage: $PROG {start|stop|status|restart}"
        exit 0
esac

exit $RETVAL

Обратите внимание на опцию, с которой запускается pppd ("--nobuffer"), её следует
использовать в тех же случаях что и nobsdcomp (т.е. на средне- и высокоскоростных линиях).

Скрипт /etc/rc.d/rc.routes устанавливает маршруты к ресурсам провайдера - для каждого
провайдера это индивидуально и в общем случае эта установка может отсутствовать, в этом
случае просто закомментируйте строку
/etc/rc.d/rc.routes >/dev/null 2>&1
в файле /etc/rc.d/init.d/vpn, поставив в начале строки знак "#".

У провайдера Corbina это делается для того, чтобы сетевой трафик, идущий к ресурсам
провайдера, проходил через локальную сеть, а не через Internet - это позволяет
сэкономить денежные средств в случае, когда оплата идёт в зависимости от объёма
переданных данных в Internet и при этом скорость передачи как правило значительно выше.
Если вы не знаете, нужна ли вам установка дополнительных маршрутов, то вы можете для
начала закомментировать или убрать строку, отвечающую за их установку - доступ к Internet
должен появиться и без них. Далее вы можете узнать в службе технической поддержки или
на сайте провайдера о необходимости задания дополнительных маршрутов для доступа к
ресурсам вашего провайдера.

Файл /etc/rc.d/rc.routes для провайдера Corbina на 03.12.2007 выглядит так:
#!/bin/sh
#
# Corbina network resources
#

# gateway
route add default gw 10.197.72.1

# windows - net
route add -net 10.0.0.0 netmask 255.0.0.0 gw 10.197.72.1
route add -net 85.21.79.0 netmask 255.255.255.0 gw 10.197.72.1
route add -net 85.21.90.0 netmask 255.255.255.0 gw 10.197.72.1
route add -net 83.102.146.96 netmask 255.255.255.224 gw 10.197.72.1

# windows - host
route add -net 85.21.52.254 netmask 255.255.255.255 gw 10.197.72.1
route add -net 85.21.88.130 netmask 255.255.255.255 gw 10.197.72.1
route add -net 85.21.138.208 netmask 255.255.255.240 gw 10.197.72.1
route add -net 89.179.135.67 netmask 255.255.255.255 gw 10.197.72.1
route add -net 195.14.50.16 netmask 255.255.255.255 gw 10.197.72.1
route add -net 195.14.50.26 netmask 255.255.255.255 gw 10.197.72.1
route add -net 195.14.50.93 netmask 255.255.255.255 gw 10.197.72.1

# unknown net
route add -net 83.102.231.32 netmask 255.255.255.240 gw 10.197.72.1
route add -net 85.21.108.16 netmask 255.255.255.240 gw 10.197.72.1

# unknown host
route add -net 83.102.255.131 netmask 255.255.255.255 gw 10.197.72.1
route add -net 83.102.255.130 netmask 255.255.255.255 gw 10.197.72.1
route add -net 85.21.29.242 netmask 255.255.255.255 gw 10.197.72.1
route add -net 85.21.138.210 netmask 255.255.255.255 gw 10.197.72.1
route add -net 85.21.138.214 netmask 255.255.255.255 gw 10.197.72.1

# other hosts
route add -net 62.205.179.146 netmask 255.255.255.255 gw 10.197.72.1
route add -net 83.102.146.102 netmask 255.255.255.255 gw 10.197.72.1
route add -net 83.102.232.1 netmask 255.255.255.255 gw 10.197.72.1
route add -net 85.21.52.94 netmask 255.255.255.255 gw 10.197.72.1
route add -net 85.21.90.25 netmask 255.255.255.255 gw 10.197.72.1
route add -net 213.234.192.7 netmask 255.255.255.255 gw 10.197.72.1

for vpn in `host vpn.corbina.net | sort -r | awk '{ print $NF }'`; do route add -host $vpn gw 10.197.72.1; done

Обратите внимание на то, что 10.197.72.1 является адресом маршрутизатора по умолчанию
(default gateway), у другого провайдера он будет другим.
Отмечу, что маршруты берутся из:
1) официальных источников (например, у провайдера на сайте или форумах);
2) из других ОС (например в Windows XP их можно увидеть командой "route PRINT");
3) на основании здравого смысла и опытным путём: если вдруг какой-то ресурс становится
недоступным, то очень возможно, что провайдер что-то изменил в сети. В этом случае
попробуйте определить ip-адрес:
nslookup 

Если IP-адрес определяется, то просто добавьте его в /etc/rc.d/rc.routes, если нет, то
теребите провайдера... Фантомные адреса и маршруты удалять, imho, не следует - пусть
будут на всякий случай.

Регистрируем службу vpn-клиента в системе такой командой (в консоли от рута):
chkconfig --add vpn

Теперь службу можно запустить следующей командой (в консоли):
service vpn start

Можно также сделать что он будет запускаться автоматически (man chkconfig).

Если у ваша система получает IP-адрес динамически (что скорее всего), посредством dhcp,
то можно создать создать файл /etc/dhclient.conf для автоматического получения максимума
возможной информации от dhcp-сервера. Для этого потребуется создать/изменить файл
/etc/dhclient.conf чтобы он выглядел примерно так:
request subnet-mask, broadcast-address, static-routes, routers, domain-name-servers, \
extensions-path, resource-location-servers, router-discovery, router-solicitation-address, \
www-server, interface-mtu;


3. Список использованных источников.
1) man pppd
2) man pptp
3) man chkconfig
4) man dhclient.conf

4. Автор.
Mr.Nobody, с мной можно связаться можно через Личную порту Linux Портала (это требует регистрации).



Все статьи раздела "Сеть"
©"Linuxportal.Ru". Материалы сайта можно использовать свободно при условии сохранения этой свободы при дальнейшем распространении, если явно не указано иное.
Дизайн и программирование:

Поставьте
нашу кнопку:
Получить код кнопки
Linux Portal.ru ::: Линукс Портал.ру
Наш партнер: