VPN - Linux (CentOS)

Материал из wiki.sipnet.ru
Перейти к: навигация, поиск

Конфигурация VPN доступа к сети SIPNET в Linux (CentOS)

SIPNET VPN поддерживает протоколы SoftEther, OpenVPN, L2TP/IPSec и MS-SSTP.

Авторизация осуществляется по имени пользователя и паролю SIPNET.

Метод SoftEther VPN Client

Достоинства:

  • передача данных через порт 443/tcp
  • шифрование TLS
  • возможна работа через HTTPS Proxy
  • режим UDP Acceleration
  • максимальная совместимость с VPN сервером
  • высокая скорость
  • минимальное потребление ресурсов

Недостатки:

  • отсутствие стандартного установочного пакета

Для работы клиента SoftEther VPN требуется наличие в системе универсального TAP/TUN устройства. Если устройство не обнаружено, необходима пересборка ядра, что выходит за рамки данного руководства.

    % ls /dev/net/tun

VPN клиент поставляется в бинарном виде, но нуждается в привязке к имеющимся системным библиотекам. Для этого требуются make(1) и gcc(1). В подавляющем большинстве Linux-систем эти пакеты уже присутствуют.

    % make --version
    % gcc --version

В худшем случае их установка не будет лишней (root)

    # yum install make
    # yum install gcc

Загрузить подходящую версию VPN клиента и распаковать дистрибутив.

    % tar xzf softether-vpnclient-*

Перейти в директорию vpnclient, выполнить make(1) и ответить на вопросы.

    % cd vpnclient
    % make

Создать рабочую системную директорию и скопировать необходимые файлы (root)

    # mkdir /usr/local/vpnclient
    # install vpnclient vpncmd hamcore.se2 /usr/local/vpnclient

Запустить VPN клиента (root)

    # /usr/local/vpnclient/vpnclient start

Подключиться к VPN клиенту и произвести начальную конфигурацию.
Директива NicCreate создаёт сетевой адаптер vpn_spnt.
Директива AccountCreate требует ввода имени пользователя в формате username@sipnet.ru.
Директива AccountPasswordSet требует ввода пароля; зашифрованный пароль хранится в конфигурации VPN клиента.

    % /usr/local/vpnclient/vpncmd localhost /CLIENT
    VPN Client>NicCreate spnt
    VPN Client>AccountCreate sipnet /SERVER:vpn.sipnet.ru:443 /HUB:CommuniGate /NICNAME:spnt
    VPN Client>AccountPasswordSet sipnet /TYPE:radius
    VPN Client>AccountStartupSet sipnet
    VPN Client>exit

Создать конфигурацию для сетевого адаптера vpn_spnt (root)

    # cat >> /etc/sysconfig/network-scripts/ifcfg-vpn_spnt
    DEVICE="vpn_spnt"
    BOOTPROTO="dhcp"

Создать файл автозагрузки (root)

    # cat > /etc/rc.d/init.d/vpnclient
    #!/bin/sh
    #
    # chkconfig: - 99 01
    # description: Start SoftEther VPN Client
    ### BEGIN INIT INFO
    # Provides:          vpnclient
    # Required-Start:    $network
    # Required-Stop:
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: VPN Client init
    # Description:       Start SoftEther VPN Client
    ### END INIT INFO
    case "$1" in
      start)
        echo "Starting VPN Client"
        /usr/local/vpnclient/vpnclient start
        ;;
      stop)
        echo "Stopping VPN Client"
        /usr/local/vpnclient/vpnclient stop
        ;;
      *)  
        echo "Usage: /etc/rc.d/init.d/vpnclient {start|stop}" >&2
        exit 1
        ;;
    esac

Разрешить исполнение (root)

    # chmod +x /etc/rc.d/init.d/vpnclient

Разрешить автозагрузку (root)

    # chkconfig vpnclient on

