Мое освоение линуксаНебольшой дневник о том как я воевал с nix системами

Django (читается как Джанго) – это свободно распространяемый фреймворк с открытым исходным кодом для разработки веб приложений на языке Python. Django обладает следующими архитектурными отличиями:

  • использование концепции Модель-Представление-Контроллер (Model-View-Controller, MVC). В терминологии Django это будет Модель-Шаблон-Вид (Model-Template-View, MTV)
  • использование концепции приложений. Весь код рекомендуется оформлять в виде приложений и делать его подключаемым и переносимым
  • диспетчер URL на основе регулярных выражений
  • ORM для работы с БД (с поддержкой транзакций)
  • встроенный веб-сервер для разработки
  • встроенная административная панель

Установка и настройка Django

Django можно установить двумя способами: из репозитариев или скачав исходники фреймворка с сайта. Как правило, в репозитариях находится не самая свежая версия. Поэтому, обычно используется второй способ, хотя это и не Debian-way.

Установка Django из репозитория

Пакет Django находится в стандартном репозитории, поэтому ничего нового подключать не надо. Для установки необходимо выполнить следующее:

$ sudo aptitude install python-django

Установка последней стабильной версии Django

Для установки последней версии необходимо скачать исходники и распаковать их:

$ sudo mkdir ~/django
$ cd ~/django
$ wget http://www.djangoproject.com/download/1.1/tarball/
$ tar xzf Django-1.1.tar.gz

Далее, необходимо узнать, в какую директорию необходимо устанавливать пакеты, чтобы Python узнал об этом. Для этого необходимо выполнить:

$ python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"
/usr/lib/python2.5/site-packages

В данном случае, видно что основной версией является Python 2.5 и все дополнительные пакеты устанавливаются в директорию “/usr/lib/python2.5/site-packages”.

Следующим шагом необходимо создать символическую связь для распакованной директории Django:

$ sudo ln -s ~/django/Django-1.1/django /usr/lib/python2.5/site-packages/django

И в конце, чтобы сделать команду django-admin.py доступной из любой директории системы, необходимо добавить еще одну символическую ссылку:

$ sudo ln -s ~/django/Django-1.1/django/bin/django-admin.py /usr/local/bin

Проверка корректности установки Django

Чтобы убедиться, что Django нормально установлен, необходимо запустить интерпретатор Python и импортировать модуль django:

$ python -c "import django; print django.VERSION;"
(1, 1, 0, 'final', 0)

Все в порядке. Последняя версия Django корректно установлена.

Установка и настройка Apache, mod_wsgi

Для работы с Django необходимы http-сервер Apache и модуль к нему – mod-wsgi. Модуль mod_wsgi пришел на смену mod_python и в настоящее время рекомендуется авторами Django как наиболее подходящее решение для использования в реальных условиях.

Установка Apache и mod_wsgi тривиальна:

$ sudo aptitude install apache2 libapache2-mod-wsgi

Установка MySQL

Кроме самого сервера MySQL необходимо также установить пакет, который позволяет работать с MySQL из Python:

$ sudo aptitude install mysql-server python-mysqldb

При установке необходимо будет указать пароль для root-пользователя БД MySQL.

Создание и настройка проекта в Django

При создании проекта будем исходить из того, что код Django-проекта должен работать от имени отдельного системного пользователя.

Создание проекта Django

Далее приведен код создание Django-проекта и некоторых дополнительных директорий в нем:

# директория для django проектов
$ sudo mkdir -p /home/django-projects/debianworld_ru

# новый django-проект
$ cd /home/django-projects/debianworld_ru
$ sudo django-admin.py startproject apps

# корректируем название модуля для корректного импорта
$ sudo perl -pi -e 's/apps.urls/urls/g' apps/settings.py

# директория для настроек wsgi
$ sudo mkdir -p /home/django-projects/debianworld_ru/deploy

# директория для статики
$ sudo mkdir -p /home/django-projects/debianworld_ru/media

# директория для логов
$ sudo mkdir -p /home/django-projects/debianworld_ru/logs

Создание пользователя для проекта

Для того, чтобы изолировать код проекта от остальной системы (в целях безопасности), необходимо добавить в систему пользователя, от имени которого будет исполняться код проекта:

# создается системная группа
$ sudo addgroup --quiet --system dw

# создается системный пользователь
$ sudo adduser --quiet --system --ingroup dw --no-create-home --no-create-home dw

# новый владелец для проекта
$ sudo chown dw:www-data -R /home/django-projects/debianworld_ru

# права доступа на проект
$ sudo chmod u=rwx,g=x,o= -R /home/django-projects/debianworld_ru

Настройка виртуального хоста в Apache

Далее, чтобы код проекта отзывался на какой-либо URL-адрес, необходимо настроить виртуальный хост Apache. Необходимо создать новый файл:

$ sudo -u dw vim /home/django-projects/debianworld_ru/deploy/debianworld.ru

И добавить в него следующий код:

<VirtualHost 10.1.0.4>
    # Описание сервера
    ServerAdmin admin@wsgi.debianworld.ru
    ServerName wsgi.debianworld.ru

    # Логи
    ErrorLog    /home/django-projects/debianworld_ru/logs/error_log
    CustomLog   /home/django-projects/debianworld_ru/logs/access_log common

    # wsgi-обработчик (см. ниже)
    WSGIScriptAlias / /home/django-projects/debianworld_ru/deploy/django.wsgi
    # Параметры запуска wsgi
    WSGIDaemonProcess dw-site user=dw group=dw home=/home/django-projects/debianworld_ru/media/ \
                      processes=2 threads=4 maximum-requests=100 display-name=apache-dw-wsgi
    WSGIProcessGroup dw-site

    # Статические файлы django-админки
    Alias "/media_admin/" "/usr/lib/python2.5/site-packages/django/contrib/admin/media/"
    <Location "/media_admin/">
        SetHandler None
    </Location>

    # Статические файлы проекта
    Alias "/media/" "/home/django-projects/debianworld_ru/media/"
    <Location "/media/">
        SetHandler None
    </Location>
</VirtualHost>

В данном случае 10.1.0.4 – это IP-адрес машины, на которой работает Apache.

Настройка wsgi

Теперь, когда виртуальный хост создан, необходимо создать wsgi-обработчик. Для этого создается файл:

$ sudo -u dw vim /home/django-projects/debianworld_ru/deploy/django.wsgi

В файл добавляется следующий код:

#/usr/bin/python
# -*- coding: utf-8 -*-    
import os, sys

# В python path добавляется директория проекта
dn = os.path.dirname
PROJECT_ROOT = os.path.abspath( dn(dn(__file__)) )
DJANGO_PROJECT_ROOT = os.path.join(PROJECT_ROOT, 'apps')
sys.path.append( DJANGO_PROJECT_ROOT )

# Установка файла настроек
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

# Запуск wsgi-обработчика
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

Включение виртуального хоста Apache

На заключительном шаге необходимо дать знать о наличии нового виртуального хоста в Apache, включить его и перезагрузить сам Apache:

# Добавляет ссылку на виртуальный хост в список доступных хостов
$ sudo ln -s /home/django-projects/debianworld_ru/deploy/debianworld.ru \
             /etc/apache2/sites-available/debianworld.ru

# включаем виртуальный хост
$ sudo a2ensite debianworld.ru

# рестарт Apache
$ sudo /etc/init.d/apache2 restart

Проверка корректности установки

Чтобы проверить, что Django корректно работает через mod_wsgi необходимо попытаться открыть URL “http://wsgi.debianworld.ru/” в браузере.

Результатом должно быть приглашение:

It worked!
Congratulations on your first Django-powered page.

Of course, you haven't actually done any work yet. Here's what to do next:
  * If you plan to use a database, edit the DATABASE_* settings in settings/settings.py.
  * Start your first app by running python settings/manage.py startapp [appname].

Создание БД/пользователя в MySQL, настройка Django

После того, как есть уверенность, что Django установлен и работает, необходимо обеспечить возможность работы с БД. Для этого необходимо залогиниться в MySQL под root’ом:

$ mysql --user=root -p

И создать новую базу данных и нового пользователя:

mysql> CREATE DATABASE debianworld_db CHARACTER SET utf8;
Query OK, 1 row affected (0.01 sec)

mysql> CREATE USER debianworld_usr@localhost IDENTIFIED BY 'mega-secure-password';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT ALL ON debianworld_db.* TO debianworld_usr@localhost;
Query OK, 0 rows affected (0.00 sec)

После того, как новые БД и пользователь готовы, необходимо прописать их в конфиг Django. Для этого необходимо открыть файл настроек:

$ sudo -u dw vim /home/django-projects/debianworld_ru/apps/settings.py

И прописать следующие значения:

# ...
DATABASE_ENGINE = 'mysql'                   # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'debianworld_db'            # Or path to database file if using sqlite3.
DATABASE_USER = 'debianworld_usr'           # Not used with sqlite3.
DATABASE_PASSWORD = 'mega-secure-password'  # Not used with sqlite3.
DATABASE_HOST = ''                          # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = ''                          # Set to empty string for default. Not used with sqlite3.
# ...

И в заключении, необходимо дать команду Django создать в БД основные таблицы:

$ sudo -u dw /home/django-projects/debianworld_ru/apps/manage.py syncdb
Creating table auth_permission
Creating table auth_group
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (Leave blank to use 'dw'): admin
E-mail address: admin@wsgi.debianworld.ru
Password:
Password (again):
Superuser created successfully.
Installing index for auth.Permission model
Installing index for auth.Message model

Вот и все. Теперь Django настроено полностью. Далее можно создавать приложения слдеующей командой:

$ sudo -u dw /home/django-projects/debianworld_ru/apps/manage.py manage.py startapp firstapp

или непосредственно под тем пользователем, под которым работает весь код проекта:

$ sudo -u dw bash
$ cd /home/django-projects/debianworld_ru/apps/
$ ./manage.py startapp firstapp

ginx – высоко производительный HTTP сервер, распространяемый с вместе с исходными кодами. Nginx стал популярным благодаря своей стабильности, богатому набору возможностей, простой конфигурацией и небольшим потреблением системных ресурсов.

Встроенной поддержки PHP в nginx нет, но есть возможность работы с FastCGI. Благодаря этому, а так же fastcgi демону spawn-fcgi, идущего вместе с сервером lighttpd, PHP-сайты могут вполне благополучно работать под nginx.

Установка и настройка PHP

