L2TP через IPsec с использованием OpenSwan с аутентификацией Freeradius в Ubuntu 16.04
На этой странице
- Установка необходимых пакетов
- Установка клиента Freeradius
- Установка OpenSwan
- Настройка клиента Freeradius
- Конфигурация xl2tp
- Конфигурация OpenSwan
- Статус 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 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 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.