Проверить конфигурацию

    # service vpnclient start
    Starting VPN Client
    The SoftEther VPN Client service has been started.

    % ip addr show vpn_spnt
    4: vpn_spnt:  mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 500
        link/ether 00:ac:65:12:ce:59 brd ff:ff:ff:ff:ff:ff
        inet 172.16.82.32/18 brd 172.16.127.255 scope global vpn_spnt
        inet6 fe80::2ac:65ff:fe12:ce59/64 scope link
           valid_lft forever preferred_lft forever

    % ip route
    212.53.40.0/25 via 172.16.82.1 dev vpn_spnt  proto static
    192.168.33.0/24 dev eth0  proto kernel  scope link  src 192.168.33.46
    172.16.64.0/18 dev vpn_spnt  proto kernel  scope link  src 172.16.82.32
    169.254.0.0/16 dev eth0  scope link  metric 1002
    169.254.0.0/16 dev vpn_spnt  scope link  metric 1004
    default via 192.168.33.1 dev eth0

Метод OpenVPN

Достоинства:

  • стандартный установочный пакет
  • шифрование TLS


Недостатки:

  • сервер реализует протокол OpenVPN в режиме эмуляции
  • значительное потребление ресурсов


Установить стандартный пакет (root)

    # yum install openvpn

Указать данные для авторизации - свои SIP ID и пароль (root)

    # cat > /etc/openvpn/sipnet.credentials
    your_name@sipnet.ru
    your_password

Ограничить доступ к файлу (root)

    # chmod 600 /etc/openvpn/sipnet.credentials

Создать конфигурацию соединения (root)

# cat > /etc/openvpn/sipnet.conf
dev tun
proto udp
remote vpn.sipnet.ru 1194
remote-cert-tls server
cipher AES-128-CBC
auth SHA1
resolv-retry infinite
nobind
persist-key
persist-tun
client
verb 3
auth-user-pass /etc/openvpn/sipnet.credentials
auth-nocache
<ca>
-----BEGIN CERTIFICATE-----
MIIEiTCCA3GgAwIBAgIQAlqK7xlvfg1sIQSyGuZwKzANBgkqhkiG9w0BAQsFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0xNzExMDYxMjIzNTJaFw0yNzExMDYxMjIzNTJaMFwxCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xGzAZBgNVBAMTElRoYXd0ZSBSU0EgQ0EgMjAxODCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAMoIXuVTipccHkMvtoqnVumLhEOorJ16VYJ6FEuGty+P
Up8cyrEgW2+6It2mnC142ukGCE6+E6bry7s+uQUMPkrh8DIfE071BsVHc4k+gKOL
8QEkm6OZZpJraK0NLbTNcqL0+ThaZaa0jFPBCBqE+P0u8xF1btxqMSmsDYfMk2B4
3yW6JlmRxoNSNabKnLgoGs7XHO4Uv3ZcZas4HnnpfMxJIyaiUlBm0Flh/6D+mkwM
n/nojt4Ji7gVwaQITCacewbb/Yp0W1h+zWOkkS9F8Ho8lAuKfLIFqWeTn2jllWNg
2FiVX+BV75OnETt85pLYZkTgq72nj82khXhBJFTn2AMCAwEAAaOCAUAwggE8MB0G
A1UdDgQWBBSjyF5lVOUweMEF6gcKalnMuf7eWjAfBgNVHSMEGDAWgBQD3lA1VtFM
u2bwo+IbG8OXsj3RVTAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUH
AwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8CAQAwNAYIKwYBBQUHAQEEKDAm
MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQgYDVR0fBDsw
OTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFs
Um9vdENBLmNybDA9BgNVHSAENjA0MDIGBFUdIAAwKjAoBggrBgEFBQcCARYcaHR0
cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzANBgkqhkiG9w0BAQsFAAOCAQEARE2F
5d0cgozhZNWokCLfdhhl6mXSOyU3SoPamYcWfLH1CzMwD8a1+pFvwHIQfvlwXFH8
MrjB3C+jVobNbVWRrgqS3Jsa0ltRH/Ffs6ZTgP4WJYm1SNpUbgR7LWUD2F+PTvKB
M/gf9eSyqP4OiJslYaa38NU1aVAxZI15o+4xX4RZMqKXIIBTG2V+oPBjQ1oPmHGA
C/yWt2eThvb8/re7OpSpUdJyfGf97XeM4PiJAl6+4HQXhjwN7ZPZKrQv9Ay33Mgm
YLVQA+x9HONZXx9vvy8pl9bu+NVYWKGxzGxBK0CBozmVUCeXQPJKPTZleYuNM18p
U1P8Xh1CDguM+ZEoew==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
-----END CERTIFICATE-----
</ca>

