В этой заметке я хочу показать пример быстрой реализации корпоративного VPN сервера с поддержкой PPTP, L2TP (как с IPsec так и без), IPSec vpn с единой базой, который сможет работать с пулами адресов, разными группами пользователей, авторизировать пользователей как из LDAP, так и из локальной базы, опциональная настройка шейпирования как для групп, так и для отдельных пользователей с поддержкой windows, linux, osx, ios, android клиентов и все это на открытых решениях.
P.S. В данной заметке аспекты сетевой безопасности затронуты не будут, иначе она разрастется в огромный документ, с кучей нюансов в реализации, возможно о защите периметра и сетевой безопасности отдельно расскажу в следующий раз.
Кому интересно, добро пожаловать под кат.

Оглавление:
Введение
Подготовительные работы на сервере
Accel-PPP (PPTP, L2TP)
Strongswan (IPsec)
Freeradius
Samba 4

В результате мы планируем получить примерно такую схему:

В сети есть мобильные клиенты, офисные клиенты и защищенная сеть с важными сервисами, которая должны быть доступна только через VPN при этом офисные клиенты и мобильные клиенты должны получать от ВПН разные подсети и иметь разные права на доступы к ресурсам, что-то общее, что-то только для одних или других, также в сети присутствуют администраторы, которые должны иметь полный доступ к внутренней инфраструктуре компании как работая из офиса, так и на выезде, данная схема не охватывает внутриофисную сеть с ее серверами, доступными офисным пользователям локально, а мобильным клиентам через VPN.
Начинаем настройку сервера.

0) Подготовительные работы.



Перед тем как приступить непосредственно к настройке VPN, проведем некоторые подготовительные работы.
И так у нас есть свежеустановленный сервер с Debian 7 (не принципиально, аналогично будет работать на любом другом linux) в минимальной конфигурации. Логинимся на него по ssh или в локальной консоли, затем:
Ставим правильный часовой пояс (в примере я ставлю MSK)
mv /etc/localtime /etc/localtime_org && ln -s /usr/share/zoneinfo/"Europe/Moscow" /etc/localtime && date

Отключаем IPv6, если не планируете использовать на данном сервере
echo net.ipv6.conf.all.disable_ipv6=1 > /etc/sysctl.d/disableipv6.conf

В репы подключаем бэкпорты(чтоб не ставить древние samba и strongswan в которых есть ряд проблем), для этого добавляем в /etc/apt/sources.list следующие строки:
deb http://http.debian.net/debian wheezy-backports main contrib non-free
deb http://mirror.yandex.ru/debian/ wheezy-backports main contrib non-free

Устанавливаем минимально необходимые на данном этапе пакеты
apt-get update
apt-get install cmake make libssl-dev libpcre3-dev libnet-snmp-perl libtritonus-bin bzip2 checkinstall ntpdate

Синхронизируем время на сервере, лучше сразу с доменными часами, самый простой вариант через
ntpdate DC.DOMAIN.COM

Указываем DNS сервер домена в /etc/resolv.conf
Настройки фаирвола специфичны для компании и тут не публикую, но на основе его мы привязываем разные подсети клиентов VPN к разным запретам и разрешениям.

Тут и далее
ХХ.УУ.1.99 — внешний IP вашего сервера.

1) Accel-PPP — основной сервис для работы с L2TP и PPTP



Описание с сайта проекта
ACCEL-PPP представляет собой высокопроизводительный VPN/IPoE сервер для linux.
Его преимущество перед другими решениями является объединение различных популярных VPN технологий в единое приложение.
Существует много открытых решений для организации VPN сервисов, но все они ориентированы на какой-то один вид VPN: только PPTP, только PPPOE, только L2TP.
Если вы хотите запустить мультисервисный VPN сервер, то должны изучать и настраивать каждое приложение отдельно.
С ACCEL-PPP вы получаете одно приложение, которое поддерживает всё, с единым конфигурационным файлом, единым управлением и мониторингом.

