Использование Linux (CentOS, Fedora core) на сервере в небольшой организации

Продолжение...

Настраиваем файловый сервер. Основан на пакете samba. Делаем наш сервер мастер браузером. Предполагается, что он будет очень редко перегружаться, а значит в сети не будет перевыборов. Проще говоря, компьютеры не будут пропадать из сетевого окружения (windows машины). Правим файл /etc/samba/smb.conf

[global]
workgroup = CORP						# Название рабочей группы
netbios name = server						# Имя сервера, которое будет видно с сетевого окружения
server string = Server linux					# Пояснение
unix charset=utf8						# Для правильной кодировки. Пользователь может писать на сетевой диск файлы с русскими
dos charset=cp866						# именами.
display charset=utf8						#
interfaces = eth0 192.168.0.0/24				# Чтобы samba не "светилась" на другом сетевом интерфейсе
hosts allow = 192.168.0. 127.					# Доступ только с этих адресов.
log file = /var/log/samba/%m.log
max log size = 50
security = user							# При заходе на ресурс сервера у пользователя будет спрашиваться логин и пароль
encrypt passwords = yes
smb passwd file = /etc/samba/smbpasswd
username map = /etc/samba/smbusers
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
browse list = yes
local master = yes
os level = 65							# Этот параметр даст приоритет над другими windows-машинами при перевыборах
preferred master = yes
name resolve order = wins lmhosts bcast
wins support = yes
dns proxy = no
idmap uid = 16777216-33554431
idmap gid = 16777216-33554431
template shell = /bin/false
winbind use default domain = no

[homes]								# Домашний каталог для пользователя.
comment = Home Directories
browseable = no
writable = yes
После модификации smb.conf набрать testparm. Если не будет ошибок, то можно запустить службу smb. Теперь создадим пользователей. Чтобы пользователь мог попасть на свой сетевой диск, он должен иметь учётную запись и на сервере и в "samba". Пароли могут не совпадать с системными. Пусть у нас есть два пользователя programmer и electronik. Если они уже имеют учётные записи, то остаётся добавить их в /etc/samba/smbpasswd. Делается это командой:
smbpasswd -a "user"
в нашем случае:
[root@server /]# smbpasswd -a programmer
Программа попросит ввести два раза пароль. Чтобы потом изменить пароль, команда набирается без параметра "-a". После этого можно пробовать зайти с windows машины. Если пользователь с паролем windows машины будут совпадать с пользователем и паролем сервера, то при обращении к серверу, пользователь будет сразу попадать на свой ресурс без ввода пароля.
Новые версии samba не поддерживают такую запись - "smb passwd file = /etc/samba/smbpasswd". Взамен по умолчанию предлагается "passdb backend = tdbsam". По этому приведенный здесь вариант smb.conf не стоит слепо копировать. А желательно отредактировать имеющийся, добавляя или исправляя нужные параметры.
Можно попробовать, чтобы наш сервер был контроллером домена. Конечно он не будет полноценной заменой AD Microsoft. Но по моему, овчинка выделки не стоит. Я попробовал, мне не понравилось. Раз пропали сохранённые профили, поэтому мы у себя не стали это использовать. Кому же интересно, в интернете много информации, как в samba включить этот режим или почитать как мы испытывали openldap+samba

Теперь осталось сделать просмотр потреблённого веб-траффика. Идея такая: squid сохраняет историю посещений в /var/log/squid/access.log. Напишем скрипт, который раз в определённое время будет заглядывать в лог и сохранять его в базе данных (mysql). А уже оттуда информацию можно получать любым удобным способом. Мы получали через веб-форму. Написан скрипт на perl. Он в момент запроса подключается к базе данных, формирует динамическую html страницу и через браузер нам ее показывает.:-) В начале месяца другой скрипт на perl всю базу переносит в текстовый файл с именем типа месяцгод.log и затем обнуляет базу.