Установка PHP

Установка PHP не отличается от установки какого-либо другого пакета в Debian / Ubuntu. Выполняем установку непосредственно PHP(5), а так же поддержку FastCGI в PHP:

$ sudo aptitude install php5 php5-cgi

Настройка PHP

После установки PHP, необходимо сделать некоторые настройки: обеспечить поддержку правильных PATH_INFO/PATH_TRANSLATED в CGI. Для этого необходимо отредактировать файл /etc/php5/cgi/php.ini следующим образом:

# ...
cgi.fix_pathinfo = 1
# ...

Установка lighttpd

PHP может работать с nginx через FastCGI. Отдельного fastcgi демона в Debian / Ubuntu нет. Поэтому будет использован spawn-fcgi, идущий вместе с http сервером lighttpd. Для этого необходимо установить сам lighttpd:

$ sudo aptitude install lighttpd

Так как основным HTTP сервером будет nginx, то необходимо остановить lighttpd и отключить его запуск при старте системы:

# останавливаем  lighttpd 
$ sudo /etc/init.d/lighttpd stop
Stopping web server: lighttpd.

# удаляем из авто загрузки
$ sudo update-rc.d -f lighttpd remove
 Removing any system startup links for /etc/init.d/lighttpd ...
   /etc/rc0.d/K20lighttpd
   /etc/rc1.d/K20lighttpd
   /etc/rc2.d/S20lighttpd
   /etc/rc3.d/S20lighttpd
   /etc/rc4.d/S20lighttpd
   /etc/rc5.d/S20lighttpd
   /etc/rc6.d/K20lighttpd

Установка и настройка nginx, FastCGI

Установка nginx

Установка nginx обычна для Debian / Ubuntu:

$ sudo aptitude install nginx

Настройка и запуск FastCGI

Из установленного http сервера lighttpd, будет необходим лишь один скрипт: usr/bin/spawn-fcgi, который может быть использован для запуска FastCGI процессов.

Для того, чтобы запустить PHP FastCGI демон, слушающий 9000 порт на localhost’е, и работающие под пользователем и группой www-data, необходимо выполнить:

$ sudo /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 \
                  -u www-data -g www-data \
                  -f /usr/bin/php5-cgi \
                  -P /var/run/fastcgi-php.pid

Очевидно, что нет никакого желания вводить данную команду вручную после каждого старта системы. Для того, чтобы указанный выше скрипт запускался при загрузке системы, необходимо отредактировать файл /etc/rc.local:

# ...
# Добавить в конце файла, перед командой "exit 0"
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
# ...

Настройка nginx

Все настройки nginx находятся в файле /etc/nginx/nginx.conf. Отредактируем хост по умолчанию:

$ sudo vim /etc/nginx/sites-available/default

Внесем следующие изменения:

server {
    listen   80;
    server_name  localhost;

    access_log  /var/log/nginx/localhost.access.log;

    location / {
            root   /var/www/nginx-default;
            index  index.php index.html index.htm;
    }

    # ...

    # Передаем PHP скрипт FastCGI серверу,
    # который прослушивает 127.0.0.1:9000
    location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/nginx-default$fastcgi_script_name;
            include        fastcgi_params;
    }
    # ...
}

В начальной конфигурации дефолтного хоста, блок *location ~ .php$* закомментирован. Необходимо раскомментировать его. При этом, необходимо обратиться внимание на строчку “includefastcgi_params”, что есть ошибка. Необходимо вписать пробелы, как это указано выше.

После чего необходимо перезагрузить nginx:

$ sudo /etc/init.d/nginx restart

Далее, создаем проверочный php-скрипт:

$ sudo vim /var/www/nginx-default/info.php

И вносим следующим код:

<?php
phpinfo();
?>

Далее, обращаемся к созданной странице info.php. Допуская, что IP сервера 10.1.0.4, необходимо обратиться по адресу: http://10.1.0.4/info.php. В результате будет выведена информация о PHP и его окружении. Необходимо обратить внимание на строчку Server API. Если значение в данной строке – CGI/FastCGI, то можно констатировать, что PHP под nginx успешно установлен.

Для установки набираем следующее в консоли:

yum –enablerepo=remi install memcached

примерный файл конфига (/etc/sysconfig/memcached):

PORT=”11211″
USER=”memcached”
MAXCONN=”1024″
CACHESIZE=”64″
OPTIONS=”-l 127.0.0.1″

Запуск:

chkconfig memcached on
/etc/init.d/memcached start

если необходимо php расширение то:

yum –enablerepo=remi install php-pecl-memcache
или для PHP 5.2.10
rpm -ihv http://rpms.famillecollet.com/enterprise/5/olds/x86_64/php-pecl-memcache-3.0.4-1.el5.remi.x86_64.rpm
/etc/init.d/httpd reload

Объединение центрального офиса с филиалами, складами и т.д. в единую
сеть - это то, с чем приходится довольно часто сталкиваться
администратору сети. Объединять сети можно "хардвардным"
способом на железяках (Cisco, D-Link, etc) и
"программным" на серваках под разными ОС (Windows, Linux,
BSD). При наличии сервера на железяки можно не разоряться, а
воспользоваться тем что есть, тем более что функционал в этом случае
будет более широкий. В связи с планирующимся расширением фирмы, я решил
заранее выбрать и обкатать наиболее подходящую схему объединения офисов.
Немного погуглив, остановился на OpenVPN, как на более защищенном и не
особо замороченом способе. Дистрибутивом взял Ubuntu Server 8,04 i386
т.к. очень хотелось пощупать Убунту в виде сервера и посмотреть на что
она способна. Экспериментировал в виртуальных сетях под VMware Server. 

Схема соединения сетей следующая:

        192.168.120.0 <serv1> 10.0.0.0 <serv2> 192.168.110.0


На каждом сервере поднят межсетевой экран iptables и nat. Для того,
чтобы серверы могли устанавливать ПО из реальной глобальной сети, я
подключал к ним третий bridged интерфейс. Далее в конфигурационных
файлах я его упоминать не стал.

Устанавливаем сервер (serv1)

После нетривиальной установки, которую не буду описывать, конфигурируем
сетевые интерфейсы:

        # cat /etc/network/interfaces

        auto lo
        iface lo inet loopback

        auto eth0
        iface eth0 inet static
        address 10.0.0.10
        netmask 255.255.255.0

        auto eth1
        iface eth1 inet static
        address 192.168.120.20
        netmask 255.255.255.0


Делаем из него роутер путем добавления в /etc/sysctl.conf строчки:

        net.ipv4.ip_forward=1


Настраиваем путь к репозиторям из которых будем устанавливать ПО:

        # cat /etc/apt/sources.list

        deb http://ru.archive.ubuntu.com/ubuntu/ hardy main contrib non-free restricted universe multiverse
        deb-src http://ru.archive.ubuntu.com/ubuntu/ hardy main contrib non-free restricted universe multiverse

        deb http://ru.archive.ubuntu.com/ubuntu/ hardy-updates main contrib non-free restricted universe multiverse
        deb-src http://ru.archive.ubuntu.com/ubuntu/ hardy-updates main contrib non-free restricted universe multiverse

        deb http://ru.archive.ubuntu.com/ubuntu/ hardy-security main contrib non-free restricted universe multiverse
        deb-src http://ru.archive.ubuntu.com/ubuntu/ hardy-security main contrib non-free restricted universe multiverse


Дальше устанавливаем дополнительное ПО, предварительно обновившись:

        # aptitude update
        # aptitude upgrade
        # aptitude install console-cyrillic mc traceroute openvpn vsftpd


Для работы OpenVPN необходимо создать сретификаты и конфигурационный
файл openvpn.conf.

Для генерирования сертификатов переходим в каталог easy-rsa:

        # cd /usr/share/doc/openvpn/examples/easy-rsa/2,0


Заполняем шаблонный файл с пременными vars. Я заполнил только последнюю
часть с данными о фирме, городе и т.п., плюс изменил директорию с
ключами:

        export KEY_DIR="/etc/openvpn/keys"


Генерируем сертификаты:

        # ./build-dh
        # ./pkitool -initca
        # ./pkitool -server server
        # ./pkitool client


Созданные сертификаты должны появиться в вышеуказанной папке, если
конечно вы ее предварительно создали.

Дальше пишем конфиг сервера. Читал разные статьи на эту тему, наступал
на грабли, но в итоге плюнул и без проблем все сделал по примерам,
которые лежат в папке
/usr/share/doc/openvpn/examples/sample-config-files. В итоге получился
такой конфиг:

        #cat /etc/openvpn/openvpn.conf

        dev tun
        tls-server
        proto udp
        port 3333
        comp-lzo
        persist-tun
        persist-key

        # указываем узловые точки виртуальной сети
        ifconfig 10.1.0.1 10.1.0.2
        # добавляем маршрут к локальной сети филиала
        route 192.168.110.0 255.255.255.0

        dh /etc/openvpn/keys/dh1024.pem
        ca /etc/openvpn/keys/ca.crt
        cert /etc/openvpn/keys/server.crt
        key /etc/openvpn/keys/server.key

        log /var/log/openvpn.log
        verb 3


Все готово, делаем рестарт сервера и убеждаемся в том, что все ОК:

        # /etc/init.d/openvpn restart
        # ps -ely | grep openvpn


Для полного счастья добавляем правила в  iptables (приведенный ниже
вариант может отличаться, в зависимости от вашей конфигурации):

        iptables -A INPUT -p udp -dport 3333 -j ACCEPT
        iptables -A INPUT -i tun0 -j ACCEPT
        iptables -A FORWARD -i tun0 -j ACCEPT
        iptables -A FORWARD -o tun0 -j ACCEPT


Установка клиента (serv2)

В плане установки и настройки системы проделываем то же самое, что и с
предыдущем сервером.

        # cat /etc/network/interfaces

        auto lo
        iface lo inet loopback

        auto eth0
        iface eth0 inet static
        address 10.0.0.20
        netmask 255.255.255.0

        auto eth1
        iface eth1 inet static
        address 192.168.110.10
        netmask 255.255.255.0


Сертификаты нужно скопировать с центрального сервера. Я для этих целей
поднимал там ftp.

        dev tun
        tls-client
        remote 10.0.0.10
        proto udp
        port 3333
        comp-lzo
        persist-tun
        persist-key

        # указываем узловые точки виртуальной сети
        ifconfig 10.1.0.2 10.1.0.1
        # добавляем маршрут к локальной сети офиса
        route 192.168.120.0 255.255.255.0

        dh /etc/openvpn/keys/dh1024.pem
        ca /etc/openvpn/keys/ca.crt
        cert /etc/openvpn/keys/client.crt
        key /etc/openvpn/keys/client.key

        log /var/log/openvpn.log
        verb 3


