Ubuntu 16.04에서 Freeradius 인증과 함께 OpenSwan을 사용하는 L2TP over IPsec
이 페이지에서
- 필수 패키지 설치\n
- Freeradius 클라이언트 설치
- OpenSwan 설치
- Freeradius 클라이언트 구성
- xl2tp 구성
- OpenSwan 구성
- 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 Microsoftvi /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/loginATTRIBUTE 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 ipv6prefixPoptop 서버 구성
/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 = yesOpenSwan 구성
/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=secretPPP 서버 구성
/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의 작동을 시연하는 데 사용됩니다.