С проектом можно ознакомиться более подробно тут.

Данный VPN очень слабо освещен, на хабре упоминаний нет, все более-менее обсуждения крутятся на одной ветке нага, хотя по удобству эксплуатации, стабильности работы и возможностям на голову обходит более популярные решения, но закончим с лирикой и приступим.

Скачиваем и кидаем на сервер.
http://downloads.sourceforge.net/project/accel-ppp/accel-ppp-1.9.0.tar.bz2

разархивируем
tar -xjf accel-ppp-1.9.0.tar.bz2
mkdir accel-ppp-build
cd accel-ppp-build

собираем
cmake -DBUILD_PPTP_DRIVER=FALSE -DLOG_PGSQL=FALSE -DNETSNMP=FALSE -DRADIUS=TRUE -DSHAPER=TRUE /root/accel-ppp-1.9.0/
make
checkinstall -D

Создаем скрипт автозапуска из примера.
cd ../accel-ppp-1.9.0/contrib/debian
cp accel-ppp-init /etc/init.d/accel-ppp

Определяем дирректорию с демоном
which accel-pppd

Скорее всего для deb будет /usr/local/sbin/accel-pppd
В стартовом файле меняем пути на полученный выше.
nano /etc/init.d/accel-ppp

Добавляем в автозапуск
insserv -v accel-ppp

Создаем дирректорию для логов
mkdir /var/log/accel-ppp/
Создаем фаил с доступами для проверки коннектов, в дальнейшем заменим его на radius авторизацию
touch /etc/ppp/chap-secrets

Формат:
login * password ip_для выдачи(если надо брать из пула, то просто *)

Создаем конфигурационный фаил /etc/accel-ppp.conf
Содержимое
*попытался максимально прокомментировать опции, во время теста раскомментируйте chap-secrets и закомментируйте radius в секции modules
[modules]
path=/usr/local/lib64/accel-ppp
#Данный модуль предназначен для записи журнала событий в файл.
log_file
#Данный модуль записывает события в syslog.
#log_syslog

#Рабочие протоколы
pptp
l2tp

#Методы аутентификации
auth_mschap_v2
auth_mschap_v1
auth_chap
auth_pap
#модуль поддержки файла CHAP-secrets конфликтует с radius
#chap-secrets
#модуль поддержки файла RADIUS конфликтует с chap-secrets
radius

#Назначение IPv4 адреса из статического пула.
ippool
sigchld
#Данный модуль запускает скрипты ip-up/ip-down при старте сессии и обработки RADIUS CoA запрос.
#pppd_compat
#Модуль управления пропускной способностью.
shaper
#Модуль управления частотой подключений.
#connlimit

[core]
log-error=/var/log/accel-ppp/core.log
thread-count=4

[ppp]
verbose=0
min-mtu=1280
mtu=1480
mru=1480
#ccp=1
check-ip=1
#    Если эта опция управления отсутствует контроль количество сессий на пользователя выключен.
#    Если эта опция replace - accel-ррр прекращает первую сессию, когда вторая выполяет подключение.
#    Если эта опция deny accel-ррр будет сбрасывать попытки авторизации второй сессии
#single-session=replace
#Задаё политику шифрования MPPE (Microsoft Point-to-Point Encryption)
# prefer – Не разрывает соединение при отрицании шифрования клиентом
mppe=prefer
ipv4=prefer
#Если эта опция задана, и больше 0, то PPP модуль будет отправлять LCP пакеты эхо-запроса каждые n секунд.
lcp-echo-interval=300
#Определяет максимальное количество эхо-запросов без ответа, по достижению значения n сессия будет сброшена.
lcp-echo-failure=6

[dns]
dns1=8.8.8.8
dns2=8.8.4.4

[auth]
#any-login=0
#noauth=0

[pptp]
bind=ХХ.УУ.1.99
echo-interval=300
echo-failure=6
verbose=0

