Сервер домашней сети

Дата: 28.01.2009

Рубрики: *NIX, Technology, Windows, Интернет

Не так давно я делился мыслями на тему организации разделения прав доступа пользователей к различным ресурсам маленькой локалки в масштабе типичной советской российской коммуналки. Сегодня я поделюсь готовым решением. Естественно на полноту и правильность не претендую, просто пишу о том как это сделал я. Конструктивная критика, естественно, приветствуется.

И так имеется в наличии:

  • Компьютер неизвестной марки, собранный из подручных средств на базе процессора Intel Pentium-III с полгига оперативки тремя сетевыми картами и четыремя разнокалиберными жесткими дисками.
  • Доступ в интернет в виде безлимитного ADSL от местного провайдера.
  • Несколько человек соседей, желающих заюзать на толпу интернет-канал и обмениваться файлами не таская друг к другу флэшки.
  • Человек мало-мальски знакомый с (то есть я), который будет админом создаваемой сети.

Собственно для реализации задуманного ставим на обозначенный выше компьютер FreeBSD 7.1 и начинаем шаманство.

Нам потребуется следующее ПО (все из портов):

  • Samba — поскольку у всех Windows будем использовать этот вид расшаривания ресурсов.
  • mpd версии 5.2 — VPN-сервер, будем использоваться для раздачи пользователям интернета.
  • FreeRADIUS — сервер, который будет выполнять авторизацию наших пользователей.
  • OpenLDAP — сервер каталога, в котором мы будем хранить данные о том какому пользователю какие ресурсы доступны.
  • MySQL — сервер баз данных, в котором будет храниться авторизационная информация пользователей и статистика доступа в интернет.
  • DHCP - автоматическая настройка сети на клиентских компьютерах.
  • pdnsd — кэширующий DNS-сервер.

Приступим. Сначала, естественно, подготовительные мероприятия.

Настраиваем интернет-канал ADSL-модем настраиваем бриджем, втыкаем в одну из сетевых карт, можно, в принципе, даже IP на интерфейс не вешать, и так сойдет.

Настраиваем соединение с интернет средствами ppp

vi /etc/ppp/ppp.conf
default:
 set log Phase tun command
 set ifaddr 10.0.0.1/0 10.0.0.2/0
wstream:
 disable IPV6CP
 disable acfcomp
 disable protocomp
 disable deflate
 disable pred1
 disable vjcomp
 set device PPPoE:rl0
 set authname YOUR_LOGIN
 set authkey YOUR_PASSWORD
 set dial
 set login
 add default HISADDR

Включаем поднятие соединения при старте системы.

vi /etc/rc.conf
ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="wstream"

Поднимаем соединение

/etc/rc.d/ppp start

Подключаем какой-нибудь резолвер и идем устанавливать свой DNS-сервер

echo «195.46.96.1» > /etc/resolv.conf
cd /usr/ports/dns/pdnsd
make install clean

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

vi /usr/local/etc/pdnsd.conf

Весь конфиг не привожу, только строчки, которые требуют исправления

