Интеграция VPN на базе mpd в Active Directory. (freebsd vpn win ldap radius samba)
Ключевые слова: freebsd , vpn , win , ldap , radius , samba , (найти похожие документы )
From: SpheriX <spherix@koguhovo.net. >
Newsgroups: email
Date: Mon, 26 Jul 2006 14:31:37 +0000 (UTC)
Subject: Интеграция VPN на базе mpd в Active Directory.
Я писал совет http://www.opennet.dev/tips/info/1058.shtml
Теперь делюсь конфигами.
Собственно, на истинность и пряморукость не претендую, посему мнения и
комментарии гуру будут очень важны и будут учтены в последующих
редакциях хауту, но... как начальное и _рабочее_ решение для новичков
подойдет. Возможно, коллективно сделаем полный мануал по теме.
Кто-то скажет, что я бью микроскопом по гвоздям... Возможно ;)
Напишите с конфигами как сделать лучше ;)
Дано:
- Домен на Windows2003, настроен керберос, шлюз на фряхе.
- Ядро собрано с поддержкой mppe, mppc и тунелей.
- Установлен mpd.
Надо заставить mpd авторизоваться в домене, причем используя керберос
(таково ТЗ).
Итак, начинаем.
Samba3
Собираем с поддержкой ADS и WINBIND
В smb.conf должно присутствовать следующее:
[global]
workgroup = MYNETWORK
security = ADS
password server = DC.MYNETWORK.LOCAL //AD-server
realm =MYNETWORK.LOCAL //realm
Теперь настраиваем керберос:
/etc/krb5.conf
[libdefaults]
ticket_lifetime = 24000
default_realm = MYNETWORK.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false
[realms]
PRESSEXPO.RU = {
kdc = 192.168.0.2:88 //IP доменконтроллера.
admin_server = 192.168.0.2:749
default_domain = mynetwork.local
}
[domain_realm]
.mynetwork.local = mynetwork.local
mynetwork.local = mynetwork.local
[logging]
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmin.log
default = FILE:/var/log/krb5lib.log
[pam]
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
Настраиваем загрузочные скрипты Самбы, стартуем ее.
Нам нужен работающий демон winbindd.
Загоняем в домен:
#net ads join -I 192.168.0.2 -U <учетка админа, имеющего право заводить машины в домен>
Проверяем работу.
wbinfo -p
wbinfo -g
wbinfo -u
Должны увидеть сначала, что winbindd доступен, затем список групп,
затем список пользователей.
Ставим и настраиваем freeradius.
/etc/radius.conf
auth 127.0.0.1:1812 "password-changeme" 5 4
cd /usr/local/etc/raddb
clients.conf
client 127.0.0.1 {
secret = password-changeme
shortname = 127.0.0.1
nastype = other
}
Файл clients пустой.
В файле acct_users :
DEFAULT
Service-Type == Framed-User,
Service-Type == Login-User,
Login-Service == Telnet,
Login-Service == Rlogin,
Login-Service == TCP-Clear,
Login-TCP-Port <= 65536,
Framed-IP-Address == 255.255.255.254,
Framed-IP-Netmask == 255.255.255.255,
Framed-Protocol == PPP,
Framed-Protocol == SLIP,
Framed-Compression == Van-Jacobson-TCP-IP,
Framed-MTU >= 576,
Framed-Filter-ID =* ANY,
Reply-Message =* ANY,
Proxy-State =* ANY,
Session-Timeout <= 28800,
Idle-Timeout <= 600,
Port-Limit <= 2
В файле attrs
DEFAULT
Service-Type == Framed-User,
Service-Type == Login-User,
Login-Service == Telnet,
Login-Service == Rlogin,
Login-Service == TCP-Clear,
Login-TCP-Port <= 65536,
Framed-IP-Address == 255.255.255.254,
Framed-IP-Netmask == 255.255.255.255,
Framed-Protocol == PPP,
Framed-Protocol == SLIP,
Framed-Compression == Van-Jacobson-TCP-IP,
Framed-MTU >= 576,
Framed-Filter-ID =* ANY,
Reply-Message =* ANY,
Proxy-State =* ANY,
Session-Timeout <= 28800,
Idle-Timeout <= 600,
Port-Limit <= 2
В файле dictionary
$INCLUDE /usr/local/share/freeradius/dictionary
$INCLUDE /usr/local/share/freeradius/dictionary.microsoft
В файле eap.conf
eap {
default_eap_type = md5
timer_expire = 60
ignore_unknown_eap_types = no
cisco_accounting_username_bug = no
md5 {
}
leap {
}
gtc {
auth_type = PAP
}
mschapv2 {
}
}
В файле radiusd.conf
prefix = /usr/local
exec_prefix = ${prefix}
sysconfdir = ${prefix}/etc
localstatedir = /var
sbindir = ${exec_prefix}/sbin
logdir = /var/log
raddbdir = ${sysconfdir}/raddb
radacctdir = ${logdir}/radacct
confdir = ${raddbdir}
run_dir = ${localstatedir}/run/radiusd
log_file = ${logdir}/radius.log
libdir = ${exec_prefix}/lib
pidfile = ${run_dir}/radiusd.pid
user = nobody
group = nobody
max_request_time = 30
delete_blocked_requests = no
cleanup_delay = 5
max_requests = 1024
listen {
ipaddr = 127.0.0.1
port = 0
type = auth
}
hostname_lookups = no
allow_core_dumps = no
regular_expressions = yes
extended_expressions = yes
log_stripped_names = no
log_auth = yes
log_auth_badpass = yes
log_auth_goodpass = yes
usercollide = no
lower_user = no
lower_pass = no
nospace_user = no
nospace_pass = no
checkrad = ${sbindir}/checkrad
security {
max_attributes = 200
reject_delay = 1
status_server = no
}
proxy_requests = no
#$INCLUDE ${confdir}/proxy.conf
$INCLUDE ${confdir}/clients.conf
snmp = no
#$INCLUDE ${confdir}/snmp.conf
thread pool {
start_servers = 5
max_servers = 32
min_spare_servers = 3
max_spare_servers = 10
max_requests_per_server = 0
}
modules {
pap {
encryption_scheme = crypt
}
chap {
authtype = CHAP
}
pam {
pam_auth = radiusd
}
unix {
cache = no
cache_reload = 600
radwtmp = ${logdir}/radwtmp
}
$INCLUDE ${confdir}/eap.conf
mschap {
authtype = MS-CHAP
use_mppe = yes
require_encryption = yes
require_strong = yes
with_ntdomain_hack = yes
ntlm_auth = "/usr/local/bin/ntlm_auth --request-nt-key
--username=%{Stripped-User-Name:-%{User-Name:-None}}
--challenge=%{mschap:Challenge:-00} --nt-response=%{mschap:NT-Response:-00}"
#Можно добавить --require-membership-of=MYNETWORK+VPN-Allowed
#Тогда это должно выглядеть так:
#ntlm_auth = "/usr/local/bin/ntlm_auth --request-nt-key
# -require-membership-#of=MYNETWORK+VPN-Allowed --username=%{Stripped-User-Name:-%{User-Name:-None}}
# --challenge=%{mschap:Challenge:-00} --nt-response=%{mschap:NT-Response:-00}"
#И создать группу VPN-Allowed, в которую включать пользователей,
# которые должны иметь #доступ по ВПН. В моем случае доступ извне должны
# иметь почти все сотрудники, поэтому
#--require-membership-of я не использовал.
}
preprocess {
huntgroups = ${confdir}/huntgroups
hints = ${confdir}/hints
with_ascend_hack = no
ascend_channels_per_line = 23
with_ntdomain_hack = no
with_specialix_jetstream_hack = no
with_cisco_vsa_hack = no
}
files {
usersfile = ${confdir}/users
acctusersfile = ${confdir}/acct_users
preproxy_usersfile = ${confdir}/preproxy_users
compat = no
}
detail {
detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d
detailperm = 0600
}
detail auth_log {
detailfile = ${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d
detailperm = 0600
}
detail reply_log {
detailfile = ${radacctdir}/%{Client-IP-Address}/reply-detail-%Y%m%d
detailperm = 0600
}
detail pre_proxy_log {
detailfile = ${radacctdir}/%{Client-IP-Address}/pre-proxy-detail-%Y%m%d
detailperm = 0600
}
detail post_proxy_log {
detailfile = ${radacctdir}/%{Client-IP-Address}/post-proxy-detail-%Y%m%d
detailperm = 0600
}
acct_unique {
key = "User-Name, Acct-Session-Id, NAS-IP-Address, Client-IP-Address, NAS-Port"
}
# $INCLUDE ${confdir}/sql.conf
radutmp {
filename = ${logdir}/radutmp
username = %{User-Name}
case_sensitive = yes
check_with_nas = yes
perm = 0600
callerid = "yes"
}
radutmp sradutmp {
filename = ${logdir}/sradutmp
perm = 0644
callerid = "no"
}
attr_filter {
attrsfile = ${confdir}/attrs
}
counter daily {
filename = ${raddbdir}/db.daily
key = User-Name
count-attribute = Acct-Session-Time
reset = daily
counter-name = Daily-Session-Time
check-name = Max-Daily-Session
allowed-servicetype = Framed-User
cache-size = 5000
}
always fail {
rcode = fail
}
always reject {
rcode = reject
}
always ok {
rcode = ok
simulcount = 0
mpp = no
}
expr {
}
digest {
}
exec {
wait = yes
input_pairs = request
}
ippool main_pool {
range-start = 192.168.200.160 ####В моем случае эти IP-адреса ничего
# не значат, #так как я прописывал IP клиентов в конфиге mpd
range-stop = 192.168.200.170
netmask = 255.255.255.0
cache-size = 800
session-db = ${raddbdir}/db.ippool
ip-index = ${raddbdir}/db.ipindex
override = no
maximum-timeout = 0
}
}
instantiate {
}
authorize {
preprocess
auth_log
attr_filter
mschap
eap
}
authenticate {
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
pam
eap
}
preacct {
preprocess
acct_unique
files
}
accounting {
detail
main_pool
}
session {
radutmp
}
post-auth {
main_pool
reply_log
}
pre-proxy {
}
post-proxy {
eap
}
file users
DEFAULT Auth-Type := MS-CHAP,
#User-Password == "mypwd"
Service-Type = Framed-User,
Framed-Protocol = PPP,
Framed-IP-Address = 192.168.0.161+,
Framed-IP-Netmask = 255.255.255.255,
В файле mpd.conf
default:
load pptp0
load pptp1
pptp0:
new -i ng00 pptp0 pptp0
set ipcp ranges 192.168.0.160/32 192.168.0.170/32
load pptp_standart
pptp1:
new -i ng01 pptp1 pptp1
set ipcp ranges 192.168.0.160/32 192.168.0.171/32
load pptp_standart
pptp_standart:
set iface disable on-demand
set bundle enable multilink
set link yes acfcomp protocomp
#Req chap
set link no pap chap
set link enable chap
set link keep-alive 60 180
set ipcp yes vjcomp
set ipcp dns 192.168.0.2 #IP dns
set ipcp nbns 192.168.0.2 #IP wins
set iface enable proxy-arp
set bundle enable compression
set ccp yes mppc
set ccp yes mpp-e40
set ccp yes mpp-e56
set ccp yes mpp-e128
set ccp yes mpp-stateless
set bundle yes crypt-reqd
set pptp self <ip, на котором должен висеть mpd>
set pptp enable incoming
set pptp disable originate
set iface mtu 1500
set link mtu 1500
# set iface mtu 1460
# set link mtu 1460
#Если воникают проблемы с линком с клиентом, то надо играться с mtu.
#Для начала можно #поставить 1400
#set iface up-script /usr/local/traff/up.pl
#set iface down-script /usr/local/traff/down.pl
set radius server 127.0.0.1 password-changeme 1812 1813
set radius timeout 10
set radius config /etc/radius.conf
set radius retries 3
#set bundle enable radius-acct
set bundle enable radius-auth
set ipcp yes radius-ip
Для тех, кто ни разу еще не настраивал mpd:
pptp1: #Строка в конфиге начинается без отступа.
new -i ng01 pptp1 pptp1 #В начале строки стоит знак табуляции.
set ipcp ranges 192.168.0.160/32 192.168.0.171/32 #Тоже табуляция.
Если использовать пробелы, то конфиг будет криво разбираться.
В файле mpd.links
pptp0:
set link type pptp
pptp1:
set link type pptp
mpd.secret пустой
/var/db/samba/winbindd_privileged
Проверить права радиуса на pipe. При необходимости поправить их.
Отладка:
mpd без параметров, подключаемся с виндовой машины.
Отладка Radius:
radius -A -X
Литература:
http://www.opennet.dev/base/net/freeradius_freenibs_mpd.txt.html
http://google.com
1.1 , Abigor (?? ), 05:18, 05/08/2006 [ответить ] [﹢﹢﹢ ] [ · · · ]
+ /–
Класс, буд пробывать скоро, тож надо рать юзверям удаленно войти в сеть для работы, то естя я правельно понял, login:pass из домена, и группа которой она юзать vpn. получилось похоже на squid+ad
1.2 , Taras (?? ), 08:57, 05/08/2006 [ответить ] [﹢﹢﹢ ] [ · · · ]
+ /–
Всьо класно ...
я делал аналогично !
По кабелю всьо прекрасно работает , а по радио неподходит шыфрование ... Кто знает как побороть проблему ?
1.5 , Serhii (? ), 13:37, 28/08/2006 [ответить ] [﹢﹢﹢ ] [ · · · ]
+ /–
А у меня не работает, подскажите, выдает ошибку:
Error: rlm_attr_filter: Authorize method will be deprecated.
2.7 , user345 (? ), 15:02, 06/03/2007 [^ ] [^^ ] [^^^ ] [ответить ]
+ /–
>А у меня не работает, подскажите, выдает ошибку:
>Error: rlm_attr_filter: Authorize method will be deprecated.
Тоже самое, настраивал на 6.1, так и не разобрался в чем дело.
1.6 , Mikhail (?? ), 09:02, 08/12/2006 [ответить ] [﹢﹢﹢ ] [ · · · ]
+ /–
Добавлю свои 5 копеек.
При смене контроллера домена (например, upgrade AD) приходится обходить все серверы и менять адреса kdc, admin_server, перенастраивать самбу и т.д. Чтобы такого не происходило -
1) настраиваем DNS домена (невредно в любом случае :))
2) во всех подобных местах вместо конкретного сервера (server.localdomain.ru) и/или его адреса прописываем по имени весь домен (localdomain.ru). MS DNS в ответ на запрос выдает список всех контроллеров домена (обычно они же - DNS), авторизация пройдет в любом случае.
Если вдруг домен (еще) на WinNT, не забыть прописАть в DNS сам домен (хост '.'), WinNT 4 сам такого не делал.
1.8 , Tester (?? ), 05:52, 01/07/2007 [ответить ] [﹢﹢﹢ ] [ · · · ]
+ /–
при попытке завести машину в домен выдает следующее:
utils/net_ads.c:ads_startup_int(286)
ads_connect: No logon servers
Failed to join domain: No logon servers
с чем енто может быть связано и как исправить?
1.9 , Tester (?? ), 20:00, 01/07/2007 [ответить ] [﹢﹢﹢ ] [ · · · ]
+ /–
и еще интересно, как быть если каждый пользователь должен получать выделенный ему статический, внешний IP ?
1.10 , XM (? ), 23:13, 15/07/2007 [ответить ] [﹢﹢﹢ ] [ · · · ]
+ /–
как заставить мпд брать IP адрес прописанный юзеру виз AD?
1.11 , abigor (? ), 14:11, 15/11/2007 [ответить ] [﹢﹢﹢ ] [ · · · ]
+ /–
Все это кончено хорошо, во вот
>Ставим и настраиваем freeradius.
а какие галки надо поставить при сборке?
1.12 , Князь (?? ), 05:33, 14/01/2008 [ответить ] [﹢﹢﹢ ] [ · · · ]
+ /–
Облом-с:
Module: Loaded preprocess
preprocess: huntgroups = "/usr/local/etc/raddb/huntgroups"
preprocess: hints = "/usr/local/etc/raddb/hints"
preprocess: with_ascend_hack = no
preprocess: ascend_channels_per_line = 23
preprocess: with_ntdomain_hack = no
preprocess: with_specialix_jetstream_hack = no
preprocess: with_cisco_vsa_hack = no
preprocess: with_alvarion_vsa_hack = no
rlm_preprocess: Error reading /usr/local/etc/raddb/huntgroups
radiusd.conf[93]: preprocess: Module instantiation failed.
radiusd.conf[214] Unknown module "preprocess".
radiusd.conf[213] Failed to parse authorize section.
Кто-нибудь сталкивал с такой проблемой?