[l2tp]
bind=ХХ.УУ.1.99
#ppp-max-mtu=1300
dictionary=/usr/local/share/accel-ppp/l2tp/dictionary
hello-interval=300
#timeout=60
#rtimeout=5
retransmit=3
host-name=vpn.mydomain.ru
#dir300_quirk=1
#secret=
verbose=0

[radius]
dictionary=/usr/local/share/accel-ppp/radius/dictionary
nas-identifier=cisco
nas-ip-address=127.0.0.1
gw-ip-address=ХХ.УУ.1.99
auth-server=127.0.0.1:1812,Radius-Sicret
acct-server=127.0.0.1:1813,Radius-Sicret
server=127.0.0.1,Radius-Sicret,auth-port=1812,acct-port=1813,req-limit=0,fail-time=0
dae-server=127.0.0.1:3799,Radius-Sicret
timeout=5
max-try=3
acct-timeout=600
acct-delay-time=1
verbose=0

[shaper]
attr=Filter-Id
#down-burst-factor=1.0
#up-burst-factor=1.0
#latency=50
#mpu=0
#time-range=1,7:00-00:59
#time-range=2,1:00-3:59
#time-range=3,4:00-6:59
#leaf-qdisc=sfq perturb 10
up-limiter=htb
down-limiter=htb
cburst=1375000
ifb=ifb0
r2q=10
quantum=1500
verbose=0

# Указывает диапазон IP-адресов, с которых клиенты могут подключиться к серверу в виде: x.x.x.x/mask (for example 10.0.0.0/8)
[client-ip-range]
#192.168.0.0/18
disable

[log]
log-file=/var/log/accel-ppp/accel-ppp.log
log-emerg=/var/log/accel-ppp/emerg.log
log-fail-file=/var/log/accel-ppp/auth-fail.log
log-debug=/var/log/accel-ppp/debug.log
#syslog=accel-pppd,daemon
#log-tcp=127.0.0.1:3000
copy=1
color=1
#per-user-dir=per_user
#per-session-dir=per_session
#per-session=1
level=0

# Раскоментировать во время теста, пока не настроен радиус
#[chap-secrets]
#gw-ip-address=ХХ.УУ.1.99
#chap-secrets=/etc/ppp/chap-secrets

[ip-pool]
attr=Framed-Pool
gw-ip-address=ХХ.УУ.1.99
10.65.16.129-254,fullaccess
10.65.17.129-254,mobila
10.65.18.129-254,office

[cli]
telnet=127.0.0.1:2000
tcp=127.0.0.1:2001
#password=123

#[connlimit]
#limit=10/min
#burst=3
#timeout=60



Запускаем
service accel-ppp start

Если что-то не так, увеличиваем в конфиге уровень логирования и смотрим логи.

Для работы под нагрузкой необходим небольшой тюнинг, если у вас менее 500 одновременных клиентов на VPN, можно не делать, кроме пункта net.ipv4.ip_forward=1, он обязателен.

Добавляем в /etc/sysctl.conf
############################
net.ipv4.ip_forward=1
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 2048
net.ipv4.neigh.default.gc_thresh3 = 4096

net.ipv4.netfilter.ip_conntrack_max=9548576
net.netfilter.nf_conntrack_max=9548576

# turn off selective ACK and timestamps
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0

# memory allocation min/pressure/max.
# read buffer, write buffer, and buffer space
net.ipv4.tcp_rmem = 10000000 10000000 10000000
net.ipv4.tcp_wmem = 10000000 10000000 10000000
net.ipv4.tcp_mem = 10000000 10000000 10000000

net.core.rmem_max = 524287
net.core.wmem_max = 524287
net.core.rmem_default = 524287
net.core.wmem_default = 524287
net.core.optmem_max = 524287
net.core.netdev_max_backlog = 300000
net.core.netdev_tstamp_prequeue = 0
############################