Запускаем:

        # /etc/init.d/openvpn restart


Правим фаервол:

        iptables -A INPUT -i tun0 -j ACCEPT
        iptables -A FORWARD -i tun0 -j ACCEPT
        iptables -A FORWARD -o tun0 -j ACCEPT


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

Итоговые впечатления: все стабильно, секьюрно и удобно, а Ubuntu Server
может быть достойной заменой Debian.
В этой заметке мы рассмотрим как организовать копирование
исходящий(возможно всей т.е. и входящей) почты проходящей через
sendmail. Было рассмотрено несколько вариантов муссировающих в
интернете, и выбран полностью рабочий, проверен на FreeBSD 6 и 7 RELEASE

1. Введение

Морально-этические соображения, касающиеся вопроса копирования исходящей
почты, находятся за рамками данной статьи и здесь не рассматриваются.

Следует отметить, что, как правило, копирование почты, в особенности без
уведомления корреспондентов, считается неэтичным, а в некоторых случаях
даже противозаконным. ). Создатели Sendmail намеренно исключили такую
возможность у самого почтовика, сославшись на то, что они хотят сделать
подглядывание за чужой почтой хотя бы немного сложнее.

С другой стороны, надо понимать, что вся почта передающаяся через
почтовый сервер, и через все остальные серверы по пути её следования,
может быть легко просмотрена их администраторами. Если нужно чтобы почту
не мог прочитать никто, нужно использовать системы шифрования почты,
такие как PGP/GPG и другие подобные.

2. Как копируют почту?

При использовании Sendmail в качестве основной почтовой программы (MTA),
копирование исходящей почты возможно одним из трёх способов:

    * Копирование с помощью другой копии sendmail
    * Копирование с помощью локального обработчика почты, обычноprocmail
    * Копирование с помощью программы, подключенной через milter-интерфейс Sendmail 


Ниже рассматривается, как можно настроить копирование почты по третьему
способу, то есть через milter-интерфейс Sendmail.

В качестве программы, выполняющей копирование почты, используется
программа Synonym.

3. Копирование через milter

Копирование почты выполняется с помощью внешней программы Synonym,
которая получает почтовое сообщение от Sendmail'а через Milter API.
Synonym на основе дотаточно грубых критериев выбирает часть писем и
передаёт их программе procmail, которая выполняет обработку на основе
любой информации в заголовках и теле письма.

4. Установка Synonym'a

Обновляем порты ( portsnap fetch update)

        cd /usr/ports/mail/synonym
        make install clean


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

        synonym_enable="YES"