Для начала нужно создать базу данных. Почитать про mysql можно тут. В сервисах включаем mysqld. Делаем для root пароль. Создаём базу. Заходим:
[root@server /]# mysql -u root -p
Enter password:
mysql>create database traffics;
mysql>use traffics;
создаём таблицу:
mysql>create table squid(ip varchar(16), bytes bigint unsigned, link text, trans varchar(65), time datetime);
Выходим из базы данных. Пишем скрипт забирающий из логов информацию:
#!/bin/bash
cp /var/log/squid/access.log /tmp/squidforparse.log
>/var/log/squid/access.log
awk '{print "INSERT INTO squid (ip,bytes,link,trans,time) \
VALUES(\""$3"\","$5",\""$7"\",\""$9"\",from_unixtime("$1"));"};' \
< /tmp/squidforparse.log | mysql -D traffics -u root --password=parol			# parol - пароль для root базы данных
rm -f /tmp/squidforparse.log
Помещаем его в /usr/local/bin. Добавляем в crontab строку:
0-59 * * * * root /usr/local/bin/squid-to-mysql
Теперь скрипт раз в минуту будет добавлять в базу данных историю посещений веб-сайтов пользователями. Создадим теперь скрипт, который будет чистить базу данных в начале месяца. Называем его erase_sql и помещаем также в /usr/local/bin. Также добавляем в crontab:
0 4 * * * root /usr/local/bin/erase_sql
#!/usr/bin/perl
use DBI;
use strict;

my $x1;
my $name_file="/etc/mysql_erase.conf";							# В этом файле номер месяца
my ($DSN, $dbh, $sth);
my (@row,$sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst,$sum01,$sum02,$sum03,$sum);

$sum01 = 0;
$sum02 = 0;
$sum03 = 0;

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);

$year=$year+1900;
print "Сегодня $mon\n";
if (-e $name_file) {
   open(F,$name_file);
   $x1=<F>;										# Считываем номер месяца
   close(F);
   print "$x1\n";
   if ($x1 != $mon) {									# Если номер месяца не совпадает с текущим, то 
     open(F,">$name_file");
     print F $mon;									# перезаписываем этот номер
     print "Производится обновление файла конфигурации\n";
     close(F);
     open(C,">/var/log/squid/$mon$year.log");
     $DSN = "dbi:mysql:traffics";
     $dbh = DBI->connect($DSN, 'root','parol') or die "$DBI::errstr\n";
     my $statement = "SELECT * FROM squid";						# Загоняем всю базу в массив и уже из массива выбираем
     $sth=$dbh->prepare($statement);							# все что нам нужно.
     $sth->execute ();
     while (@row=$sth->fetchrow_array){
       if ($row[0] eq "127.0.0.1") {
          $sum01 = $sum01 + $row[1];
       } elsif ($row[0] eq "192.168.0.2") {
          $sum02 = $sum02 + $row[1];
       } elsif ($row[0] eq "192.168.0.3") {
          $sum03 = $sum03 + $row[1];
       }
       print C "$row[0] $row[2] $row[1] $row[4] \n";					# Записываем в файл все логи
     }
     $sum = $sum01+$sum02+$sum03;
     print C "$sum01 байт скачано локально\n";						# В конце отдельно по пользовалелям
     print C "$sum02 байт скачано Электроником\n";
     print C "$sum03 байт скачано Программистом\n";
     print C "Итого : $sum\n";
     close (C);
     my $statement = "DELETE FROM squid";
     $sth=$dbh->prepare($statement);
     $sth->execute () or die "Ошибка в методе execute :$dbh->errstr";
     $sth->finish();
     print "База данных стёрта\n";
   } else {
     print "База не будет стёрта!";
   }
}
Можно было и по красивее сделать. Общая база данных с пользователями. (Например использовать openldap) С неё уже скрипты берут данные. Но это в будущем...
Далее пишем скрипт, который бы выполнял наши запросы к базе данных. Назовём его lsql и положим в /var/www/cgi-bin
#!/usr/bin/perl
use DBI;
use strict;
use CGI qw(param());
my $ip=param("IP");									# Адрес по которому нужна выборка
my $d1=param("D1");									# Начальная дата выборки
my $d2=param("D2");									# конечная дата
my ($DSN, $dbh, $sth, @row, $sum01);

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);

$mon=$mon+1;
if (length($mon)==1) {
  $mon="0$mon";
}

$year=$year+1900;

$d1="$year-$mon-$d1 00:00:00";
$d2="$year-$mon-$d2 20:00:00";

$sum01 = 0;
$DSN = "dbi:mysql:traffics";
$dbh = DBI->connect($DSN, 'root','parol');