Применяем:
sysctl -p

Пробуем подключиться с PPTP и L2TP без IPsec с логином и паролем, указанным в /etc/ppp/chap-secrets

На самом сервере список подключенных клиентов можно посмотреть командой
accel-cmd show session

Очень рекомендую прочитать справку по accel-cmd, имеет много возможностей, включая изменение метода авторизации пользователей на лету без обрыва сессий

Если все ОК, переходим к следующему пункту

2) IPsec



Ознакомиться с тем, что это и для чего нужно можно кратко тут

устанавливаем
apt-get -t wheezy-backports install strongswan libcharon-extra-plugins

Конфиги приводим к виду:
nano /etc/ipsec.conf
ipsec.conf
# ipsec.conf - strongSwan IPsec configuration file

config setup
  # Нужно ли требовать неистекший лист отзывов для проведения аутентификации клиента
        strictcrlpolicy=no
  include /var/lib/strongswan/ipsec.conf.inc

conn %default
        ikelifetime=1440m
        keylife=60m
        rekeymargin=3m
        keyingtries=1
        keyexchange=ikev1
        authby=xauthpsk
  # включает механизм Dead Peer Detection (DPD) и указывает, что нужно забывать о клиенте, если он не отзывался дольше таймаута
  dpdaction=clear
  # задержка до включения DPD
  # dpddelay=35s
  # таймаут для DPD
  # dpdtimeout=300s
  #включение внутренней фрагментации пакетов. Позволяет использовать IPsec с провайдерами, у которых сломана IP-фрагментация пакетов
  fragmentation=yes
  # выключение инициации смены ключей со стороны сервера. Windows это не любит.
  rekey=no
  # перечень ciphersuites для использования с IKE
  ike=aes256gcm16-aes256gcm12-aes128gcm16-aes128gcm12-aesxcbc-sha256-sha1-modp4096-modp2048-modp1024,aes256-aes128-sha256-sha1-modp4096-modp2048-modp1024!
  # перечень ciphersuites для шифрования трафика
  esp=aes128gcm12-aes128gcm16-aes256gcm12-aes256gcm16-modp4096-modp2048-modp1024,aes128-aes256-sha1-sha256-modp4096-modp2048-modp1024,aes128-sha1-modp1024,aes128-sha1!

conn L2TP_Accel-PPP
        authby=psk
        rekey=no
        type=transport
        esp=aes128-sha1,null-sha1,md5
        ike=aes128-sha-modp1024,null-sha1,md5
        left=194.135.1.99
        leftprotoport=17/%any # при 1701 не пашет на iOS
        right=%any
        rightprotoport=17/%any
        rightsubnetwithin=0.0.0.0/0
        auto=add
        compress=no
        dpddelay=30
        dpdtimeout=120
        dpdaction=clear
        forceencaps=yes

conn IPsec
  authby=secret
  rekeymargin=3m
  keyingtries=1
  keyexchange=ikev1
  leftfirewall=yes
  rekey=no
  left=XX.YY.1.99
  leftsubnet=0.0.0.0/0
  leftauth=psk
  rightsourceip=%radius
  rightdns=8.8.8.8
  right=%any
  rightauth=psk
  rightauth2=xauth-radius
  dpdaction=clear
  dpdtimeout = 5s
  auto=add



Далее указываем наш приватный ключ
nano /etc/ipsec.secrets
: PSK "Sicret-Test-Key"
Для дальнейшей интеграции с Freeradius также правим
nano /etc/strongswan.d/charon/eap-radius.conf
eap-radius.conf
eap-radius {
    accounting = yes
    load = yes
    nas_identifier = StrongSwan
    #Наш секрет для Radius
    secret = Radius-Sicret
    server = 127.0.0.1
    dae {
        enable = yes
        listen = 127.0.0.1
        port = 3799
        secret = Radius-Sicret
    }
    forward {
    }
    servers {
    }
    xauth {
    }
}


