Поиск по сайту:

L2TP через IPsec с использованием OpenSwan с аутентификацией Freeradius в Ubuntu 16.04


На этой странице

  1. Установка необходимых пакетов
    1. Установка клиента Freeradius
    2. Установка OpenSwan

    1. Настройка клиента Freeradius
    2. Конфигурация xl2tp
    3. Конфигурация OpenSwan
    4. Статус L2TP VPN

    Эта статья посвящена протоколу туннелирования уровня 2 (L2TP) с IPsec для обеспечения сквозного шифрования в VPN уровня 2, поскольку в L2TP недоступны функции безопасности. Реализациями IPsec с открытым исходным кодом являются StrongSwan и OpenSwan, обе поддерживаются во всех дистрибутивах Linux. В этом руководстве OpenSwan используется для обеспечения канала безопасности для L2TP VPN. Freeradius — это известный инструмент с открытым исходным кодом, который предоставляет пользователям различные типы аутентификации. Freeradius используется для аутентификации пользователя L2TP VPN перед установкой безопасного канала. Клиент на базе Android будет использоваться для безопасного туннеля на основе L2TP.

    Установка необходимых пакетов

    Следующие важные пакеты будут установлены на Ubuntu 16.04 LTS.

    • Сервер/Клиент Freeradius
    • Всплывающий сервер
    • xl2tpd
    • Openswan для IPsec
    • Сервер/клиент MySQL
    • Бизон и Флекс
    • Библиотека разработки GMP

    Как показано ниже, большинство необходимых пакетов доступны в репозитории Ubuntu 16.04 LTS.

    apt-get update
    apt-get install -y mysql-server mysql-client freeradius-mysql pptpd xl2tpd

    На следующем снимке экрана показано, как в процессе установки устанавливается пароль для пользователя root сервера базы данных MySQL.

    Следующие пакеты необходимы для установки OpenSwan из исходного кода на платформе Ubuntu 16.04.

    apt-get install -y build-essential libgmp3-dev bison flex

    Клиент Freeradius и пакеты OpenSwan недоступны в репозитории, поэтому оба инструмента были установлены из исходников.

    Установка клиента Freeradius

    Загрузите последнюю версию клиента Freeradius по следующей ссылке:

    wget https://github.com/FreeRADIUS/freeradius-client/archive/master.zip
    unzip master.zip
    mv freeradius-client-master freeradius-client
    cd freeradius-client

    Сначала запустите скрипт configure с ключом префикса и установите программное обеспечение с помощью команды make.

    ./configure --prefix=/
    make && make install

    Установка OpenSwan

    Исходный код инструмента OpenSwan IPsec доступен по следующей ссылке. Скачайте архив и распакуйте его.

    wget https://download.openswan.org/openswan/openswan-latest.tar.gz
    tar -xzf openswan-latest.tar.gz
    cd openswan-*

    Выполните следующую команду, чтобы скомпилировать и установить OpenSwan.

    make programs
    make install  

    Конфигурация

    Прежде чем мы начнем с настройки установленных пакетов, на платформе Ubuntu необходимы следующие базовые конфигурации (iptables и sysctl).

    Введите следующие правила iptables для обеих сетей (10.20.30.0/24 и 10.10.10.0/24) на терминале.

    iptables -t nat -I POSTROUTING -s 10.20.30.0/24 -j SNAT --to 192.168.15.4
    iptables -t nat -I POSTROUTING -s 10.10.10.0/24 -j SNAT --to 192.168.15.4

    Приведенные выше правила следует сохранить в файле /etc/iptables.rc, чтобы они применялись во время загрузки.

    chmod +x /etc/iptables.rc
    sed -i "/iptables.rc/d" /etc/rc.local
    sed -i "1a/etc/iptables.rc" /etc/rc.local

    Добавьте следующие строки в файл /etc/sysctl.conf, чтобы включить переадресацию на компьютере с Linux.

    net.ipv4.ip_forward = 1
    net.ipv4.conf.default.rp_filter = 0
    net.ipv4.conf.default.accept_source_route = 0
    net.ipv4.conf.all.send_redirects = 0
    net.ipv4.conf.default.send_redirects = 0
    net.ipv4.icmp_ignore_bogus_error_responses = 1

    Выполните следующую команду, чтобы применить изменения.

    sysctl -p

    Выполните следующую команду, чтобы изменить пароль для freeradius.

    sed -i "s/PASSWORD('radpass')/PASSWORD('test')/g" /etc/freeradius/sql/mysql/admin.sql

    Следующие команды MySQL настроят сервер Freeradius в Ubuntu.

    mysql --protocol=tcp -h localhost -u root -ptest
    create database radius  # create DB radius

    mysql --protocol=tcp -h localhost -u root -ptest radius < /etc/freeradius/sql/mysql/admin.sql

    mysql --protocol=tcp -h localhost -u root -ptest radius < /etc/freeradius/sql/mysql/cui.sql

    Добавление правильной даты для исправления проблемы с недопустимым значением по умолчанию в файле /etc/freeradius/sql/mysql/cui.sql.

    После исправления в файле /etc/freeradius/sql/mysql/cui.sql и повторного запуска вышеуказанной команды, чтобы исправить указанную выше ошибку.

    mysql --protocol=tcp -h localhost -u root -ptest radius < /etc/freeradius/sql/mysql/ippool.sql
    mysql --protocol=tcp -h localhost -u root -ptest radius < /etc/freeradius/sql/mysql/nas.sql
    mysql --protocol=tcp -h localhost -u root -ptest radius < /etc/freeradius/sql/mysql/schema.sql
    mysql --protocol=tcp -h localhost -u root -ptest radius < /etc/freeradius/sql/mysql/wimax.sql
    sed -i "s/password = \"radpass\"/password = \"test\"/g" /etc/freeradius/sql.conf

    Создание мягкой ссылки для конфигурации sql в каталоге модулей сервера Freeradius.

    ln -sf /etc/freeradius/sql.conf /etc/freeradius/modules/sql

    • /etc/freeradius/modules/hourlytraffic
    • /etc/freeradius/modules/dailytraffic
    • /etc/freeradius/modules/monthlytraffic

    /etc/freeradius/modules/hourlytraffic

    sqlcounter hourlytrafficcounter {
        counter-name = Hourly-Traffic
        check-name = Hourly-Traffic
        sqlmod-inst = sql
        key = User-Name
        reset = 1h
        query = "SELECT SUM(acctinputoctets + acctoutputoctets) DIV 1048576 FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) > '%b'"
    }

    /etc/freeradius/modules/dailytraffic


    sqlcounter dailytrafficcounter {
        counter-name = Daily-Traffic
        check-name = Daily-Traffic
        sqlmod-inst = sql
        key = User-Name
        reset = daily
        query = "SELECT SUM(acctinputoctets + acctoutputoctets) DIV 1048576 FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) > '%b'"
    }

    sqlcounter monthlytrafficcounter {
        counter-name = Monthly-Traffic
        check-name = Monthly-Traffic
        sqlmod-inst = sql
        key = User-Name
        reset = monthly
        query = "SELECT SUM(acctinputoctets + acctoutputoctets) DIV 1048576 FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAMP(AcctStartTime) > '%b'"
    }

    Следующий файл важен для настройки сервера freeradius. Наши рабочие конфигурации приведены ниже.

    /etc/freeradius/sites-enabled/default

    authorize {
        preprocess
        chap
        mschap
        digest
        suffix
        eap {
            ok = return
        }
        files
        sql
        expiration
        logintime
        pap
        hourlytrafficcounter
        dailytrafficcounter
        monthlytrafficcounter
    }
    authenticate {
        Auth-Type PAP {
            pap
        }
        Auth-Type CHAP {
            chap
        }
        Auth-Type MS-CHAP {
            mschap
        }
        digest
        unix
        eap
    }
    preacct {
        preprocess
        acct_unique
        suffix
        files
    }
    accounting {
        detail
        unix
        radutmp
        sql
        exec
        attr_filter.accounting_response
    }
    session {
        radutmp
        sql
    }
    post-auth {
        sql
        exec
        Post-Auth-Type REJECT {
            attr_filter.access_reject
        }
    }
    pre-proxy {
    }
    post-proxy {
        eap
    }

    Используйте следующую команду, чтобы перезапустить сервер freeradius и проверить конфигурацию.

    /etc/init.d/freeradius restart

    Настройка клиента Freeradius

    Следующая команда устанавливает имя хоста и секрет в файле серверов клиента freeradius.

    echo -e "localhost\ttesting123" >> /etc/radiusclient/servers

    Создайте файл конфигурации Dictionary.Microsoft для клиентов на базе Windows.

    vi /etc/radiusclient/dictionary.microsoft
    #
    #       Microsoft's VSA's, from RFC 2548
    #
    #       \$Id: poptop_ads_howto_8.htm,v 1.8 2008/10/02 08:11:48 wskwok Exp \$
    #
    VENDOR          Microsoft       311     Microsoft
    BEGIN VENDOR    Microsoft
    ATTRIBUTE       MS-CHAP-Response        1       string  Microsoft
    ATTRIBUTE       MS-CHAP-Error           2       string  Microsoft
    ATTRIBUTE       MS-CHAP-CPW-1           3       string  Microsoft
    ATTRIBUTE       MS-CHAP-CPW-2           4       string  Microsoft
    ATTRIBUTE       MS-CHAP-LM-Enc-PW       5       string  Microsoft
    ATTRIBUTE       MS-CHAP-NT-Enc-PW       6       string  Microsoft
    ATTRIBUTE       MS-MPPE-Encryption-Policy 7     string  Microsoft
    # This is referred to as both singular and plural in the RFC.
    # Plural seems to make more sense.
    ATTRIBUTE       MS-MPPE-Encryption-Type 8       string  Microsoft
    ATTRIBUTE       MS-MPPE-Encryption-Types  8     string  Microsoft
    ATTRIBUTE       MS-RAS-Vendor           9       integer Microsoft
    ATTRIBUTE       MS-CHAP-Domain          10      string  Microsoft
    ATTRIBUTE       MS-CHAP-Challenge       11      string  Microsoft
    ATTRIBUTE       MS-CHAP-MPPE-Keys       12      string  Microsoft encrypt=1
    ATTRIBUTE       MS-BAP-Usage            13      integer Microsoft
    ATTRIBUTE       MS-Link-Utilization-Threshold 14 integer        Microsoft
    ATTRIBUTE       MS-Link-Drop-Time-Limit 15      integer Microsoft
    ATTRIBUTE       MS-MPPE-Send-Key        16      string  Microsoft
    ATTRIBUTE       MS-MPPE-Recv-Key        17      string  Microsoft
    ATTRIBUTE       MS-RAS-Version          18      string  Microsoft
    ATTRIBUTE       MS-Old-ARAP-Password    19      string  Microsoft
    ATTRIBUTE       MS-New-ARAP-Password    20      string  Microsoft
    ATTRIBUTE       MS-ARAP-PW-Change-Reason 21     integer Microsoft
    ATTRIBUTE       MS-Filter               22      string  Microsoft
    ATTRIBUTE       MS-Acct-Auth-Type       23      integer Microsoft
    ATTRIBUTE       MS-Acct-EAP-Type        24      integer Microsoft
    ATTRIBUTE       MS-CHAP2-Response       25      string  Microsoft
    ATTRIBUTE       MS-CHAP2-Success        26      string  Microsoft
    ATTRIBUTE       MS-CHAP2-CPW            27      string  Microsoft
    ATTRIBUTE       MS-Primary-DNS-Server   28      ipaddr
    ATTRIBUTE       MS-Secondary-DNS-Server 29      ipaddr
    ATTRIBUTE       MS-Primary-NBNS-Server  30      ipaddr Microsoft
    ATTRIBUTE       MS-Secondary-NBNS-Server 31     ipaddr Microsoft
    #ATTRIBUTE      MS-ARAP-Challenge       33      string  Microsoft
    #
    #       Integer Translations
    #
    #       MS-BAP-Usage Values
    VALUE           MS-BAP-Usage            Not-Allowed     0
    VALUE           MS-BAP-Usage            Allowed         1
    VALUE           MS-BAP-Usage            Required        2
    #       MS-ARAP-Password-Change-Reason Values
    VALUE   MS-ARAP-PW-Change-Reason        Just-Change-Password            1
    VALUE   MS-ARAP-PW-Change-Reason        Expired-Password                2
    VALUE   MS-ARAP-PW-Change-Reason        Admin-Requires-Password-Change  3
    VALUE   MS-ARAP-PW-Change-Reason        Password-Too-Short              4
    #       MS-Acct-Auth-Type Values
    VALUE           MS-Acct-Auth-Type       PAP             1
    VALUE           MS-Acct-Auth-Type       CHAP            2
    VALUE           MS-Acct-Auth-Type       MS-CHAP-1       3
    VALUE           MS-Acct-Auth-Type       MS-CHAP-2       4
    VALUE           MS-Acct-Auth-Type       EAP             5
    #       MS-Acct-EAP-Type Values
    VALUE           MS-Acct-EAP-Type        MD5             4
    VALUE           MS-Acct-EAP-Type        OTP             5
    VALUE           MS-Acct-EAP-Type        Generic-Token-Card      6
    VALUE           MS-Acct-EAP-Type        TLS             13
    END-VENDOR Microsoft
    vi /etc/radiusclient/dictionary.merit
    #
    #       Experimental extensions, configuration only (for check-items)
    #       Names/numbers as per the MERIT extensions (if possible).
    #
    ATTRIBUTE       NAS-Identifier          32      string
    ATTRIBUTE       Proxy-State             33      string
    ATTRIBUTE       Login-LAT-Service       34      string
    ATTRIBUTE       Login-LAT-Node          35      string
    ATTRIBUTE       Login-LAT-Group         36      string
    ATTRIBUTE       Framed-AppleTalk-Link   37      integer
    ATTRIBUTE       Framed-AppleTalk-Network 38     integer
    ATTRIBUTE       Framed-AppleTalk-Zone   39      string
    ATTRIBUTE       Acct-Input-Packets      47      integer
    ATTRIBUTE       Acct-Output-Packets     48      integer
    # 8 is a MERIT extension.
    VALUE           Service-Type            Authenticate-Only       8

    Добавьте следующие строки в файл /etc/radiusclient/dictionary.

    INCLUDE /etc/radiusclient/dictionary.merit
    INCLUDE /etc/radiusclient/dictionary.microsoft
    ATTRIBUTE Hourly-Traffic 1000 integer
    ATTRIBUTE Daily-Traffic 1001 integer
    ATTRIBUTE Monthly-Traffic 1002 integer

    /etc/radiusclient/radiusclient.conf
    # General settings
    # specify which authentication comes first respectively which
    # authentication is used. possible values are: "radius" and "local".
    # if you specify "radius,local" then the RADIUS server is asked
    # first then the local one. if only one keyword is specified only
    # this server is asked.
    auth_order    radius,local
    # maximum login tries a user has
    login_tries    4
    # timeout for all login tries
    # if this time is exceeded the user is kicked out
    login_timeout    60
    # name of the nologin file which when it exists disables logins. it may
    # be extended by the ttyname which will result in
    #a terminal specific lock (e.g. /etc/nologin.ttyS2 will disable
    # logins on /dev/ttyS2)
    nologin /etc/nologin
    # name of the issue file. it's only display when no username is passed
    # on the radlogin command line
    issue    /etc/radiusclient/issue
    seqfile /var/run/freeradius/freeradius.pid

    ## RADIUS listens separated by a colon from the hostname. if
    # no port is specified /etc/services is consulted of the radius
    authserver     localhost
    # RADIUS server to use for accouting requests. All that I
    # said for authserver applies, too.
    acctserver     localhost

    # file holding shared secrets used for the communication
    # between the RADIUS client and server
    servers        /etc/radiusclient/servers
    # dictionary of allowed attributes and values just like in the normal
    # RADIUS distributions
    dictionary     /etc/radiusclient/dictionary

    # program to call for a RADIUS authenticated login
    login_radius    /sbin/login.radius
    # file which specifies mapping between ttyname and NAS-Port attribute
    mapfile        /etc/radiusclient/port-id-map
    # default authentication realm to append to all usernames if no
    # realm was explicitly specified by the user
    default_realm

    # time to wait for a reply from the RADIUS server
    radius_timeout    10
    # resend request this many times before trying the next server
    radius_retries    3
    # local address from which radius packets have to be sent
    bindaddr *
    # program to execute for local login
    # it must support the -f flag for preauthenticated login
    login_local    /bin/login

    ATTRIBUTE       NAS-Filter-Rule         92      string
    ATTRIBUTE       Originating-Line-Info   94      string
    ATTRIBUTE       NAS-IPv6-Address        95      string
    ATTRIBUTE       Framed-Interface-Id     96      string
    ATTRIBUTE       Framed-IPv6-Prefix      97      ipv6prefix
    ATTRIBUTE       Login-IPv6-Host         98      string
    ATTRIBUTE       Framed-IPv6-Route       99      string
    ATTRIBUTE       Framed-IPv6-Pool        100     string
    ATTRIBUTE       Error-Cause             101     integer
    ATTRIBUTE       EAP-Key-Name            102     string
    #
    #       RFC6911 IPv6 attributes
    #
    ATTRIBUTE       Framed-IPv6-Address     168     ipv6addr
    ATTRIBUTE       DNS-Server-IPv6-Address 169     ipv6addr
    ATTRIBUTE       Route-IPv6-Information  170     ipv6prefix

    Конфигурация сервера Poptop

    Добавьте следующую конфигурацию в файл /etc/pptpd.conf.

    localip 10.20.30.1
    remoteip 10.20.30.2-254

    Выполните следующую команду sed в файле /etc/ppp/pptpd-options.

    sed -i "/^ms-dns/d" /etc/ppp/pptpd-options
    sed -i -e "/radius.so/d" -e "/radattr.so/d" /etc/ppp/pptpd-options

    Добавьте следующие строки в файл /etc/ppp/pptpd-options.

    ms-dns 8.8.8.8
    ms-dns 8.8.4.4
    plugin /usr/lib/pppd/2.4.7/radius.so
    plugin /usr/lib/pppd/2.4.7/radattr.so

    Перезапустите службу pptpd, чтобы изменения вступили в силу.

    service pptpd restart

    Конфигурация xl2tp

    Включите следующие строки конфигурации в файл /etc/xl2tpd/xl2tpd.conf, как показано на следующем рисунке.

    [global]
    ipsec saref = yes

    [lns default]
    ip range = 10.10.10.2-10.10.10.255
    local ip = 10.10.10.1
    refuse chap = yes
    refuse pap = yes
    require authentication = yes
    ppp debug = yes
    pppoptfile = /etc/ppp/options.xl2tpd
    length bit = yes

    Конфигурация OpenSwan

    Добавьте следующий параметр файла секрета ipsec в /etc/ipsec.secrets.

    192.168.15.4 %any  0.0.0.0: PSK "test"

    Конфигурация IPsec для туннеля L2TP включена в файл /etc/ipsec.conf.

    version 2.0    

    config setup
            nat_traversal=yes
            virtual_private=%v4:192.168.0.0/16,%v4:10.0.0.0/8,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:!10.254.253.0/24
            protostack=netkey
            #protostack=mast  # used for SAref + MAST only
            interfaces="%defaultroute"
            oe=off

    conn psk-l2tp
            pfs=no
            auto=add
            rekey=no
            # overlapip=yes   # for SAref + MAST
            # sareftrack=yes  # for SAref + MAST
            type=transport
            left=192.168.15.4
            leftprotoport=17/1701
            right=%any
            rightprotoport=17/%any
            rightsubnet=vhost:%priv,%no
            authby=secret

    Конфигурация PPP-сервера

    Добавьте следующую конфигурацию в файл /etc/ppp/options.xl2tpd.

    ipcp-accept-local
    ipcp-accept-remote
    ms-dns 8.8.8.8
    ms-dns 8.8.4.4
    noccp
    auth
    crtscts
    idle 1800
    mtu 1200
    mru 1200
    nodefaultroute
    debug
    lock
    proxyarp
    connect-delay 5000
    plugin /usr/lib/pppd/2.4.7/radius.so
    plugin /usr/lib/pppd/2.4.7/radattr.so


    После успешной настройки всех необходимых пакетов перезапустите все службы, чтобы протестировать L2TP VPN.

    Перезапуск служб IPsec и xl2tp.

    На следующем рисунке показано, что сервер freeradius работает в режиме демона, что помогает определить, работает ли сервер.

    Вставьте учетную запись пользователя в базу данных MySQL, чтобы проверить конфигурацию.

    INSERT INTO radius.radcheck (username, attribute, op, value) VALUES ('username','User-Password',':=','userpassword');
    radtest username userpassword localhost 0 testing123

    Конфигурация клиента L2TP для Android

    Перейдите в настройки  ==> Дополнительно ==> VPN ==> Добавить сеть VPN на телефон Android и создайте новую L2TP PSK VPN, как показано ниже.

    После создания новой L2TP VPN нажмите на нее и введите имя пользователя/пароль (настроены на сервере freeradius).

    На следующем рисунке показано, что L2TP VPN подключается.

    Следующие экраны показывают, что L2TP VPN успешно подключен с использованием клиента Android.

    Статус L2TP VPN

    Freeradius показывает успешную аутентификацию клиента L2TP для Android.

    Следующая команда показывает состояние туннеля IPsec

    ip xfrm state

    Журнал OpenSwan (/var/log/auth.log) и журнал xl2tp (/var/log/syslog) также показывают состояние L2TP VPN.

    хвост -f /var/log/auth.log

    хвост -f /var/журнал/системный журнал

    В этом руководстве протокол туннелирования уровня 2 используется с IPSec и Freeradius для обеспечения безопасности и механизмов аутентификации. Клиент на базе Android используется для демонстрации работы L2TP через IPsec.