print "Content-type:text/html\n\n";
print "<html><head><title>Статистика</title>\n";
print "<meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\"></head><body background=\"pic/back.gif\">\n";
my $statement = "SELECT time,ip,bytes,link FROM squid Where ip='$ip' and time > '$d1' and time < '$d2'";		# Запрос к базе данных через параметры
$sth=$dbh->prepare($statement);
$sth->execute ();
print "<table border=\"1\"><tbody>\n";
print "<tr>\n";
print "   <td>Время<br></td>\n";
print "   <td>IP<br></td>\n";
print "   <td>Байты<br></td>\n";
print "   <td>Ссылки<br></td>\n";
print "</tr\n>";
while (@row=$sth->fetchrow_array){
      $sum01 = $sum01 + $row[2];
      print "<tr>\n";
      print "   <td>$row[0]<br></td>\n";
      print "   <td>$row[1]<br></td>\n";
      print "   <td>$row[2]<br></td>\n";
      print "   <td>$row[3]<br></td>\n";
      print "</tr\n>";
}
$sth->finish();
print "</tbody></table>\n";
print "<h3>$sum01 байт скачано $ip</h3>\n";
print "</body></html>\n";
Ну и сделаем веб страницу, с которой можно будет выбирать пользователей и дату. Назовём её например statistic.html и положим в /home/site (Там у нас корень веб-сервера)
<html>
<head><title></title>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body background="pic/back.gif">				# В каталоге /home/site создадим папочку pic, куда положим файлик фона для красоты (back.gif)
Страница статистики
<br>
<form method="get" action="/cgi-bin/lsql">			# По нажатию кнопки "Ok" в параметры lsql передаётся выбранный пользователь, по IP
<br><select name="IP" size=3 >					# выбранные даты, D1 и D2
    <option selected value="127.0.0.1">server
    <option value="192.168.0.2">Электроник
    <option value="192.168.0.3">Программист
    </select>
    
    <select name="D1" size="1">
    <option>01</option>
    <option>02</option>
    <option>03</option>
    <option>04</option>
    <option>05</option>
    <option>06</option>
    <option>07</option>
    <option>08</option>
    <option>09</option>
    <option>10</option>
    <option>11</option>
    <option>12</option>
    <option>13</option>
    <option>14</option>
    <option>15</option>
    <option>16</option>
    <option>17</option>
    <option>18</option>
    <option>19</option>
    <option>20</option>
    <option>21</option>
    <option>22</option>
    <option>23</option>
    <option>24</option>
    <option>25</option>
    <option>26</option>
    <option>27</option>
    <option>28</option>
    <option>29</option>
    <option>30</option>
    <option>31</option>
    </select>
    
    <select name="D2" size="1">
    <option>01</option>
    <option>02</option>
    <option>03</option>
    <option>04</option>
    <option>05</option>
    <option>06</option>
    <option>07</option>
    <option>08</option>
    <option>09</option>
    <option>10</option>
    <option>11</option>
    <option>12</option>
    <option>13</option>
    <option>14</option>
    <option>15</option>
    <option>16</option>
    <option>17</option>
    <option>18</option>
    <option>19</option>
    <option>20</option>
    <option>21</option>
    <option>22</option>
    <option>23</option>
    <option>24</option>
    <option>25</option>
    <option>26</option>
    <option>27</option>
    <option>28</option>
    <option>29</option>
    <option>30</option>
    <option>31</option>
    </select>
<input type="submit" value="Ok">
</form><br>
</body></html>
Все скрипты главное не забыть сделать исполняемыми. Теперь с любого компьютера в сети, через браузер, набрав в адресной строке http://server.corp/statistic.html мы можем просматривать за выбранный период историю посещений сайтов пользователями.

При желании можно настроить виртуальную частною сеть, чтобы клиенты могли попадать в локальную сеть, находясь дома (командировке). Описание прочитать можно здесь.

Кому то может показаться слишком нудной (сложной) настройка сервера. Для облегчения администрирования можно порекомендовать пакет webmin. Позволяет настраивать службы через веб-форму. После установки в браузере набрать http://server.corp:10000. Также существуют и другие решения подобных задач. Описанные здесь решения не претендуют на правильность и красивость. Многие взяты из интернета. Главный недостаток: длительная и кропотливая настройка, через некоторое время все забывается. Поставил, настроил и забыл.

Большое спасибо парням с форума unixforum.org за помощь и консультации!

Также рекомендую посетить сайты www.postfix.ru и www.mysql.ru
И не менее главные помощники в настройке всего и вся - google и yandex
Назад . . .

На главную...