global {
...
server_ip = 192.168.0.1
...
}
server {
label = «myisp»
ip = 195. 46.96.1
...
uptest=if
interface=tun0

Записи локальной сети прописываем обычным форматом в /etc/hosts, а в конфиг pdnsd пишем вот так

source {
owner=gw.mynet
file="/etc/hosts"
}

Можно и реверсные записи прописать вот так примерно

rr {
name=gw.mynet;
reverse=on;
a=192.168.0.1;
owner=irk-gw.intra;
soa=gw.mynet,root.gw.mynet,42,86400,900,86400,86400;
}

Прописываем в автозапуск, запускаем и устанавливаем наш локальный DNS-сервер в качестве резолвера.

echo 'pdnsd_enable="YES"' >> /etc/rc.conf
/usr/local/etc/rc.d/pdnsd start
echo «192.168.0.1» > /etc/resolv.conf

Подготовительный этап закончен. Начинаем, собственно, конфигурацию и первым делом ставим и настраиваем dhcp. Ну не руками же на каждом компе IPшники прописывать.

cd /usr/ports/net/isc-dhcp30-server
make install clean

Прописываем сеть в конфиге

subnet 192.168.0.0 netmask 255.255.255.0 {
  range 192.168.0.10 192.168.0.250;
  option netbios-name-servers 192.168.0.2;
  option domain-name-servers 192.168.0.1;
  option domain-name «mynet»;
  option routers 192.168.0.1;
  option broadcast-address 192.168.0.255;
  default-lease-time 600;
  max-lease-time 7200;
}

Прописываем в rc.conf автозапуск, говорим на каком интерфейсе слушать

dhcpd_enable="YES"
dhcpd_ifaces="rl0"

Ну и запускаем

/usr/local/etc/rc.d/isc-dhcpd start 

Теперь организуем файловый сервер на базе Samba. Samba это, к сожалению, такой сервис, который после запуска слушает на всех сетевых интерфейсах, а с какого принимать соединения определяет исходя из опций в конфиге. Учитывая эту его особенность я решил поместить файловый сервер в отдельный Jail. Для комфортного управления Jail'ами в портах FreeBSD есть тулза ezjail, это конечно не VDSmanager, но для наших целей вполне подойдет. Ставим

cd /usr/ports/sysutils/ezjail
make install clean

Вешаем на интерфейс смотрящий в локальную сеть еще один IP-адрес и создаем окружение для нашего будущего файлового сервера

ifconfig rl0 alias 192.168.0.2 netmask 255.255.255.255
ezjail-admin update -i
ezjail-admin create samba.mynet 192.168.0.2
cp /etc/resolv.conf  /jails/samba.mynet/etc/

Добавляем в /etc/rc.conf

ifconfig_rl0_alias0="192.168.0.2 netmask 255.255.255.255"
ezjail_enable="YES"

Можно запускать и приступать к настройке. Я для этого запустил в jail'е ssh, дабы комфортно внутри работать.

Ставим самбу, в меню конфигурирования отмечаем LDAP, WINBIND, собираем, ставим.

cd /usr/ports/net/samba3
make install

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

cd /usr/ports/net/nss_ldap
make install clean

Собственно к жгучему латиноамериканскому танцу мы еще вернемся, а пока настроим OpenLDAP в основной системе.

cd /usr/ports/net/openldap24-server
make install clean
vi /usr/local/etc/openldap/slapd.conf

Конфигурационный файл будет выглядеть примерно так

include         /usr/local/etc/openldap/schema/core.schema
include         /usr/local/etc/openldap/schema/cosine.schema
include         /usr/local/etc/openldap/schema/inetorgperson.schema
include         /usr/local/etc/openldap/schema/nis.schema
include         /usr/local/etc/openldap/schema/samba.schema
pidfile         /var/run/openldap/slapd.pid
argsfile        /var/run/openldap/slapd.args
logfile         /var/log/openldap/slapd.log
modulepath      /usr/local/libexec/openldap
moduleload      back_bdb
database        bdb
suffix          "dc=my,dc=network"
rootdn          "cn=Admin,dc=my,dc=network"
rootpw  {SSHA}+EM1XBj5BvZiJ3PXVK4YC/sJez1o4ufA
directory       /var/db/openldap-data
TLSCertificateFile  /usr/local/etc/openldap/ssl/ldap.cert
TLSCertificateKeyFile /usr/local/etc/openldap/ssl/ldap.key
TLSCACertificateFile  /usr/local/etc/openldap/ssl/ca.cert
index   objectClass     eq,pres
index   ou,cn,mail,surname,givenname    eq,pres,sub
index   uidNumber,gidNumber,loginShell  eq,pres
index   uid,memberUid   eq,pres,sub
index   nisMapName,nisMapEntry  eq,pres,sub
access to attrs=sambaNTPassword by self write by * none
access to attrs=sambaLMPassword by self write by * none
access to attrs=userPassword by self write by * auth

В моем случае slapd будет слушать на локальном сокете и по защищенному протоколу на IP смотрящем в локалку. Вот это {SSHA}+EM1XBj5BvZiJ3PXVK4YC/sJez1o4ufA — зашифрованный пароль администратора каталога, получается командой slappasswd.

Внесем соответствующие исправения в rc.conf.

slapd_enable="YES"
slapd_owner="ldap"
slapd_group="ldap"
slapd_flags="-h 'ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldaps://192.168.0.1/'"

Теперь надо создать начальную структуру каталога пишем файл примерно такого содержания

dn: dc=mydc=network
objectClass: dcObject
objectClass: organization
dc: my
o: My network

Импортируем его с помощью ldapadd

ldapadd -x -D cn=Admin,dc=my,dc=network -w Пароль /path/to/file

Можно запускать и настраивать в jail'е samba и nss_ldap.

Сначала nss_ldap

vi /usr/local/etc/nss_ldap.conf
base dc=my,dc=network
uri ldaps://192.168.0.1/
rootbinddn cn=Admin,dc=my,dc=network
bind_policy soft
pam_filter objectclass=uid
pam_login_attribute uid
pam_password ssha
nss_base_passwd         dc=net,dc=megaded?sub?objectClass=posixAccount
nss_base_shadow         dc=net,dc=megaded?sub?objectClass=posixAccount
nss_base_group          dc=net,dc=megaded?sub?objectClass=posixGroup

Кроме того нужно вписать пароль администратора нашего LDAP-каталога в файл nss_ldap.secret и поставить на него права 400, дабы этот пароль никто кроме root'а не прочитал и уж тем более не исправил.

Теперь самба. В smb.conf для работы с LDAP нужно добавить

passdb backend = ldapsam:ldaps://192.168.0.1/
ldap ssl = Yes
ldap suffix = dc=net,dc=megaded
ldap admin dn = cn=Admin,dc=my,dc=network
ldap delete dn = no
ldap filter = (&(uid=%u)(objectClass=sambaSamAccount))

Остальные настройки по желанию. Теперь надо прописать в rc.conf запуск сервера, запустить его и связать его с LDAP.

echo 'samba_enable="YES"' >> /etc/rc.conf
/usr/local/etc/rc.d/samba start
smbpasswd -w

Собственно все, переходим к настройке FreeRADIUS. При сборке из портов отмечаем опции LDAP и MYSQL. Установка традиционна, поэтому пропустим ее для ясности. Настраиваем.

Первым делом подключим схему из комплекта FreeRADIUS к OpenLDAP, добавив в slapd.conf вот такую строчку

include         /usr/local/etc/openldap/schema/freeradius.schema

В главном конфигурационном файле radiusd.conf нужно в секции конфигурирования модуля ldap вписать

server = «ldapi://%2fvar%2frun%2fopenldap%2fldapi»
basedn = «dc=my,dc=network»

Секцию настройки mschap, находящуюся выше ldap вырезать и вставить после него. В секции authorize активировать сначала ldap, потом sql вот так

ldap
sql

Теперь в sql.conf нужно указать данные для доступа к базе

driver = «rlm_sql_mysql»
server = «localhost»
login = «radius»
password = «SuperPass»
radius_db = «radius»

Создать базу данных.

В clients.conf написать что-то типа этого

client 127.0.0.1 {
secret = SuperPass
shortname = mpd5
}

Последний элемент в нашей конфигурации — VPN-сервер mpd его настройка сложностей из себя не представляет, поэтому позволю себе просто привести рабочий конфиг.

startup:
           set user sys Password admin
           set console self 127.0.0.1 5005
           set console open
default:
           load pptp_server
pptp_server:
           set ippool add pool1 192.168.5.1 192.168.5.31
           create bundle template B
           set iface idle 1800
           set iface enable tcpmssfix
           set ipcp yes vjcomp
           set ipcp ranges 10.10.10.1/32 ippool pool1
           set ipcp dns 192.168.0.1
           set bundle enable compression
           set ccp yes mppc
           set mppc yes e40
           set mppc yes e128
           set mppc yes stateless
           set bundle yes crypt-reqd
           create link template L pptp
           set link action bundle B
           set link enable multilink
           set link yes acfcomp protocomp
           set link no pap chap
           set link enable chap
           set link yes crypt-reqd
           set link mtu 1460
           set pptp self 192.168.0.1
           set link enable incoming
           set radius server 127.0.0.1 SuperPass 1812 1813
           set radius timeout 10
           set auth acct-update 300
           set auth enable radius-auth
           set auth enable radius-acct
           set radius retries 3

Теперь все настроено и запущено. Можно создавать группы и пользователей в LDAP, они будут видны в jail'е с установленной samba. Соответсвенно пользователей с такими же паролями добавляем и в sql-базу.

Собственно в итоге мы получим руление доступом пользователей на запись (на чтение можно всем) к расшареным ресурсам путем добавления/удаления их в соответсвующие группы в каталоге LDAP и управление доступом в интернет путем установки аттрибута dialupAccess в LDAP профиле пользователя.

Из интересного сегодня:

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

Связанные записи

Комментариев нет на запись "Сервер домашней сети"

Ваш комментарий может быть первым :) .

Оставить комментарий

Имя:
E-mail:
Сайт:
Вы можете использовать OpenID
или зарегистрироваться.