Запускаем
service ipsec start

Статус можно посмотреть так:
ipsec statusall


3) FreeRadius



*для тех, кто не знает что это.
Устанавливаем стандартно
apt-get install freeradius freeradius-ldap

Правим фаил /etc/freeradius/clients.conf в нем содержатся настройки для пользователей FreeRadius, у нас такими выступают локальные демоны Accel-PPP и Strongswan, минимально достаточно следующего содержимого:
client localhost {
ipaddr = 127.0.0.1
secret = Radius-Sicret
nastype = cisco
shortname = MY_TEST_VPN
}

Теперь подготовим профиль для запуска, стандартный находится тут /etc/freeradius/sites-enabled/default
, нам необходимо привести его к виду:
/etc/freeradius/sites-enabled/default
*пока не настроена интеграция с LDAP необходимо закомментировать все опции связанные с ldap и ntlm_auth, в дальнейшем раскоментируем одну из них, но не обе сразу, они конфликтуют, если нам не нужны группы из LDAP проще использовать ntlm_auth, если группы нужны, тогда ldap, в примере рабочий конфиг уже с группами.
authorize {
	preprocess
	chap
	mschap
	ldap
#	ntlm_auth
	digest
	suffix
	eap {
		ok = return
	}
	files
	expiration
	logintime
	pap
}
authenticate {
	Auth-Type PAP {
		pap
	}
	Auth-Type CHAP {
		chap
	}
	Auth-Type MS-CHAP {
		mschap
	}
	Auth-Type LDAP {
		ldap
        }

#    	Auth-Type ntlm_auth {
#        	ntlm_auth
#    	}
	digest
	unix
	eap
}
preacct {
	preprocess
	acct_unique
	suffix
	files
}
accounting {
	detail
	unix
	radutmp
	exec
	attr_filter.accounting_response
}
session {
	radutmp
}
post-auth {
	exec
	Post-Auth-Type REJECT {
		attr_filter.access_reject
	}
}
pre-proxy {
}
post-proxy {
	eap
}


Теперь создадим фаил локальных пользователей, а также описание настроек для различных групп из LDAP
/etc/freeradius/users
#Указываем что пользователь берется из локального файла, его имя и пароль, 
# можно откртым текстом либо зашифровать через 
#perl -e 'print(crypt("testpassword","abrakadabra")."\n");'
#Тогда указываем сразу зашифрованно
#testuser Crypt-Password := "abA5hjwYqm1.I"

testuser  Cleartext-Password := "testpassword" , MS-CHAP-Use-NTLM-Auth := 0
        Service-Type = Framed-User,
        Framed-Protocol = PPP,
# Можно не указывать конкретный IP, тогда он возьмется автоматически из пула, переданного в Framed-Pool
        Framed-IP-Address = 10.65.18.12,
        Framed-IP-Netmask = 255.255.255.255,
# Пул из которого берем адреса для клиентов, описан в секции ip-pool конфига accel-ppp
        Framed-Pool = "office",
# Скорость шейпера в килобитах на пользователя.
        Filter-Id = "100000/100000",
# В ответе указываем что авторизация взята из локального файла, удобно для тестов
        Reply-Message = "Accepted from local file"
# Можно указать дополнительно любые другие параметры соединения
# такие как Idle-Timeout, Acct-Interim-Interval и т.п.

# Описываем привязку к различным группам LDAP, например привязываем доменную группу 
# remote-connection к группе office, описанной в секции ip-pool конфига accel-ppp
DEFAULT Ldap-Group == "remote-connection"
        Service-Type = Framed-User,
        Framed-Protocol = PPP,
        Framed-Pool = "office",
        Filter-Id = "100000/100000"

# Остальные группы по аналогии
DEFAULT Ldap-Group == "full-access"
        Service-Type = Framed-User,
        Framed-Protocol = PPP,
        Framed-Pool = "fullaccess"
