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

Опубликовано

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

критика, естественно, приветствуется.И так имеется в наличии:

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

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

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

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

vi /etc/ppp/ppp.confdefault: set log Phase tun command set ifaddr 10.0.0.1/0 10.0.0.2/0wstream: 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.confppp_enable="YES"ppp_mode="ddial"ppp_profile="wstream"

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

/etc/rc.d/ppp start

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

echo "195.46.96.1" > /etc/resolv.confcd /usr/ports/dns/pdnsdmake install clean

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

vi /usr/local/etc/pdnsd.conf

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

global {.....server_ip = 192.168.0.1.....}server {label = "myisp"ip = 195. 46.96.1.....uptest=ifinterface=tun0}

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

source {owner=gw.mynetfile="/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 startecho "192.168.0.1" > /etc/resolv.conf

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

cd /usr/ports/net/isc-dhcp30-servermake 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/ezjailmake install clean

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

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

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

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

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

cd /usr/ports/net/samba3make install

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

cd /usr/ports/net/nss_ldapmake install clean

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

cd /usr/ports/net/openldap24-servermake install cleanvi /usr/local/etc/openldap/slapd.conf

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

include /usr/local/etc/openldap/schema/core.schemainclude /usr/local/etc/openldap/schema/cosine.schemainclude /usr/local/etc/openldap/schema/inetorgperson.schemainclude /usr/local/etc/openldap/schema/nis.schemainclude /usr/local/etc/openldap/schema/samba.schemapidfile /var/run/openldap/slapd.pidargsfile /var/run/openldap/slapd.argslogfile /var/log/openldap/slapd.logmodulepath /usr/local/libexec/openldapmoduleload back_bdbdatabase bdbsuffix "dc=my,dc=network"rootdn "cn=Admin,dc=my,dc=network"rootpw {SSHA}+EM1XBj5BvZiJ3PXVK4YC/sJez1o4ufAdirectory /var/db/openldap-dataTLSCertificateFile /usr/local/etc/openldap/ssl/ldap.certTLSCertificateKeyFile /usr/local/etc/openldap/ssl/ldap.keyTLSCACertificateFile /usr/local/etc/openldap/ssl/ca.certindex objectClass eq,presindex ou,cn,mail,surname,givenname eq,pres,subindex uidNumber,gidNumber,loginShell eq,presindex uid,memberUid eq,pres,subindex nisMapName,nisMapEntry eq,pres,subaccess to attrs=sambaNTPassword by self write by * noneaccess to attrs=sambaLMPassword by self write by * noneaccess 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=networkobjectClass: dcObjectobjectClass: organizationdc: myo: 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.confbase dc=my,dc=networkuri ldaps://192.168.0.1/rootbinddn cn=Admin,dc=my,dc=networkbind_policy softpam_filter objectclass=uidpam_login_attribute uidpam_password sshanss_base_passwd dc=net,dc=megaded?sub?objectClass=posixAccountnss_base_shadow dc=net,dc=megaded?sub?objectClass=posixAccountnss_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 = Yesldap suffix = dc=net,dc=megadedldap admin dn = cn=Admin,dc=my,dc=networkldap delete dn = noldap filter = (&(uid=%u)(objectClass=sambaSamAccount))

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

echo 'samba_enable="YES"' >> /etc/rc.conf/usr/local/etc/rc.d/samba startsmbpasswd -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 вот так

ldapsql

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

driver = "rlm_sql_mysql"server = "localhost"login = "radius"password = "SuperPass"radius_db = "radius"

Создать базу данных.В clients.conf написать что-то типа этого

client 127.0.0.1 {secret = SuperPassshortname = mpd5}

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

startup: set user sys Password admin set console self 127.0.0.1 5005 set console opendefault: load pptp_serverpptp_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 профиле пользователя.Из интересного сегодня:

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