Subscribe on YouTube

Установка и настройка IPSEC L2TP VPN сервера

Руководство по настройке VPN сервера IPSEC L2TP

  • Установка осуществляется на сервер под управлением CentOS 6
  • В качестве клиентов могут выступать операционные системы поддерживающие IPsec/L2tp (Mac OS, Android, Windows, Ubuntu)
  • Используемые порты, которые следует открыть на файрволе 1701/TCP, 4500/UDP и 500/UDP

Перед началом установки немного разъяснений о том, почему я выбрал стек IPSec/L2TP и для чего нам понадобится xl2tpd и ppp.

IPSec шифрует пакеты для обеспечения шифрования и аутентификации, чтобы никто не смог расшифровать или подделать данные между клиентами и сервером.
L2TP обеспечивает туннель для передачи данных, он ни в коем случае не обеспечивает шифрование и аутентификацию.
xl2tpd используется как демон L2TP и ppp для обеспечения аутентификации соединения.

Установка Epel

yum install epel-release

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

yum install bind-utils

Теперь установим зависимые пакеты, openswan для ipsec, xl2tpd для l2tp и ppp для аутентификации.

yum install openswan xl2tpd ppp lsof

Поскольку в релизе OpenSwan из EPEL 6.8 существует баг, то нам необходимо выполнить даунгрейд пакета или установить вручную.

Скачиваем необходимые пакеты: i686, x86_64

rpm -Uvh openswan-2.6.32-16.el6.x86_64.rpm

или

rpm -Uvh openswan-2.6.32-16.el6.i686.rpm

Настройка файрвола и роутинга

iptables --table nat --append POSTROUTING --jump MASQUERADE

В sysctl.conf добавим следующие строчки

net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done
sysctl -p

Чтобы убедиться, что это продолжает работать при загрузке, добавим следующее в /etc/rc.local

for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done
iptables -t nat -A POSTROUTING -j SNAT --to-source %SERVERIP%

%SERVERIP% - IP-адрес VPN сервера.
Вышеуказанные строчки необходимо добавить до строки exit 0

Конфигурация Openswan (IPSEC)

nano /etc/ipsec.conf
version 2 # conforms to second version of ipsec.conf specification
config setup
dumpdir=/var/run/pluto/
#in what directory should things started by setup (notably the Pluto daemon) be allowed to dump core?
nat_traversal=yes
#whether to accept/offer to support NAT (NAPT, also known as "IP Masqurade") workaround for IPsec
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v6:fd00::/8,%v6:fe80::/10
#contains the networks that are allowed as subnet= for the remote client. In other words, the address ranges that may live behind a NAT router through which a client connects.
protostack=netkey
#decide which protocol stack is going to be used.
force_keepalive=yes
keep_alive=60
# Send a keep-alive packet every 60 seconds.
conn L2TP-PSK-noNAT
authby=secret
#shared secret. Use rsasig for certificates.
pfs=no
#Disable pfs
auto=add
#the ipsec tunnel should be started and routes created when the ipsec daemon itself starts.
keyingtries=3
#Only negotiate a conn. 3 times.
ikelifetime=8h
keylife=1h
ike=aes256-sha1;modp1024!
phase2alg=aes256-sha1;modp1024
# specifies the phase 1 encryption scheme, the hashing algorithm, and the diffie-hellman group. The modp1024 is for Diffie-Hellman 2. Why 'modp' instead of dh? DH2 is a 1028 bit encryption algorithm that modulo's a prime number, e.g. modp1028. See RFC 5114 for details or the wiki page on diffie hellmann, if interested.
type=transport
#because we use l2tp as tunnel protocol
left=%SERVERIP%
#fill in server IP above
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
dpddelay=10
# Dead Peer Dectection (RFC 3706) keepalives delay
dpdtimeout=20
# length of time (in seconds) we will idle without hearing either an R_U_THERE poll from our peer, or an R_U_THERE_ACK reply.
dpdaction=clear
# When a DPD enabled peer is declared dead, what action should be taken. clear means the eroute and SA with both be cleared.

Общий пароль

Общий пароль находится в файле /etc/ipsec.secrets.
Убедитесь в его надежности, также не забудьте изменить IP-адрес на свой.

%SERVERIP% %any: PSK "357xCT1h2QY8+059k2eHZdaL3eogoTM8jHyzCF2kQxr6Zn4+PGmvuEILJMW8fP63"

Проверка

Запускаем проверку

ipsec verify
Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path [OK]
Linux Openswan U2.6.32/K2.6.32-573.7.1.el6.x86_64 (netkey)
Checking for IPsec support in kernel [OK]
SAref kernel support [N/A]
NETKEY: Testing for disabled ICMP send_redirects [OK]
NETKEY detected, testing for disabled ICMP accept_redirects [OK]
Checking that pluto is running [OK]
Pluto listening for IKE on udp 500 [OK]
Pluto listening for NAT-T on udp 4500 [OK]
Two or more interfaces found, checking IP forwarding [OK]
Checking NAT and MASQUERADEing [OK]
Checking for 'ip' command [OK]
Checking /bin/sh is not /bin/dash [WARNING]
Checking for 'iptables' command [OK]
Opportunistic Encryption Support [DISABLED]

Если много ошибок - проверяем, запущен ли сервис ipsec, если нет, то запускаем

service ipsec start

Настройка xl2tpd

Открываем файл конфигурации /etc/xl2tpd/xl2tpd.conf

[global]
ipsec saref = yes
force userspace = yes
[lns default]
ip range = 10.1.2.1-10.1.2.100
local ip = %IP_ADDRESS%
refuse pap = yes
require authentication = yes
ppp debug = no
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
  • force userspace = из-за ошибки, по которой мы вынуждены были сделать даунгрейд Ipsec;
  • ip range = Диапазон IP-адресов, который будет назначен клиентам;
  • local ip = IP адрес VPN сервера;
  • refuse pap = отключаем pap-аутентификацию;
  • ppp debug = yes - когда тестируем, no в продакшн.

Локальные пользователи (PAM авторизация//etc/passwd)

Чтобы использовать локальные учетные записи пользователей для авторизации через PAM (или /etc/passwd) и, таким образом, не использовать пароли пользователя в открытом виде в текстовом файле, необходимо выполнить следующее:

В файле конфигурации /etc/xl2tpd/xl2tpd.conf добавим

unix authentication = yes

и удалим следующую строчку:

refuse pap = yes

В файле /etc/ppp/options.xl2tpdz убедимся, что отсутствует строка (ниже говорится добавить его, но если хотим использовать UNIX аторизацию, то удаляем)

require-mschap-v2

В файле /etc/ppp/options.xl2tpdдобавляем

login

Файл /etc/pam.d/ppp приводим к следующему виду:

auth required pam_nologin.so
auth required pam_unix.so
account required pam_unix.so
session required pam_unix.so

Добавляем следующее в /etc/ppp/pap-secrets

* l2tpd "" *

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

Редактируем конфигурационный файл /etc/ppp/options.xl2tpd

require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
auth
mtu 1200
mru 1000
crtscts
hide-password
modem
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4

Добавляем пользователей

Каждого нового пользователя добавляем в файл /etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client server secret IP addresses
robinzon l2tpd 5H3leJQg3Owu749uwOuwtQ *
pyatnica l2tpd 6qkZsl274bEGL8FKvOgA4X3vS0 *

Проверка

Перезапускаем сервисы и проверяем

/etc/init.d/ipsec restart
/etc/init.d/xl2tpd restart

Поделиться Комментарии