Если в папке /etc/ssl/certs/ установлены корневые сертификаты, то вместо указания корневого сертификата 'in-line' (<ca>...</ca>), можно просто сослаться на системные сертификаты:

capath /etc/ssl/certs/

В указанной папке программе OpenVPN нужен не bundle (ca-bundle.crt), а индивидуальные корневые сертификаты (CA), имеющие имена вида <hash>.<n>.


Разрешить автозагрузку (root)

    # chkconfig openvpn on

Проверить конфигурацию

    # service openvpn start
    Starting openvpn:                                          [  OK  ]

    % ip addr show tun0
    5: tun0:  mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
        link/[65534] 
        inet 172.16.82.13 peer 172.16.82.14/32 scope global tun0

    % ip route
    172.16.82.14 dev tun0  proto kernel  scope link  src 172.16.82.13 
    212.53.40.0/25 via 172.16.82.14 dev tun0 
    192.168.33.0/24 dev eth0  proto kernel  scope link  src 192.168.33.46 
    169.254.0.0/16 dev eth0  scope link  metric 1002 
    default via 192.168.33.1 dev eth0 

    % /etc/centos-release 
    CentOS release 6.5 (Final)

    % uname -a
    Linux centos65.localdomain 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

Пример использования SoftEther VPN с устаревшей версией dhclient(8)

    % cat /etc/redhat-release 
    CentOS release 5.5 (Final)

    % /sbin/dhclient --version
    isc-dhclient-V3.0.5-RedHat

Если версия dhclient(8) <=3, для получения статических маршрутов (RFC 3442) необходимо создать дополнительные файлы (root)

    # cat > /etc/dhclient-vpn_spnt.conf
    option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;
    request subnet-mask, broadcast-address, routers, rfc3442-classless-static-routes;
    # cat > /etc/dhclient-exit-hooks
    #!/bin/sh
    RUN="yes"
    if [ "$RUN" = "yes" ]; then
        if [ x"$new_rfc3442_classless_static_routes" != x"" ]; then
            if [ x"$reason" == x"BOUND" -o x"$reason" == x"REBOOT" ]; then
                rfc_routes=($new_rfc3442_classless_static_routes)
                for(( i=0; i < ${#rfc_routes[@]}; )); do
                    net_length=${rfc_routes[$i]}
                    ((i++))
                    net_address=(0 0 0 0)
                    for(( j=0; j < $[$net_length / 8 + ($net_length % 8 ? 1 : 0)]; j++, i++)); do
                        net_address[$j]=${rfc_routes[$i]}
                    done
                    gateway=(0 0 0 0)
                    for (( j=0; j < 4; j++, i++ )); do
                        gateway[$j]=${rfc_routes[$i]}
                    done
                    old_IFS="$IFS"
                    IFS='.'
                    if [ -f /sbin/ip ]; then
                        echo "/sbin/ip route replace ${net_address[*]}/$net_length" via "${gateway[*]}" | logger -t dhclient
                        /sbin/ip route replace "${net_address[*]}/$net_length" via "${gateway[*]}"
                    elif [ -f /sbin/route ]; then
                        if [ x"$net_length" == x"32" ]; then
                            /sbin/route add -host "${net_address[*]}" gw "${gateway[*]}"                
                        else
                            /sbin/route add -net "${net_address[*]}/$net_length" gw "${gateway[*]}"
                        fi
                    fi
                    IFS="$old_IFS"
                done
            fi
        fi
    fi