웹사이트 검색

Ubuntu 16.04에서 Freeradius 인증과 함께 OpenSwan을 사용하는 L2TP over IPsec


이 페이지에서

  1. 필수 패키지 설치\n
    1. Freeradius 클라이언트 설치
    2. OpenSwan 설치

    1. Freeradius 클라이언트 구성
    2. xl2tp 구성
    3. OpenSwan 구성
    4. L2TP VPN 상태

    이 문서는 L2TP에서 보안 기능을 사용할 수 없기 때문에 계층 2 VPN에서 종단 간 암호화를 제공하기 위해 IPsec을 사용하는 L2TP(계층 2 터널링 프로토콜)에 관한 것입니다. IPsec의 오픈 소스 구현은 StrongSwan 및 OpenSwan이며 둘 다 모든 Linux 배포판에서 지원됩니다. 이 자습서에서는 OpenSwan을 사용하여 L2TP VPN에 대한 보안 채널을 제공합니다. Freeradius는 사용자에게 다양한 유형의 인증을 제공하는 잘 알려진 오픈 소스 도구입니다. Freeradius는 보안 채널을 설정하기 전에 L2TP VPN 사용자를 인증하는 데 사용됩니다. L2TP 기반 보안 터널에는 Android 기반 클라이언트가 사용됩니다.

    필수 패키지 설치

    다음과 같은 중요한 패키지가 Ubuntu 16.04 LTS에 설치됩니다.

    • Freeradius 서버/클라이언트
    • 팝탑 서버
    • xl2tpd
    • IPsec용 Openswan
    • MySQL 서버/클라이언트
    • 들소 및 플렉스\n
    • GMP 개발 라이브러리

    아래와 같이 대부분의 필수 패키지는 Ubuntu 16.04 LTS 리포지토리에서 모두 사용할 수 있습니다.

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

    다음 스크린샷은 설치 프로세스 중에 MySQL 데이터베이스 서버의 "root" 사용자 암호를 설정하는 방법을 보여줍니다.

    Ubuntu 16.04 플랫폼의 소스에서 OpenSwan을 설치하려면 다음 패키지가 필요합니다.

    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

    먼저 접두사 스위치로 구성 스크립트를 실행하고 make 명령을 사용하여 소프트웨어를 설치합니다.

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

    오픈스완 설치

    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)이 필요합니다.

    터미널에서 두 네트워크(10.20.30.0/24 및 10.10.10.0/24)에 대해 다음 iptables 규칙을 입력합니다.

    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 명령은 Ubuntu에서 Freeradius 서버를 구성합니다.

    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

    Freeradius 서버의 모듈 디렉토리에 SQL 구성을 위한 소프트 링크 생성.

    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 클라이언트의 "servers" 파일에서 호스트 이름과 암호를 설정합니다.

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

    Windows 기반 클라이언트용 dictionary.microsoft 구성 파일을 만듭니다.

    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

    /etc/ppp/pptpd-options 파일에서 다음 sed 명령어를 실행합니다.

    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 구성

    /etc/ipsec.secrets에 ipsec 비밀 파일의 다음 설정을 추가합니다.

    192.168.15.4 %any  0.0.0.0: PSK "test"

    L2TP 터널에 대한 IPsec 구성은 /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 네트워크 추가로 이동하고 아래와 같이 새 L2TP PSK VPN을 만듭니다.

    새 L2TP VPN을 만든 후 클릭하고 사용자 이름/비밀번호(freeradius 서버에서 구성)를 입력합니다.

    다음 그림은 L2TP VPN이 연결 중임을 보여줍니다.

    다음 화면은 Android 클라이언트를 사용하여 L2TP VPN이 성공적으로 연결되었음을 보여줍니다.

    L2TP VPN 상태

    Freeradius는 L2TP 안드로이드 클라이언트의 성공적인 인증을 보여줍니다.

    다음 명령은 IPsec 터널 상태를 보여줍니다.

    ip xfrm state

    OpenSwan 로그(/var/log/auth.log) 및 xl2tp 로그(/var/log/syslog)도 L2TP VPN의 상태를 보여줍니다.

    꼬리 -f /var/log/auth.log

    꼬리 -f /var/log/syslog

    이 자습서에서는 레이어 2 터널링 프로토콜을 IPSec 및 Freeradius와 함께 사용하여 보안 및 인증 메커니즘을 제공합니다. Android 기반 클라이언트는 IPsec을 통한 L2TP의 작동을 시연하는 데 사용됩니다.