# Админская группа уберем для нее шейпер
#        Filter-Id = "100000/100000"

DEFAULT Ldap-Group == "mobile-access"
        Service-Type = Framed-User,
        Framed-Protocol = PPP,
        Framed-Pool = "mobila",
        Filter-Id = "100000/100000"


Перезапустим радиус
service freeradius restart

*Для отладки можно запускать в режиме вывода лога на терминал freeradius -X
Если все ОК и ошибок в запуске нет, проверим тестового пользователя:
radtest testuser testpassword 127.0.0.1 0  Radius-Sicret

мы должны получить ответ вида:
Sending Access-Request of id 238 to 127.0.0.1 port 1812
	User-Name = "testuser"
	User-Password = "testpassword"
	NAS-IP-Address = XX.YY.1.99
	NAS-Port = 0
	Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=238, length=105
	Service-Type = Framed-User
	Framed-Protocol = PPP
	Framed-IP-Address = 10.65.18.12
	Framed-IP-Netmask = 255.255.255.255
	Framed-Pool = "office"
	Filter-Id = "100000/100000"
	Reply-Message = "Accepted from local file"

Если в ответе есть Access-Accept, то все хорошо и можно переходить к настройке интеграции Freeradius с LDAP, конфиги помещаю в этой секции заранее, нам надо подправить:
nano /etc/freeradius/modules/ntlm_auth
*вместо KR.LOC просто указываем свой домен
exec ntlm_auth {
	wait = yes
	program = "/usr/bin/ntlm_auth --request-nt-key --domain=KR.LOC --username=%{mschap:User-Name} --password=%{User-Password}"
}

Чуток подправим авторизацию через mschap, т.к. pap использовать не безопасно.
nano /etc/freeradius/modules/mschap
mschap {
        #Используем шифрование
	use_mppe = yes
        # Но разрешаем подключаться и без шифрования, для некоторых клиентов это важно, если таких нет - заменить на yes
	require_encryption = no
	require_strong = yes
	with_ntdomain_hack = no
	ntlm_auth = "/usr/bin/ntlm_auth --request-nt-key --username=%{%{Stripped-User-Name}:-%{%{User-Name}:-None}} --challenge=%{%{mschap:Challenge}:-00} --nt-response=%{%{mschap:NT-Response}:-00}"
}

ну и самое важное, непосредственно интеграция с LDAP
nano /etc/freeradius/modules/ldap
приводим к виду
*не забываем параметры доступа к ldap сменить на свои, пользовательская учетка должна иметь права на чтение профилей в домене.
ldap {
        server = "10.13.205.7"   #свой контроллер
        identity = "sf-test@KR.LOC"   #своя учетка
        password = "987654321"   # свой пароль
        basedn = "dc=KR,dc=LOC"   # свой домен
        filter = "(sAMAccountName=%{%{Stripped-User-Name}:-%{User-Name}})"
         ldap_connections_number = 5
        max_uses = 0
        #port = 389
        timeout = 4
        timelimit = 3
        net_timeout = 1

        tls {
                start_tls = no
        }
        dictionary_mapping = ${confdir}/ldap.attrmap
        password_attribute = userPassword
        edir_account_policy_check = no

        groupname_attribute = cn
        groupmembership_filter = "(|(&(objectClass=GroupOfNames)(member=%{control:Ldap-UserDn}))(&(objectClass=GroupOfUniqueNames)(uniquemember=%{control:Ldap-UserDn})))"
        groupmembership_attribute = memberOf

        access_attr_used_for_allow = yes

        chase_referrals = yes
        rebind = yes
        # set_auth_type = yes

        keepalive {
                idle = 60
                probes = 3
                interval = 3
        }
}