5. Настройка Sendmail

 в /etc/mail/domen.mc добаляем строчку:

        INPUT_MAIL_FILTER(`Synonym', `S=local:/var/run/synonym/synonym.sock, T=C:10m;S:1s;R:1s;E:5m')


 затем

        cd /etc/mail
        make install
        make restart


 этими коммандами мы собираем конфиг заново и перезапускаем sendmail

6. Настройка Synonym'a

 конфиг - /usr/local/etc/synonym.conf

          <Rules>
            <Rule>
                <Condition>
                        <Header>From</Header>
                        <Match>.*domen.ru</Match>
                </Condition>
                <Action>
                        <ActionType>Copy</ActionType>
                        <Address>seacher@domen</Address>
                </Action>
            </Rule>
         </Rules>


 в  вышеописанном примере вся почта домена копируется на определённый ящик.

 Можно составить в принципе любую конструкцию. и отправлять письма не
 только на локальный ящик.
 Например, можно фильтровать по "subject", по "to"  и т.д.
 Также, почту из ящика seacher@domen, можно раскидывать по
 необходимостям, с помощью procmail

 пример:

        MAILDIR=$HOME
        FORMAIL=/usr/local/bin/formail

        # Copy monitored addresses to abuse@example.comЭтот адрес e-mail защищен от спам-ботов. Чтобы увидеть его, у Вас должен быть включен Java-Script
        :0 c
        * ^(From|To).* Этот адрес e-mail защищен от спам-ботов. Чтобы увидеть его, у Вас должен быть включен Java-Script
        {
        # Prevent mail loops
         :0
        * ^X-Loop
        /dev/null

        # Copy each message to "monitored" directory
         :0 c
        monitored

        # Add an "X-Loop" header to prevent milter mail loops and mail a copy of the message to abuse@example.comЭтот адрес e-mail защищен от спам-ботов. Чтобы увидеть его, у Вас должен быть включен Java-Script
         :0
        | $FORMAIL -I "X-Loop: Synonym" | mailx -s "Monitored email" abuse@example.comЭтот адрес e-mail защищен от спам-ботов. Чтобы увидеть его, у Вас должен быть включен Java-Script
        }

        # Copy messages from example.com containing attachments
        # to attachments sub-directory for attachment report processing
        :0
        * ^From.*example\.com
        {
         :0 B
        * filename=
        attachments
        }

        # Discard all other messages
        :0
        *
        /dev/null


7. Запуск

после этого запускаем synonym

        /usr/local/etc/rc.d/synonym start

Решил написать свою статью по управлению трафика. Мне нужно было ещё
формировать статистику (отдельно upload и download), и исключить из неё
внутрисетевой трафик, то есть считать только чисто интернет: кто
сколько накачал. В сети есть много примеров, но они почему-то используют
Mysql. Шлюз у меня немощный, да и лишний сервис подымать только что бы
хранить статистику - для моих целей не нужно было. Поэтому и решил:
статистика будет храниться в файлах, будет суммироваться трафик и
отправляться на e-mail.

Что имеем: FreeBSD 7.0, установлен squid, ядро собрано с поддержкой
divert, dummynet, ipfw.

Базу почерпнул из статьи http://www.tmeter.ru/misc/trafd/, поэтому
кое-что может пересекаться.

Установка и начальная подготовка trafd.

Trafd ставим из портов.

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


Вместе с ним ставятся
  • trafd - демон сбора трафика
  • trafdump/trafsave - программы для записи собранного трафика демоном trafd в бинарный формат
  • traflog - программа для преобразования бинарных файлов трафика в тестовый формат Для запуска демона при загрузке ОС, в /etc/rc.conf прописываем такое trafd_enable="YES" trafd_ifaces="sis0" trafd_flags="-r -p" trafd_log="/var/log/traffic.log" Я добавил один интерфейс, но можно и несколько (через пробел) Параметр -r означает попытку восстановления данных из существующего бинарного файла при рестарте демона. Параметр -p означает то, что переводить сетевой адаптер в promiscuous mode не надо (по умолчанию, демон trafd переводит сетевой адаптер в promiscuous mode) ВНИМАНИЕ! trafd кладёт дамп трафика по адресу /usr/local/var/trafd. Поменять это значение вроде бы нельзя, но можно создать симлинк. Скрипты для сбора, обработки и отправки статистики. И так, вот это скрипт (trafd_dump) будет запускаться раз в 15 минут, и будет сливать так называемый "дамп" трафика. #cat trafd_dump #!/bin/sh /usr/local/bin/trafdump sis0 Этот скрипт будет запускаться под конец суток и сохранять статистику за сутки в бинарный файл. #cat trafd_save #!/bin/sh /usr/local/bin/trafsave sis0 И ещё один скрипт, который статистику переводит в текстовый формат. #cat trafd_daily #!/bin/sh date=`date -v-1d '+%Y%m%d'` fp=/usr/local/var/trafd/$date fn=/usr/local/var/trafd/plain/$date cp /usr/local/var/trafd/trafd.sis0 $fp.sis0 rm /usr/local/var/trafd/trafd.sis0 /usr/local/bin/traflog -a -n -i $fp.sis0 >> $fn.sis0 /scripts/trafd_stat который в конце вызывает скрипт обработки и отправки отчёта на e-mail. Вот он. #cat trafd_stat #!/bin/sh /bin/date=`date -v-1d '+%Y%m%d'` path=/usr/local/var/trafd/plain fn=$path/${date}.sis0 fstatup=$path/stat.${date}.upload.txt fstatdown=$path/stat.${date}.download.txt /bin/rm -f $fstatup /bin/rm -f $fstatdown /bin/echo `date -v-1d "+DATE: %Y-%m-%d"` >> $fstatup /bin/echo "Upload Traffic" >> $fstatup /bin/echo "Traffic (Mb) IP address" >> $fstatup /bin/echo "" >> $fstatup /bin/echo `date -v-1d "+DATE: %Y-%m-%d"` >> $fstatdown /bin/echo "Download Traffic" >> $fstatdown /bin/echo "Traffic (Mb) IP address" >> $fstatdown /bin/echo "" >> $fstatdown /bin/cat $fn | awk ' $1!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./ {print} ' \ | /usr/bin/awk ' $3!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./ {print} ' \ | /usr/bin/awk ' {OFS=" "} $1~/10.0.9./ {print $1,$7} ' | /usr/bin/sort -fn \ | /usr/bin/awk '{sum[$1]+=$2}END{for(i in sum) print i,sum[i]}' \ | /usr/bin/awk ' {OFS=" "} $2 = int($2/1048576) {print $2,$1}' | /usr/bin/sort -fnr >> $fstatup /bin/cat $fstatup | /usr/bin/mail -s "Statistics for upload" skeletor@mydomain.com /bin/cat $fn | /usr/bin/awk ' $1!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./ {print} ' \ | /usr/bin/awk ' $3!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./ {print} ' \ | /usr/bin/awk ' {OFS=" "} $3~/10.0.9./ {print $3,$7} ' | sort -fn \ | /usr/bin/awk '{sum[$1]+=$2}END{for(i in sum) print i,sum[i]}' \ | /usr/bin/awk ' {OFS=" "} $2 = int($2/1048576) {print $2,$1}' | /usr/bin/sort -fnr >> $fstatdown /bin/cat $fstatdown | /usr/bin/mail -s "Statistics for download" skeletor@mydomain.com /bin/rm -f $fstatup /bin/rm -f $fstatdown Немного поясню данный скрипт. Вот эта строчка $1!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./ исключает их статистики внутренние подсети (локалка у меня имеет подсеть 10.0.9.0/24) (я считал только инет-трффик, внутрисеть не считал). Можете поменять на свои :) Кстати, то же самое я делаю и для третьего поля. $3!~/10.0.3.|10.0.9.100|10.0.9.255|10.0.19.|10.0.59./ ибо trafd пишет статистику в таком виде from_IP type to_IP ... $2 = int($2/1048576) - это я перевожу из байт в мегабайты. Дальше по скрипты сортирую по максимальному значению и отправляю на e-mail. То же самое делается и для статистики download. Вот собственно и всё. Отсчёт приходит в таком виде. DATE: 2008-12-04 Upload Traffic Traffic (Mb) IP address 16 10.0.9.55 11 10.0.9.58 9 10.0.9.63 6 10.0.9.61 4 10.0.9.64 4 10.0.9.59 4 10.0.9.54 3 10.0.9.62 3 10.0.9.60 2 10.0.9.66 2 10.0.9.57 1 10.0.9.56
  • Интересная идея заменить множество пайпов в файерволе на механизм
    предложенный в ng_car.
    
    Для примера,схема такая, имеем:
    
    Сервер FreeBSD, он подключает пользователей по PPPoE через mpd,
    интерфейс bge0 смотрит вверх.
    
    Но, ВНИМАНИЕ, NAT`а на этом сервере нет, поэтому, зная что:
    
    Шейпируется только исходящий трафик с интерфеса (как и в PF)
    
    читайте эу статью учитывая эти факты.
    
    Итак, до этого момента для шейпа использовался IPFW + PIPE + таблицы и
    вяглядело примерно так:
    
            05800 pipe 63 ip from any to table(63) out
            05900 pipe 93 ip from table(63) to any in
            06000 pipe 64 ip from any to table(64) out
            06100 pipe 94 ip from table(64) to any in
            ...
            11200 pipe 78 ip from any to table(78) out
            11300 pipe 108 ip from table(78) to any in
            11400 pipe 256 ip from any to table(16) out
            11500 pipe 257 ip from table(16) to any in
    
    
    и т.д. около 50-ти таблиц, т.к. тарифов множество.
    
    Шейпируется несколько видов трафика: в интернет, к локальным ресурсам
    
    Используя IPFW+ ng_car + таблицы все это можно свести к менее
    громоздкому варианту:
    
            04000 netgraph tablearg ip from table(20) to table(30) out via bge0
            04010 netgraph tablearg ip from table(30) to table(20) out via ng*
            05000 netgraph tablearg ip from table(10) to not table(30) out via bge0
            05010 netgraph tablearg ip from not table(30) to table(10) out via ng*
    
    
    Разница по загрузке CPU при шейпе на ng_car довольно ощутима.
    
    Рассмотрим этот вариант повнимательнее:
    
    netgraph - это правило действует как divert, только заворачивает оно не
    в socket, а в ноду netgraph с параметром tablearg. 
    
    tablearg - это аргумент в таблице (10 и 20). Он должен быть уникальным
    для каждого пользователя, именно по этому аргументу создается нода
    netgraph, которая и будет шейпить (лимитировать скорость) пользователя.
    
    Пример создания таблицы IPFW:
    
            #:test:~: ipfw table 10 add 172.16.10.26/32 10
            #:test:~: ipfw table 10 add 172.16.10.27/32 20
            #:test:~: ipfw table 10 add 172.16.10.28/32 30
    
    
    Посмотрим, что получилось:
    
            #:test:~:ipfw table 10 list
            172.16.10.26/32 10
            172.16.10.27/32 30
            172.16.10.28/32 20
    
    
    Условимся что:
    
    table 10 - IP-адреса с доступом к интернету
    table 20 - IP-адреса с доступом к локальным ресурсам
    table 30 - IP-адреса самиx локальныx ресурсов
    bge0 - верхний интерфес
    ng* - нижние интерфейсы пользователей, подключенных через PPPoE (MPD).
    
    Таким образом мы передали управление от ipfw к ng_car посредством 4
    правил в файерволе.
    
    Теперь нужно задать каждому IP-адресу определенную полосу.
    
    В mpd есть скрипты up и down, которые отрабатывают при поднятии туннеля
    и при опускании туннеля.
    
    Вот них то мы и будем нарезать полосы для IP-адресов в момент
    подключения к серверу.
    
    Для шейпера нужны 3 модуля:
    
            ng_ether.ko
            ng_car.ko
            ng_ipfw.ko
    
    
    Посмотреть подгружены ли модули можно по команде:
    
            kldstat
    
    
    Если их нет, то загружаем командами:
    
            /sbin/kldload /boot/kernel/ng_ether.ko
            /sbin/kldload /boot/kernel/ng_car.ko
            /sbin/kldload /boot/kernel/ng_ipfw.ko
    
    
    Скрипт UP.pl:
    
    
    #!/usr/bin/perl
    
    $iface=$ARGV[0];             ###интерфес пользователя
    $ip=$ARGV[3];                 ###IP, выдаваемый пользователю
    $user=$ARGV[4];              ###логин пользователя
    $inet_table=10;                ###таблица с IP-адресами с доступом в интернет
    $local_table=20;               ###таблица с IP-адресами c доступом к локальным ресурсам
    $shape_inet=20971520;     ###шейп в интернет (байт/с)
    $shape_local=8388608;      ###шейп в локалку (байт/с)
    
    ###Ищем tablearg IP-адреса в таблицах
    $tablearg_inet=`/sbin/ipfw table $inet_table list | awk '/$ip/ \{print \$2\}'`;
    $tablearg_local=`/sbin/ipfw table $local_table list | awk '/$ip/ \{print \$2\}'`;
    
    ###создаем шейп в интернет
    $tablearg=$tablearg_inet;
    chomp($tablearg);
    $shape=$shape_inet;
    $shape_type="inet";
    shape($iface,$tablearg,$shape,$shape_type,$user);
    
    ###создаем шейп к локальным ресурсам
    $tablearg=$tablearg_local;
    chomp($tablearg);
    $shape=$shape_local;
    $shape_type="local";
    shape($iface,$tablearg,$shape,$shape_type,$user);
    
    ###===функция нарезки шейпа===
    sub shape{
                $cbs=$ebs=$shape/8;
                $cmd=sprintf("/usr/sbin/ngctl -f- <<-EOF
                                   mkpeer ipfw: car %s upper
                                   name ipfw:%s %s_%s
                                   connect %s_%s: ipfw: lower %s
                                   msg %s_%s: setconf { upstream={ cbs=%d ebs=%d cir=%d greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=%d ebs=%d cir=%d greenAction=1 yellowAction=1 redAction=2 mode=2 } }
                                   EOF>>",
                $tablearg,$tablearg,$shape_type,$user,$shape_type,$user,$tablearg+1,$shape_type,$user,$cbs,$ebs,$shape,$ebs,$cbs,$shape);
                `$cmd`;              #Выполняем команду на сервере
    }
    $shape_inet=20971520;     ###шейп в интернет (байт/с)
    $shape_local=8388608;      ###шейп в локалку (байт/с)
    
    
    
    
    в данном случае шейпы взяты в качестве примера.
    
    Если у вас различные тарифы, то соотвтетственно нужно дописать скрипт,
    чтобы брать из внешних источников (база данных например).
    
    Имя ноды формируется из переменных $shape_type (тип шейпа) и $user
    (логин пользователя).
    
    Для более наглядного примера приведу пример на логине пользователя
    login. Команда исполняемая на сервере будет выглядеть следующим образом:
    
            /usr/sbin/ngctl -f- <<-EOF
            mkpeer ipfw: car 10 upper
            name ipfw:10 inet_login
            connect inet_login: ipfw: lower 11
            msg inet_login: setconf { upstream={ cbs=2621440 ebs=2621440 cir=20971520 greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=2621440 ebs=2621440 cir=20971520 greenAction=1 yellowAction=1 redAction=2 mode=2 } }
            EOF>>
    
    
    Где:
    
    mkpeer ipfw: car 10 upper - создаем ноду для пользователя и подключаем
    ее к модулю ipfw
    
    name ipfw:10 inet_login - именуем ноду (в последствии через это имя
    можно управлять шейпом пользователя на лету).
    
    connect inet_login: ipfw: lower 11 - соединяем хуки исходящего и
    входящего интерфейсов
    
    Рзазберем управляющее сообщение:
    
    msg inet_login: setconf { upstream={ cbs=2621440 ebs=2621440
    cir=20971520 greenAction=1 yellowAction=1 redAction=2 mode=2 }
    downstream={ cbs=2621440 ebs=2621440 cir=20971520 greenAction=1
    yellowAction=1 redAction=2 mode=2 } }
    
    inet_login - имя ноды, куда направляется управляющее сообщение
    cbs - Commited burst size &#8211; размер всплеска (в байтах), по умолчанию равен cir/8.
    ebs - Exceeded/Peak burst size &#8211; превышение размера всплеска (в байтах),
          по умолчанию равен cbs.
    cir - Commited information rate - разрешенная полоса (в байтах/с).
    greenAction - маркер трафика для cbs (man ng_car)
    yellowAction - маркер трафика для ebs (man ng_car)
    redAction - маркер трафика переполнения разрешенной полосы пропускания (man ng_car)
    mode - mode=2 - Аналог Cisco Rate-Limit, mode=3 Аналог Cisco Traffic Shape.
    
    Скрипт DOWN.pl:
    
            #!/usr/bin/perl
            $iface=$ARGV[0];
            $ip=$ARGV[3];
            $user=$ARGV[4];
            $shape_type="inet";
            shutdown_hook($user,$shape_type);
            $shape_type="local";
            shutdown_hook($user,$shape_type);
    
            ###===функция уничтожения нод для шейпа при отключении пользователя===
            sub shutdown_hook{
                     my $hook=sprintf("%s_%s",$shape_type,$user);
                     $cmd=sprintf("/usr/sbin/ngctl shutdown %s:",$hook);
                     `$cmd`;
            }
    
    
    Исполняемая на сервер комманда следующим образом:
    
            /usr/sbin/ngctl shutdown inet_login:
    
    
    Т.е. выключаем соответствующую ноду.
    
    Если таблицы будут выглядеть так:
    
            #:test:~:ipfw table 10 list
            172.16.10.26/32 10
            172.16.10.27/32 30
            172.16.10.28/32 20
    
            #:test:~:ipfw table 20 list
            172.16.10.26/32 5
            172.16.10.27/32 25
            172.16.10.28/32 15
    
    
    То после подключения мы увидим следующую картину:
    
            #:test:~:ngctl show ipfw:
            Name: ipfw Type: ipfw ID: 00000d00 Num hooks: 4
            Local hook Peer name Peer type Peer ID Peer hook
            6 local_login car 00000d3f lower
            5 local_login car 00000d3f upper
            11 inet_login car 00000d3d lower
            10 inet_login car 00000d3d upper
    
    
    или для отдельного шейпа:
    
            #:test:~:ngctl show local_login:
            Name: star_37735-1 Type: car ID: 00000d50 Num hooks: 2
            Local hook Peer name Peer type Peer ID Peer hook
            lower ipfw ipfw 00000d00 6
            upper ipfw ipfw 00000d00 5
    
    
    Осталось прикрутить это к mpd5. Для этого в конфиг mpd5.conf дописываем:
    
            set iface up-script /usr/local/etc/mpd5/UP.pl
            set iface down-script /usr/local/etc/mpd5/DOWN.pl
    
    
    не забудьте указать полный и главное правильный путь до скриптов !
    
    Есть несколько моментов, о которых нужно помнить при построении такой системы:
    Нужно внимательно соблюдать синтаксис ngctl команд, при ошибке или даже лишнем
    пробеле уже может ничего не работать.
    tablearg должен быть уникальным.
    Создание вебсервера для php5 + apache2 + freetds 7.0 и почтового сервера
    postfix/imap на одной машине
    
    Заголовок: Возникла необходимость настроить в корпоративной сети
    отдельную станцию на FreeBSD, для работы веб-сайта и почтового сервера.
    Таким образом, чтобы 
    
    а)сайт полноценно обрабатывал и отображал данные в кириллице,
    находящиеся на удалённом сервере   mssql2005 в локальной сети   
    
    б) модуль php взаимодействовал с графическими библиотеками для чтения
    редакции больших изображений изображений
    
    в) сервер мог предоставлять различные права для работы с ftp различным
    клиентам (системным пользователям).  
    
    Иными словами: Возникла необходимость на системе freebsd 6.3 доставить
    следующие дистрибутивы (я выбрал такую последовательность):
    
    1.openssl
    2.freetds
    3.apache2
    4.postgresql
    5.php5
    6.postfix
    7.ssh2
    8.proftpd
    
    источники :
     http://opennet.ru/base/net/postfix_mail_guide.txt.html
     http://www.freebsd.org/doc/ru_RU.KOI8-R/books/handbook/
     http://www.freetds.org/userguide/config.htm
     http://wiki.centos.org/HowTos/postfix_restrictions
    
    Установка оперативной системы FeeBSD-6.3.
    
    Основы установки системы подробно описаны в документации на сайте http://freebsd.org
    Там же скачивается дистрибутив.
    
    Я ограничился минимальными конфигурациями для инсталяции:
    Во всплывающих окнах инсталяционной программы указал :
    
             Country Selection - Russian Federation
             System Console Keymap - Russian KOI8-R
             Sysinstall main menu  - express
    
    
    Выбираю нужный диск и форматирую его полностью автоматически, не
    вдаваясь в сложности. 
    
    В окне 'Choose distributions' отмечаю опции :
    
            Developer,Kern-developer, User
    
    
    В окне choose installation media выбираю cd и нажимаю ок и ожидаю
    поздравлений  по  завершении инсталяции, после чего отказываюсь от всех
    дополнительных настроечных визитов, выхожу из программы инсталляции,
    соглашаюсь с перезагрузкой и вынимаю диск.
    
    Таким образом получаю систему с минимальными настройками
    
    После перезагрузки ввожу логин: root и получаю полный доступ к
    дальнейшей работе с системой freebsd.
    
    Следующим действием мне необходимо 
    
     а)задать пароль для администратора root
     б)ввести нового супер-пользователя, для работы в системе с корневыми допусками
     в)прописать основные настройки, необходимые для дальнейших инсталляций.
    
    Пароль для администратора root ввожу следующей командой:
    
            # passwd root
            New password: ******
            Retype new password: ******
    
    
    Ввожу нового пользователя коммандой:
    
            # adduser
            Username: kmg
            Full name: kmg
            Uid:
            Login group [kmg]:
            Default group is kmg.Invite kmg into other groups[]: wheel   
    
    
    (группа wheel наделяет пользователя kmg правами суперпользователя, под
    которыми в дальнейшем будет проводиться инсталляции всех модулей)
    
    После чего мне нужно только задать и поддтвердить пароль для нового
    пользователя (все остальные настройки оставляем заданными по умолчанию). 
    
    Теперь нам необходимо прописаться в локальной сети ,открыть доступ к
    интернету и назначить сервер имён.
    
    Для этого
    1) редактирую файл  /etc/rc.conf с помощью утилиты ee
    
            # ee /etc/rc.conf  
    
    
    и вписываю следующие строки
    
            inetd_enable="YES" 
    
    
    выхожу из редакции и захожу в настроечный файл сервера inetd
    
            # ee /etc/inetd.conf
    
    
    мне необходимо запустить ftp службу для скачивания дополнительных
    дистрибутивов в процессе инсталляции (с указанных мной локальных машин
    или из интернета). Для этого я раскомментирую первую строку в данном
    настроечном файле
    
            ftp streem tcp nowait ..........
    
    
    теперь при запуске системы у меня будет запущен сервер ftp
    Выхожу из настройки inetd и проверяю свои сетевые интерфейсы коммандой:
    
            # ifconfig
    
    
    Узнаю, что кроме локального интерфейса lo0 у меня есть ещё сетевой адаптер realtec под именем rl0. Открываю редактором знакомый уже файл
    
            # ee /etc/rc.conf
    
    
    и прописываю локальный адрес для сетевой карты , адрес шлюза для выхода
    в интернет (или данные, указанные провайдером, если машина напрямую
    смотрит в интернет) и имя машины kmg.towar.ru (имеется доменное имя
    towar.ru). Для этого добавляю строки
    
            ifconfig_rl0="inet 192.168.0.2 netmask 255.255.255.0"
            hostname="kmg.towar.ru"
    
    
    сразу оговорюсь, что у меня провайдер выделяет нам кусок подсети из
    нескольких внешних адресов, и настраивает обратную зону так, чтобы
    обратная зона для одного  внешнего адреса точно соответствовала названию
    сайта http://www.towar.ru (необходимо ,например, если  apache  запускается
    с поддержкой ssl), а обратная зона другого врешнего адреса соответсвовала
    хосту почтового сервера mail.towar.ru, который находится на этой же
    машине  ( это для того, чтоб очень строгие сервера
    могли не находили изьян при проверке соответствий данных протокола
    smtp). Таким образом мне нужно прописать на тот же сетевой интерфейс
    ещё 2 внешних ip и попросить провайдера прописать на эти  ip имена
    хостов в  обратной зоне
    
            ifconfig_rl0_alias0="xxx.xxx.xxx.xxx netmask 255.255.255.248"
            ifconfig_rl0_alias1="xxx.xxx.xxx.xxx netmask 255.255.255.248"
    
    
    выхожу из редактора и  редактирую файл для запроса к серверу имён
    
            # ee /etc/resolv.conf 
    
    
    (скорее всего такого файла пока нет - редактор его создаст) у меня есть
    собственный dns server, у кого его нет - должен указать адреса, данные
    провайдером
    
            domain towar.ru
            nameserver 192.168.0.1
    
    
    Перезагружаю машину и вхожу под пользователем kmg, после чего коммандой
    su и указанием пароля для root становлюсь суперпользователем и могу
    продолжать инсталляцию (не забывая, однако, пропинговать что нибудь
    вроде yandex.ru, чтобы убедиться в правильности сетевых настроек и
    доступов). 
    
    Убеждаюсь, что у нас существуют директории /usr/src/sys /usr/ports
    
    если их не существует, то вставляю первый (у меня и единственный)
    инсталляционный диск freebsd и запускаю комманду
    
                # sysinstall
    
    
    в инсталляционном окне нажимаю
    
                Configure 
    
    
     следом  - distributions
     потом отмечаю - ports
     потом - на всякий случай - src - all
    
    (существуют более обоснованные и последовательные методы работы с
    портами и исходными файлами , но для этого определяются задачи, отличные
    от тех, которые я указал в начале статьи)
    
    Для дальнейшего удобства я решил поставить текстовый редактор deco,
    утилиту sudo (для работы с такими программами  posgresql из оболочки nologin)
    и утилиту gmake.
    Ставится она просто из потров
    
                cd /usr/ports/misc/deco && make install clean
                cd /usr/ports/security/sudo && make install clean
                cd /usr/ports/devels/gmake && make install clean
    
    
    Все конфигурационные опции - по умолчанию
    
    Установка OPENSSL
    
    Для того, чтоб не углубляться в конфигурации последующих дистрибутивов
    со своими дополнительными указаниями или исправлениями я решил в самом
    начале поставить openssl (после некоторых безуспешных попыток выполнить
    свои задачи в другом порядке инсталляций).
    
             cd /usr/ports/security/openssl
             make OPENSSL_OVERWRITE_BASE=yes install
    
    
    Установка FREETDS
    -----------------
    
    Необходим прежде всего  для связки php5 и удалённого сервера mysql. Тут
    нужно внимательно изучить возможности конфигурации php5  и  freetds для
    того, чтобы можно было отображать и правильно редактировать большие
    тексты в кириллице на сервере mssql2005 через веб - интерфейс.
    
    Такие как например карточка ростовской фирмы music_star http://towar.ru/ff/sfi~34923_48_138/sk~no-no/s1~/sg~1
    или объявление китайских поставщиков http://www.towar.ru/bull~1044
    конфигурации php-5.2.5 требуют следующего:
    
            ./configure -with-apxs2=/usr/local/apache2/bin/apxs --with-mssql=/usr/local/freetds \
                --with-pgsql=/usr/local --with-gettext=/usr/local --with-iconv-dir=/usr/local \
                --with-libxml-dir=/usr/local --with-gd=/usr/local --with-zlib \
                --with-freetype-dir=/usr/local --enable-gd-native-ttf --with-jpeg-dir=/usr/local \
                --with-png-dir=/usr/local --with-ttf=/usr/local --enable-sockets
    
    
    нахожу в интернете файл php-5.2.5.tar.gz распаковываю, захожу в
    директорию и читаю внимательно ./configure -help | grep (всё что
    касается mssql, текстов, конвертеров, чарсетов, odbs и всего
    сопутсовующего добра), так как мне необходимо сконфигурировать
    freetds  протокола не ниже 7.0 http://www.freetds.org/userguide/choosingtdsprotocol.htm
    и задать в последующей конфигурации параметр
    
            client charset = cp1251
    
    
    Приступаю к установке freetds
    1)нахожу и скачиваю freetds-0.64.tar.gz распаковываю
    
            tar zxvf freetds-0.64.tar.gz 
    
    
    захожу - cd freetds-0.64
    
    2) читаю конфигурации ./configure --help, одновременно сверяясь с описанием
     http://www.freetds.org/userguide/config.htm
    
    3)конфигурирую
    
            ./configure
    
    
     предпочитаю держать все файлы в отдельной папке
    
            --prefix=/usr/local/freetds
    
    
    так же добавляю опции
    
            --with-libiconv-prefix=/usr/local
    
    
    (убеждаюсь, что библиотеки iconv мне необходимы как для php5, так и для
    freetds) поэтому иду в порт и ставлю заранее
    
            cd /usr/ports/converters/iconv && make install clean
           /* cd /usr/ports/converters/libiconv && make install clean */
            --with-tdsver-7.0
            --with-unixodbc=/usr/local
    
    
    (заранее инсталлирую из портов cd  /usr/ports/databases/unixODBC && make install)
    
            --enable-msdblib
            /* --enable-sybase-compat */
    
    
    4)make
    
            make install
    
    
    5)Проверяю:
    
            /usr/local/freetds/bin/tsql -S 192.168.0.5 -p 1433 -U *** -P ******
    
    
    Пока работает -  несколько команд t - sql - читаю каракули с небольшой
    тестовой таблицы, выхожу командой quit
    
    6) изменяю конфигурации :
    захожу в редактор  deco и нахожу файл /usr/local/freetds/etc/freetds.conf
    нахожу опцию   [global] - меняю версию
    
            tds version = 7.0
            client charset = CP1251
    
    
    повторяю проверку согласно пункту 5 - получаю знаки вопроса вместо
    кириллицы - не смущаюсь - выхожу и приступаю к следующей настройке
    
    Установка APACHE2
    
    сервер httpd я устанавливаю в отдельную директорию - /usr/local/apache2
    (в случае неудачи или невнимательности - я просто удаляю данную
    директорию и инсталлирую заново)
    
    1) нахожу скачиваю и  распаковываю файл
    
            tar zxvf httpd-0.61.tar.bz2 
    
    
    2) захожу в созданную директорию и конфигурирую
    
    Опытным путём я заключил, что решения вышеуказанных задач подойдут
    следующие конфигурации.
    
            ./configure --prefix=/usr/local/apache2 --enable-cgi --enable-rewrite \
                --enable-so --enable-shared=max
    
    
    3)make
    
            make install
    
    
    4)и соответственно запускаю
    
            /usr/local/apache2/bin/apachectl start
    
    
    5)захожу снаружи по ip http://192.168.0.2 и получаю дефолтовое
    приветствие сервера apache
    Теперь нужно сделать стартовый файл для сервера apache
    для этого я захожу в директорию
    
            cd /usr/local/etc/rc.d
    
    
    создаю и редактирую файл
    
            ee apache.sh 
    
    
    где пишу следующие строки
    
            #!/bin/sh
            case "$1" in
            start)
            /usr/local/apache2/bin/apachectl start
            ;;
            stop)
            /usr/local/apache2/bin/apachectl stop
            ;;
            esac
            exit 0
    
    
    обращаем данный файл в исполняемую программу
    
            chmod +x apache.sh
    
    
    соответственно редактируем
    
            ee /etc/rc.conf и добавляем туда строку
            apache_enable="YES" - перезагружаем сервер и проверяем запущен ли apache
            ps -ax|grep httpd
    
    
    Установка POSTGRESQL
    
    Установку и настройку базы данных postgresql я выполнил почти  в
    соответсвии с рекоммендациями данной статьи http://opennet.ru/base/net/postfix_mail_guide.txt.html
    
            cd /usr/ports/databases/postgresql80-server
            make install
    
    
    конфигурации по умолчанию
    
            ee /etc/passwd
    
    
    нахожу строку с пользователем pgsql и меняем оболочку /bin/sh на /usr/sbin/nologin
    следующей коммандой запускаю первичную инициализацию базы данных
    
            sudo -u pgsql initdb -D /uasr/local/pgsql/data
    
    
    создаю редактором стартовый файл
    
            cd /usr/local/etc/rc.d
            ee postgresql.sh
    
    
    в него заношу следующие строки
    
            #!/bin/sh
            echo "POSTGRESQL" $1
            /usr/local/bin/sudo -u pgsql /usr/local/bin/pg_ctl -D /usr/local/pgsql/data \ $1
            exit
    
    
    обращаем данный файл в исполняемую программу
    
            chmod +x postgresql.sh
    
    
    перезапускаю машину и проверяю как работают процессы apache и postgresql
    
    если всё работает - можно приступать к  следующей ступени
    
    УстановкаPHP5
    
    задача - удачно сконфигурировать php примерно так:
    
            ./configure
             --with-apxs2=/usr/local/apache2/bin/apxs 
    
    
    сервер apache2 был сконфигурирован с параметром -enable-so
    проверяю ldd /usr/local/apache2/bin/httpd
    
            --with-mssql=/usr/local/freetds 
    
    
    установлен
    
            --with-pgsql=/usr/local 
    
    
    установлен
    
            --with-gettext=/usr/local 
    
    
    проверяю свои подозрения, что библиотека gettext уже имеется
    
             cd /usr/local/lib
             ls *text* 
    
    
    получаю список
    
            --with-iconv-dir=/usr/local 
    
    
    установлен ранее
    
            --with-libxml-dir=/usr/local 
    
    
    иду и устанавливаю cd /usr/ports/textproc && make install clean
    
            ---with-gd=/usr/local 
    
    
    устанавливаю cd /usr/ports/grephics/gd && make config &&
    выбираю опции: X11, FONTCONFIG,ICONV, make install clean
    
            --with-zlib
            --with-ttf
            --enable-gd-native-ttf 
    
            --with-jpeg-dir=/usr/local 
    
    
    устанавливаю cd /usr/ports/graphics/jpeg && make install clean
    
            --with-png-dir=/usr/local 
    
    
    устанавливаю cd /usr/ports/graphics/png && make install clean
    
            --enable-sockets
    
            make && make install
    
    хотя каждую ступеть пришлось последовательно тестировать и изменять,
    подгонять под свои системные требования. 
    
    И ещё
    О правилах ограничения smtp в настройках postfix для работы в
    глобальной сети ничего проще и доступнее пока не  находил чем тут http://wiki.centos.org/HowTos/postfix_restrictions
    
    PS. ssh2 и proftpd я поставил из портов в самую последнюю очередь -
    после того как машина была полностью подготовлена и прописана по сетевым
    интерфейсам
    Введение
    
    Эта статья призвана немного восполнить пробел практически полного отсутствия
    информации о проекте OpenMCU на русском языке. Пару раз эта тема проскакивала здесь
    на opennet.ru и на форуме ixbt.com и, собственно, из этих источников я и узнал
    о существовании OpenMCU :)  А вот, как его все-таки использовать,
    информации было крайне мало и она была неполная. На английском языке ее,
    по-моему, также не густо, лучшее, что я нашел, было в зарубежных списках
    рассылки, опубликованных на http://osdir.com/ml/telephony.openh323.general/ ,
    небольшом мануале на openmcu (man openmcu) и сайте, посвященном GnuGK  http://www.gnugk.org/,
    который, в отличие от OpenMCU, куда лучше документирован.
    Буду очень благодарен за любые замечания и улучшения.
    
    Дистрибутив:
    Я использовал Linux OpenSUSE 10.3, версия ядра 2.6.22.5-31
    
    Версии пакетов:
    openmcu-2.2.0-104 (сервер видеоконференций, использующий протокол H323)
    gnugk-2.2.5-65 (H323 Gatekeeper)
    Используемые библиотеки:
    openh323-1.19.0.1-106
    pwlib-1.10.7-61
    
    Процесс установки описывать не буду, никаких трудностей в нем нет, положим,
    все необходимое уже установлено.
    
    По поводу того, что такое  протокол H323, привратник, MCU и т.д.
    можно почитать, например, Здесь
    и Здесь
    
    Как все это работает?
    Клиент регистрируется у привратника (GnuGK) под именем, скажем,  nm1. Затем набирает
    код выхода на openmcu, например, "02" и привратник соединяет его с сервером видеоконференций (OpenMCU),
    где nm1 ждет остальных участников. Все остальные попадают на конференцию точно так же.
    Для всех собравшихся используется default room  - комната видеоконференции по умолчанию.
    Привратник не является обязательным компонентом, но дает удобную возможность использовать
    короткие символьные имена вместо ip-адресов.  Так, все зарегестрировшиеся у привратника могут
    также вызывать друг друга по имени, например, клиент зарегестрировавшийся, как nm2 может вызвать nm1
    по его имени и организовать с ним видеообщение на 2 участников (point-to-point).
    Тогда openmcu не используется. 
    
    Конфигурация GnuGK:
    /etc/gnugk.ini
    
            [Gatekeeper::Main]
            FourtyTwo=42
            Name=GNU_Gk
            ;EndpointSuffix=_gnugk
            Home=127.0.0.1
            StatusTraceLevel=2
            UseBroadcastListener=0
            TimestampFormat=ISO8601
            EndpointSignalPort=1721
            EncryptAllPasswords=0
            UseMulticastListener=0
            StatusPort=7000		#Порт мониторинга
    
            SignalCallId=1
    
            [GkStatus::Auth]	#Здесь задаются правила доступа к
            #мониторингу GnuGK
            rule=explicit		#Доступ осуществляется на основе ip
            192.168.2.106=allow	#Хост с которого можно мониторить GnuGK
            Shutdown=allow		#Разрешено отключать gnugk в мониторинге
    
            #Самое важное:
            #Описываем постоянные точки подключения, то есть те, которые будут
            #постоянно храниться в регистрационной таблице привратника
    
            [RasSrv::PermanentEndpoints]
            127.0.0.1:1720=mcu;02		#наш mcu 
    
            [RasSrv::GWPrefixes]
            mcu=02			#префикс выхода на него
    
            #Остальное можно не трогать
            [RasSrv::RRQFeatures]
            AcceptEndpointIdentifier=1
            AcceptGatewayPrefixes=1
            OverwriteEPOnSameAddress=1
            IRQPollCount=0
    
            [RasSrv::ARQFeatures]
            CallUnregisteredEndpoints=0
            ArjReasonRouteCallToGatekeeper=0
    
            [RoutedMode]
            GKRouted=1
            H245Routed=1
            CallSignalPort=1721
            AcceptNeighborCalls=1
            AcceptUnregisteredCalls=1
            RemoveH245AddressOnTunneling=0
            RemoveCallOnDRQ=1
            DropCallsByReleaseComplete=1
            SendReleaseCompleteOnDRQ=1
            SupportNATedEndpoints=1
            TranslateFacility=1
    
            [Proxy]
            Enable=1
            ProxyForNAT=1
            RTPPortRange=1024-65535
    
            [RoutingPolicy]
            00=explicit,internal
            02=internal,explicit
            Default=explicit,internal,numberanalysis
    
            [CallTable]
            GenerateNBCDR=0
            GenerateUCCDR=1
    
            [Gatekeeper::Auth]
            FileIPAuth=optional;RRQ
            SQLPasswordAuth=required;RRQ
            SQLAuth=required;ARQ,Setup
    
            [Gatekeeper::Acct]
            SQLAcct=required;start,update,stop
    
    
    Подробное описание каждого из параметров можно найти на http://www.gnugk.org/gnugk-manual.html
    
    Работу GnuGK можно мониторить подключившись к серверу на 7000 порт.
    Например, мой сервер - 192.168.3.2
    
            telnet 192.168.3.2 7000
    
            Version:
            Gatekeeper(GNU) Version(2.2.5) Ext(pthreads=1,radius=1,mysql=0,pgsql=0,firebird=0,large_fd
            set=0,crypto/ssl=1) Build(Sep 25 2007, 22:47:36) Sys(Linux i686 2.6.22.5-31-default)
            GkStatus: Version(2.0) Ext()
            Toolkit: Version(1.0) Ext(basic)
            Startup: Thu, 26 Feb 2009 14:09:41 +0600   Running: 0 days 23:41:38;
    
    
    Конфигурация OpenMCU
    
    OpenMCU по умолчанию хранит свой конфиг в
    
            ~/.pwlib_config/openmcu.ini
    
    
    Поначалу конфига нет в этой директории, чтобы он появился, можно
    подключиться к openmcu через веб-интерфейс (про это - ниже), заполнить
    необходимые поля, нажать Accept и конфиг будет создан.
    
            [Parameters]
            Username=mcu
            Password=*******		#Пароль здесь указывать не надо, это
            #можно сделать через веб-интерфейс, а здесь хранится только хэш
            Log Level=4
            HTTP Certificate=server.pem
            HTTP Port=1420
            Gatekeeper Mode=No gatekeeper	#Не использовать регистрацию у
            #привратника
            #Далее идут различные параметры, связанные с обслуживанием
            #видеоконференции,
            #можно все оставить, как есть, все нормально работает с дефолтовыми
            #параметрами
            Interface Array Size=0
            Enable video=True
            Video frame rate=10
            Video quality=10
            Default room=room101
            Room time limit=0
            Connecting WAV File=/usr/sbin/connecting.wav
            Entering WAV File=/usr/sbin/entering.wav
            Leaving WAV File=/usr/sbin/leaving.wav
            Call log filename=/var/log/openmcu/opemcu.log
            Force split screen video=False
    
    
    Для описания этих параметров читайте man на openmcu. 
    
    Как уже говорилось, настраивать openmcu можно также через web-интерфейс.
    Для этого нужно набрать в браузере https://your-MCU-ip:1420/ 
    
    Доступны следующие опции:
    * Parameters
    * MCU Status
    * Invite user to conference 
    
    С помощью Parametrs можно производить настройку сервера
    В MCU status можно мониторить его текущее состояние. Очень полезная вещь!
    Invite user to conference - отправить пользователю приглашение на конференцию
    (не понял, как это должно работать:))
    
    Для отладки сервисов можно использовать команды
    
            gnugk -c имя_конфига -ttt (trace - расширенный вывод данных)
            openmcu -i имя_конфига  -cx (запускать как обычную программу с выводом данных на экран) 
    
    
    Чтобы сервисы автоматически запускались при старте, надо создать их стартовые скрипты и
    положить их (в зависимости от дистрибутива) в /etc/rc.d/ или /etc/init.d/
    
    Сами скрипты тоже могут отличаться в зависимости от используемого дистрибутива.
    Вообще-то эти скрипты обычно идут вместе с пакетом (или архивом с исходниками)
    программы, но для openmcu он отсутствовал, а для gnugk я немного
    изменил строчку запуска
    
            startproc $OPENGK_BIN -c /etc/gnugk.ini -o  /var/log/gnugk/gnugk.log -t 
    
    
    Скрипт для запуска openMCU я на скорую руку слепил из шаблона для стартовых
    скриптов /etc/init.d/skeleton
    
    
    #!/bin/sh
    #
    #
    # /etc/init.d/openmcu
    #
    ### BEGIN INIT INFO
    # Provides:          openMCU
    # Required-Start:    $network $syslog $remote_fs
    # Should-Start: $time ypbind smtp
    # Required-Stop:     $syslog $remote_fs
    # Should-Stop: $time ypbind smtp
    # Default-Start:     3 5
    # Default-Stop:      0 1 2 6
    # Short-Description: OpenMCU
    # Description:       Start openMCU
    ### END INIT INFO
    # 
    
    FOO_BIN="/usr/sbin/openmcu -d"
    MCU_BIN="/usr/sbin/openmcu"
    
    test -x $MCU_BIN || { echo "$MCU_BIN not installed";
            if [ "$1" = "stop" ]; then exit 0;
            else exit 5; fi; }
    
    . /etc/rc.status
    
    # Reset status of this service
    rc_reset
    
    case "$1" in
        start)
            echo -n "Starting OpenMCU "
            ## Start daemon with startproc(8). If this fails
            ## the return value is set appropriately by startproc.
            /sbin/startproc $FOO_BIN
    
            # Remember status and be verbose
            rc_status -v
            ;;
        stop)
            echo -n "Shutting down OpenMCU"
            ## Stop daemon with killproc(8) and if this fails
            ## killproc sets the return value according to LSB.
    
            /sbin/killproc -TERM $MCU_BIN
    
            # Remember status and be verbose
            rc_status -v
            ;;
        try-restart|condrestart)
            ## Do a restart only if the service was active before.
            ## Note: try-restart is now part of LSB (as of 1.9).
            ## RH has a similar command named condrestart.
            if test "$1" = "condrestart"; then
                    echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
            fi
            $0 status
            if test $? = 0; then
                    $0 restart
            else
                    rc_reset	# Not running is not a failure.
            fi
            # Remember status and be quiet
            rc_status
            ;;
        restart)
            ## Stop the service and regardless of whether it was
            ## running or not, start it again.
            $0 stop
            $0 start
    
            # Remember status and be quiet
            rc_status
            ;;
        force-reload)
            ## Signal the daemon to reload its config. Most daemons
            ## do this on signal 1 (SIGHUP).
            ## If it does not support it, restart the service if it
            ## is running.
    
            echo -n "Reload service OpenMCU "
            ## if it supports it:
            /sbin/killproc -HUP $FOO_BIN
            rc_status -v
    
            ## Otherwise:
            #$0 try-restart
            #rc_status
            ;;
        reload)
            ## Like force-reload, but if daemon does not support
            ## signaling, do nothing (!)
    
            # If it supports signaling:
            echo -n "Reload service OpenMCU "
            /sbin/killproc -HUP $FOO_BIN
            rc_status -v
    
            ## Otherwise if it does not support reload:
            #rc_failed 3
            #rc_status -v
            ;;
        status)
            echo -n "Checking for service OpenMCU "
    
            # NOTE: checkproc returns LSB compliant status values.
            /sbin/checkproc $MCU_BIN
            # NOTE: rc_status knows that we called this init script with
            # "status" option and adapts its messages accordingly.
            rc_status -v
            ;;
        probe)
    
    esac
    rc_exit
    
    
    
    
    Не забудьте назначить скриптам права на выполнение.
    
    Собственно, теперь надо положить соответсвующие ссылки на скрипты в rcN.d,
    то есть для соответствующих уровней запуска.
    Я предпочитаю делать это программой chkconfig
    
            chkconfig openmcu on
            chkconfig gnugk on
    
    
    Теперь все готово для запуска сервисов.
    
            service gnugk start
            service openmcu start
    
    
    В настройках NetMeeting надо выставить Сервис-Параметры - Расширенный вызов-
    Использовать привратника для вызовов и Регистрация моей учетной записи
    (имя учетной записи).
    После активации параметров в правом нижнем углу у него должен появиться значок
    "Есть регистрация у привратника". Теперь набираем наш префикс выхода (02) и
    попадаем на сервер OpenMCU, на экране будет виден соответствующий логотип.
    Все остальные участники, также регистрируясь у привратника и набирая 02, будут
    попадать на нашу конференцию.
    
    Но тут возникает один интересный вопрос. Получается, что наш сервер будет
    обслуживать одновременно только одну видеоконференцию, ту, что в default room.
    А как сделать так, чтобы на одном сервере MCU одновременно проводить несколько
    параллельных конференций?
    
    Именно для этого и используется разделение конференций по комнатам.
    К сожалению, NetMeeting не умеет указывать при вызове желаемую комнату для
    конференции и может попадать только на default room, если она задана.
    Поэтому организовывать различные комнаты мы будем, используя различные префиксы
    выхода на MCU в gnugk.
    
    Например, так:
    /etc/gnugk.ini
    
            [RasSrv::GWPrefixes]
            #Комната 00
            mcu=00
            #Комната 11
            mcu=11
            #Комната 22
            mcu=22
    
    
    Таким образом, при наборе соответствующих префиксов, клиент будет попадать в
    различные комнаты. Например, при наборе 00, openmcu создаст комнату 00, в
    которую и попадет клиент. Остальным участникам конференции также можно выбирать
    нужную комнату, набирая нужный префикс.
    Другим способом выбора комнаты является явное указание ее в запросе следующим
    образом:
    
            "room_name@server_name"
    
    
    NetMeeting эту возможность не поддерживает, поэтому можно использовать другого
    h323 клиента, например, несколько хороших клиентов перечислены здесь:
    http://www.gnugk.org/h323-endpoint.html
    
    В этом случае, можно не использовать регистрацию у привратника, а сразу набирать
    выход на openmcu в адресной строке, например, набираем example@192.168.3.2
    и попадаем на наш openmcu. Аналогично другие клиенты могут указывать свои
    комнаты, отличные от example и  участвовать в отдельной конференции.
    
    Заключение
    
    Число комнат, по идее, ограничено только аппаратными ресурсами вашего сервера.
    Что касается того, сколько максимально участников может одновременно участвовать
    в одной видеоконференции, то я использовал конференции  лишь до 4-х
    участников включительно и могу сказать только, что это работает. Что
    касается большего числа участников, то единственную информацию, которую мне
    удалось найти на этот счет была на http://www.e-bizone.com/e_chinabo_03.htm
    (но,к сожалению, не было возможности проверить, так что за что купил,
    за то и продаю)
    
    You hear the audio from the other users, but only see the video from the
    four users actively talking.
    остановка задачи
    
    Вы хотите получать/проверять почту Gmail используя программу fetchmail
    
    Исходные данные
    
    - у есть почтовый ящик gmail_account@gmail.com
    - вы используете Unix-подобную операционную систему (Linux, FreeBSD, etc...)
    
    
    Наличие необходимых программ
    
    Если программа fetchmail у вас еще не установлена, установите ее одним
    из способов, предусмотренных в вашей операционной системе.
    
    С помощью одной только программы fetchmail можно проверить наличие писем на
    почтовом сервере, но для того чтобы эту почту получить fetchmail
    использует MTA (Mail Transfer Agent) - другую программу. Обычно по
    умолчанию это sendmail, так что проверьте что sendmail тоже установлена.
    Sendmail настраивать не нужно - достаточно настроек по умолчанию.
    
    Для работы с ssl серификатами необходимо наличие пакета openssl.
    
    Быстрый старт - проверка новых сообщений на сервере
    
    В вашем домашнем каталоге создайте файл .fetchmailrc:
    
            $ touch /home/user/.fetchmailrc
    
    
    Установите для него права чтения/записи для владельца и запрет всего остальным:
    
            $ chmod 600 /home/user/.fetchmailrc
    
    
    Важное замечание: так как в этом файле будет пароль к учетной записи
    Gmail, вы должны быть уверены в том, что никто кроме вас не сможет
    посмотреть его содержимое. То есть тот кто имеет непосредственный или
    сетевой доступ к вашему компьютеру а также полномочия вашей учетной
    записи или учетной записи root может узнать ваш пароль Gmail.
    
    Откройте .fetchmailrc в своем любимом текстовом редакторе и создайте
    следующее содержимое:
    
            poll pop.gmail.com
            port 995
            proto POP3
            user 'gmail_account@gmail.com'
            pass 'gmail_password'
            ssl
    
    
    Подразумеваем что у вас есть подключение к Internet, поэтому можно сразу
    проверить наличие на сервере новых сообщений:
    
            $ fetchmail -c
            fetchmail: Ошибка проверки сертификата сервера: unable to get local issuer certificate
            fetchmail: Ошибка проверки сертификата сервера: certificate not trusted
            fetchmail: Ошибка проверки сертификата сервера: unable to verify the first certificate
            1 сообщение для gmail_account@gmail.com на pop.gmail.com (6891 октетов).
    
    
    Опция -c говорит fetchmail не получать почту а только проверить наличие
    новых писем. Мы видим, что в почтовом ящике есть 1 новое сообщение. От
    предупреждений касающихся ssl сертификата избавимся позже - они имеют
    статус предупреждений только и не влияют на функционал. Кстати в
    некоторых версиях fetchmail вы вообще можете их не получить.
    
    Получение сообщений с сервера
    
    Для получения писем с сервера fetchmail использует MTA (Mail Transfer
    Agent), слушающий порт 25 (стандатртный порт mail службы). В качестве
    MTA используем sendmail, так как это вариант по умолчанию для
    большинства дистрибутивов. Если sendmail у вас уже работает как фоновый
    процесс (демон), то выполнив следующую команду, вы получите сообщения с
    сервера (в случае наличия там таковых конечно). Но для ясности настройки
    имеет смысл показать какой будет результат работы fetchmail, если
    sendmail не запущена (параметр -k говорит fetchmail не удалять письма на
    почтовом сервере после их получения):
    
            $ fetchmail -k
    
            fetchmail: Ошибка проверки сертификата сервера: unable to get local issuer certificate
            fetchmail: Ошибка проверки сертификата сервера: certificate not trusted
            fetchmail: Ошибка проверки сертификата сервера: unable to verify the first certificate
            1 сообщение для gmail_account@gmail.com на pop.gmail.com (6891 октетов)
            считывается сообщение gmail_account@gmail.com@gmail-pop.l.google.com:1 из 1 (6891 октетов)...
            fetchmail: сбой подключения к localhost:smtp [127.0.0.1/25]: В соединении отказано.
            fetchmail: Сбой SMTP-подключения к localhost
            fetchmail: Ошибка SMTP-транзакция при выборке из gmail_account@gmail.com@pop.gmail.com и доставке на хост SMTP localhost
            fetchmail: Статус запроса=10 (SMTP)
    
    
    Это значит ваш компьютер отказал в приеме почты на порту 25.
    
    Запускаем sendmail с параметром -bd (переход в режим фонового процесса):
    
            # sendmail -bd
    
    
    Примечание: эту команду необходимо выполнять от пользователя root (или
    использовать для этого sudo), так как только запуск программы с
    полномочиями администратора позволят ей открыть порт 25. При успешном
    старте sendmail молча переходит в фоновую работу, ничего не выводя на
    терминал.
    
    Теперь повторяем запуск fetchmail:
    
            $ fetchmail -k
    
            fetchmail: Ошибка проверки сертификата сервера: unable to get local issuer certificate
            fetchmail: Ошибка проверки сертификата сервера: certificate not trusted
            fetchmail: Ошибка проверки сертификата сервера: unable to verify the first certificate
            1 сообщение для gmail_account@gmail.com на pop.gmail.com (6891 октетов).
            считывается сообщение gmail_account@gmail.com@gmail-pop.l.google.com:1 из 1 (6891 октетов)...... не пропущено
    
    
    Все, сообщение находится в вашем каталоге для почты (по умолчанию это
    обычно /var/spool/mail/user):
    
            $ ls -l /var/spool/mail/user/
            -rw------- 1 user users 7,2K 2008-11-30 02:47 msg.JHE
    
    
    Теперь можете читать его вашей любимой программой для работы с
    сообщениями, например mutt.
    
    Избавимся от предупреждений касающихся ssl сертификата
    
    В вашем домашнем каталоге создайте каталог .sslcerts (это только пример,
    вы можете создать другой каталог в другом месте):
    
            mkdir /home/user/.sslcerts
    
    
    Установите на него права чтения/записи/выполнения для владельца,
    остальным запрет:
    
            chmod 700 /home/user/.sslcerts
    
    
    Получите сертификат Gmail (у вас должен быть установлен пакет программ
    openssl):
    
            openssl s_client -connect pop.gmail.com:995 -showcerts > /home/user/.sslcerts/gmail.pem
    
    
    Откройте файл .sslcerts/gmail.pem в текстовом редакторе и удалите все
    содержимое кроме блока данных, включительно строки '-----BEGIN
    CERTIFICATE-----' и '-----END CERTIFICATE-----'. Таким образом получаем
    содержимое:
    
            -----BEGIN CERTIFICATE-----
            MIIC3TCCAkagAwIBAgIDCDijMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT
            MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0
            aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMDI1MTc1MzE2WhcNMDkxMjI0MTg1MzE2
            WjBoMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
            TW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xFjAUBgNVBAMTDXBv
            cC5nbWFpbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO03QxerFKZV
            8yeomuL4zSl8Pr7hMWnKMMgp/CwhwadeBmL0LQHHbjL/6z/Z59ZQvrztqkwhchA2
            APKzUwRVTyn7Shx6vBqk6oFmTqoOLmY6hbq6l8uVdUv0AfbHwio8CnLpK2+nbuFl
            flPwx1DH0E3grD8+CrH5SmScfTWbDkcXAgMBAAGjga4wgaswDgYDVR0PAQH/BAQD
            AgTwMB0GA1UdDgQWBBTJRG/OFpZt+BV43JM3NshHMjpwazA6BgNVHR8EMzAxMC+g
            LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDAf
            BgNVHSMEGDAWgBRI5mj5K9KylddH2CMgEE8zmJCf1DAdBgNVHSUEFjAUBggrBgEF
            BQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQEFBQADgYEAOKr3mhxtwFCS3J6lbeaf
            3KrHKi935BZkI75sRbON+hog0t2ovcM2i7fxs3xneH8USLsHgfxNBj9tkMogMK/K
            sO/NUVZ/IfyqcNNkp2619qTQXthKRH42JKpAKgNhT1bdno3pxn+eDEpqmU3CE7IP
            HDCjWOK1fGkZ/yFAuTxuxAc=
            -----END CERTIFICATE-----
    
    
    Выполряем хеширование сертификата с помощью c_rehash:
    
            c_rehash /home/user/.sslcerts/
            Doing /home/user/.sslcerts/
            gmail.pem => 7f549ca4.0
    
    
    Получаем отпечаток ключа (fingerprint) сертификата:
    
            shell$ openssl x509 -in /home/user/.sslcerts/gmail.pem -noout -md5 -fingerprint
            MD5 Fingerprint=44:A8:E9:2C:FB:A9:7E:6D:F9:DB:F3:62:B2:9E:F1:A9
    
    
    Теперь добавляем отпечаток ключа и путь к каталогу с сертификатами в
    файл .fetchmailrc, так что теперь он должен быть таким:
    
            poll pop.gmail.com
            port 995
            proto POP3
            user 'gmail_account@gmail.com'
            pass 'gmail_password'
            ssl
            sslcertpath /home/user/.sslcerts
            sslfingerprint "44:A8:E9:2C:FB:A9:7E:6D:F9:DB:F3:62:B2:9E:F1:A9"
    
    
    Все, fetchmail работает без ворчания:
    
            shell$ fetchmail -c
            fetchmail: Для gmail_account@gmail.com на pop.gmail.com почты нет