Еще один важный момент, для того чтоб получать radius атрибуты для конкретного пользователя прямо из ldap атрибутов домена необходимо настроить соответствие их между собой, это делается в файле /etc/freeradius/ldap.attrmap там многое уже заполнено и интуитивно понятно, но для примера покажу несколько своих:
replyItem	Framed-IP-Address		msRADIUSFramedIPAddress
replyItem	Framed-Pool			msRADIUSFramedRoute

Таким образом указав в домене у пользователя персональный атрибут msRADIUSFramedIPAddress мы передадим радиусу считать его атрибутом Framed-IP-Address и выдать пользователю конкретно его по VPN, для пулов по аналогии.
Со стороны домена это выглядит так:

IP необходимо преобразовать в HEX на любом IP калькуляторе, можно конечно создать и любые свои атрибуты для ldap, через редактор атрибутов, но для ускоренного описания будем использовать стандартные.

*данные опции станут доступны после настройки samba4, необходимо не забыть раскомментировать секцию ldap в /etc/freeradius/sites-enabled/default

4) SAMBA 4



*краткая справка

Для начала установим все необходимое:
apt-get install krb5-user libpam-krb5 samba winbind libnss-winbind libpam-winbind -t wheezy-backports

Настройки samba находятся в файле /etc/samba/smb.conf
smb.conf
*не забываем менять имя домена на свое.
[global]
     obey pam restrictions = Yes
     log file = /var/log/samba/log.%m
     log level = 1
     socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192

     encrypt passwords = yes

     idmap config * : range = 10000-20000
     idmap config * : backend = tdb

     auth methods = winbind
     name resolve order = hosts bcast lmhosts

     case sensitive = no
     dns proxy = no
     netbios name = SAMBA
     server string = %v samba
     password server = DC02.KR.LOC

     # обязательно указывать имя домена в верхнем регистре
     realm = KR.LOC
     client use spnego = yes
     client signing = yes
     local master = no
     domain master = no
     preferred master = no
     workgroup = KR
     debug level = 2

    # ads указывает что авторизация проходит на уровне домена
     security = ads
     unix charset = UTF-8
     dos charset = 866
     max log size = 50
     os level = 0
     follow symlinks = yes

     winbind uid = 10000-20000
     winbind gid = 10000-20000
     winbind enum groups = yes
     winbind enum users = yes


Теперь настроим winbind (позволяет Самбе узнавать пользователей AD и общаться с ними как с локальными).
Нам необходимо отредактировать фаил /etc/nsswitch.conf , добавляем в него:
passwd:         compat  winbind
group:          compat  winbind
shadow:         compat  winbind


Осталось настроить Kerberos (используется для интеграции Samba в Active Directory)
Приводим фаил /etc/krb5.conf к виду
krb5.conf
*Домен меняем на свой.
    [logging]
    default = FILE:/var/log/krb5.log
    kdc = FILE:/var/log/krb5kdc.log

    [libdefaults]
    default_realm = KR.LOC

    clockskew = 500
    dns_lookup_realm = false
    dns_lookup_kdc = true
    ticket_lifetime = 324000

    [realms]
    KR.LOC = {
    kdc = DC02.KR.LOC
    admin_server = DC02.KR.LOC
    default_domain = KR.LOC
    }

    [domain_realm]
    .kr.loc = KR.LOC

    [login]
    krb4_convert = true
    krb4_get_tickets = false



Конфиги поправлены, можно перезапустить сервисы:
service samba restart
service winbind restart

Проверяем для своего доменного пользователя:
kinit sf-test@KR.LOC

Получаем запрос на ввод пароля, вводим.
Password for sf-test@KR.LOC:

Если все ОК, вывода на экран не будет, если все-же что-то выводит, внимательно читаем и правим ошибки в конфиге.
Считаем что у вас все хорошо и вводим сервер в домен
net join –U sf-test@KR.LOC

Проверим работу winbind:
wbinfo -u
wbinfo -g

В выводе должны видеть список доменных пользователей и групп.

Что бы проверить воспринимаются ли доменные пользователи как локальные, можно воспользоваться командой:
id domain_user

Проверяем работу модуля аутентификации (логин/пароль/домен — естественно свои)
ntlm_auth --request-nt-key --domain=KR.LOC --username=sf-test --password=123456789

Получили OK, значит можно раскомментировать в конфиге радиуса модуль ldap или ntlm_auth (если не нужны доменные группы), перезапускать freeradius и наслаждаться работой VPN сервера с учетками домена, но для успокоения совести проверим что радиус авторизирует доменных пользователей:
radtest -t mschap sf-test 123456789 127.0.0.1 0  Radius-Sicret

Теперь можно создавать VPN подключение у себя и проверять всю связку.

5) Бонус


Пролистывая заметку еще раз посмотрел на схему сети и вспомнил, что у нас есть соединения site-to-site для IPsec — это так-же удобно если пользователям ВПН необходимо давать доступ в другие сети, все это реализовано фаирволом, но пример настройки strongswan для такого соединения привожу ниже.
ipsec.conf
В /etc/ipsec.conf добавляем в конец секцию:
conn juniper
        forceencaps=yes
        dpddelay=30 # Dead peer detection - 30 секунд - интервал между keep-alive пакетами
        dpdtimeout=120 # dpd таймаут 120 секунд, после которого хост будет объявлен недоступным
        # IKE alg 3DES - HASH sha1 - DH group 2 (1024)
        ike=3des-sha1-modp1024
        # IKE lifetime 86400 seconds (24 hours)
        ikelifetime=86400s
        # IKE auth method Pre-Shared Key (PSK secret)
        authby=secret
        # IPSec type tunnel
        type=tunnel # режим - туннель
        #left side (myside)
        left=ХХ.УУ.1.99 # OpenSWAN side
        leftsubnet=10.65.0.0/16 #наши локальные сети, которые мы экспортируем удаленному маршрутизатору
        right=ХХ.УУ.116.5 #Удаленный маршрутизатор
        rightsubnet=192.168.105.0/24 #Сети с удаленного маршрутизатора, которые доступны пользователям нашего VPN
        auto=start
	esp=3des-sha1,3des-md5
	keyexchange=ikev1


Заключение.


Надеюсь все получилось с первого раза и сразу заработало, если это не так — задавайте вопросы в комментариях. Автор паталогически безграмотен, если увидели ошибку, опечатку, не однозначность или любой другой момент, мешающий восприятию заметки — просьба сообщать в личку. Всем спасибо за потраченное время.

Комментарии (5)


  1. Obramko
    18.09.2015 11:59

    У accel-ppp есть пакеты под Debian.


    1. RicoX
      18.09.2015 12:37

      Есть пакет собранный для схемы IPoE, он скорее для провайдеров, чем для текущей связки, к тому же, если не ошибаюсь, он собран без поддержки shaper, в любом случае мне не нужен был IPoE и я собрал свой пакет, можно использовать готовый, если нравится, я планирую пересобрать с snmp модулем и добавить на мониторинг, готовый идет точно без него.


      1. Obramko
        20.09.2015 21:08

        Всё там есть. На sourceforge лежат пакеты со всем необходимым: sourceforge.net/projects/accel-ppp/files/debian/accel-ppp-1.9.0. Вам нужен соответствующий пакет accel-ppp-1.9.0_wheezy.
        Даже если и нет — там есть готовое решение для сборки пакета, checkinstall не нужен.
        Открыл пакет, вижу:

        • libshaper.so
        • libnet-snmp.so


        Хотя своё оно, конечно, лучше, да. /sarcasm


  1. kbool
    19.09.2015 08:47

    Почему ikev1, а не ikev2?


    1. RicoX
      19.09.2015 09:13

      Несколько клиентов на WinXP плюс древняя циска через IPsec, корпоративная среда, обновлять нельзя, если получится выкинуть их — будет вторая версия, по этой же причине mppe рекомендуемый, а не принудительный.