Участник:Clint/Черновики

Материал из Xgu.ru

Перейти к: навигация, поиск

Черновые заметки Сергея Черепенина.


3084013939314215976-1203278673_1203278718_poltawa.png


Therefore http://www.felipelopezfoundation.org/ Garcinia Cambogia Classification of garcinia cambogia style .

Содержание

[править] Добавление в initrd модулей SATA в Debian

Необходимо:

  • Создать каталог
    /lib/modules/verion_kernel/initrd
  • В него положить необходимые модули
  • Эти модули будут добавлены в initrd командой
mkinitrd -o /boot/initrd.img-2.6.15.2.mod 2.6.15.2
  • Изменить menu.lst
  • Проверить fstab

[править] Пересборка initrd

  • Создаём рабочий каталог
mkdir /tmp/NEW ; cd /tmp/NEW
  • Копируем необходимый образ initrd в каталог /tmp
cp /boot/initrd.img .. 
  • Смотрим что за файл:
file /boot/initrd.img 
/boot/initrd.img: gzip compressed data, was "initrd.img.cpio2", from Unix, last  modified: Thu Aug 10 17:19:31 2006
  • Отсюда видно, что файл сжат программой gzip, распаковываем его:
mv initrd.img initrd.img.gz
gzip -d initrd.img.gz
  • Снова смотрим что за файл:
file initrd.img
initrd.img: ASCII cpio archive (SVR4 with no CRC)
  • Это cpio архив, распаковываем:
cpio -iv < ../initrd.img
  • В каталоге /tmp/NEW будет создано дерево каталогов распакованного образа initrd, в каталог /tmp/NEW/lib копируем необходимые модули:
cp /lib/modules/версия ядра/kernel/drivers/нужный модуль.ko lib/
  • В файле /tmp/NEW/init необходимо добавить стороки для загрузки модуля:
vi init
>> echo "Loading нужный модуль.ko module"
>> insmod /lib/нужный модуль.ko
  • Сжимаем обратно образ. Сначала cpio:
find ./ | cpio -H newc -o > /boot/new-initrd.img
  • Потом gzip:
gzip /boot/new-initrd.img
  • Исправляем записи в конфигурационном файле grub:
vi /boot/grub/grub.conf


[править] Установка монитора виртуальных машин Xen

apt-get install libvncserver-dev bcc bin86 elks-libc zlib1g-dev
libgcrypt11-dev libcrypto++-dev libssl0.9.8 libcurl3-dev
python2.4-devlibxxf86misc-dev libxkbfile-dev qemu bzip2 ntpdate vim patch console-cyrillic
  • Отключение сообщений об ошибке usb-устройств
echo 1 1 1 1 > /proc/sys/kernel/printk

[править] Расходный материал

Из переписки:


> что я сделал?
> 1.apt-get install udev
> 2.в /etc/mkinitrd/mkinitrd.conf дописал yes
> BUSYBOX=yes
> 2а.что в файле /etc/mkinitrd/modules
>
>
> ahci
> ata_piix
> libata
> sata_mv
> sata_nv
> sata_promise
> sata_qstor
> sata_sil24
> sata_sil
> sata_sis
> sata_svw
> sata_sx4
> sata_via
> sata_vsc
> scsi_debug
> scsi_mod
> sd_mod
> sr_mod
>
> 2б.Что в каталоге /lib/modules/2.6.16.13-xen/initrd/
>
> ahci.ko
> ata_piix.ko
> libata.ko
> sata_mv.ko
> sata_nv.ko
> sata_promise.ko
> sata_qstor.ko
> sata_sil24.ko
> sata_sil.ko
> sata_sis.ko
> sata_svw.ko
> sata_sx4.ko
> sata_via.ko
> sata_vsc.ko
> scsi_debug.ko
> scsi_mod.ko
> sd_mod.ko
> sr_mod.ko
>
> 2в.depmod -a 2.6.16.13-xen
>
> 3.mkinitrd -o /boot/initrd-xen-test 2.6.16.13-xen
>
> 4.При попытке загрузится с него происходит та же ошибка - не могу примонтировать root
>
> 5.И теперь:
> mount -o loop -t cramfs /boot/initrd-xen-test /mnt/1
> dd if=/dev/zero of=/tmp/newimage count=31000 bs=512
> mkfs.etx2 /tmp/newimage
> mount -o loop /tmp/newimage /mnt/2
> rsync -auv /mnt/1/ /mnt/2/
> umount /mnt/1
> gzip -9 /tmp/newimage
> cp /tmp/newimage.gz /boot
> reboot
>

[править] Установка и настройка ftp-сервера proftpd с поддержкой MySQL

ОС Debian Etch Установка необходимых пакетов:

apt-get install proftpd mysql-server

Создание баз и таблиц в MySQL:

mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 5.0.45-Debian_1-log Debian etch distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema | 
| mysql              | 
+--------------------+
2 rows in set (0.00 sec)

mysql> create database proftpd;
Query OK, 1 row affected (0.00 sec)

mysql> use proftpd;
Database changed
mysql> CREATE TABLE users (
    -> userid VARCHAR(30) NOT NULL UNIQUE,
    -> passwd VARCHAR(80) NOT NULL,
    -> uid INTEGER UNIQUE,
    -> gid INTEGER,
    -> homedir VARCHAR(255),
    -> shell VARCHAR(255)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TABLE groups (
    -> groupname VARCHAR(30) NOT NULL,
    -> gid INTEGER NOT NULL,
    -> members VARCHAR(255)
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> insert into groups values('ftp','5001','');
Query OK, 1 row affected (0.00 sec)

mysql> insert into users values('test','testftp','5001','5001','/home/ftp/test','/sbin/nologin');
Query OK, 1 row affected (0.00 sec)


mysql> show tables
    -> ;
+-------------------+
| Tables_in_proftpd |
+-------------------+
| groups            | 
| users             | 
+-------------------+
2 rows in set (0.00 sec)

mysql> describe users
    -> ;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| userid  | varchar(30)  | NO   | PRI |         |       | 
| passwd  | varchar(80)  | NO   |     |         |       | 
| uid     | int(11)      | YES  | UNI | NULL    |       | 
| gid     | int(11)      | YES  |     | NULL    |       | 
| homedir | varchar(255) | YES  |     | NULL    |       | 
| shell   | varchar(255) | YES  |     | NULL    |       | 
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> select * from users;
+--------+---------+------+------+----------------+---------------+
| userid | passwd  | uid  | gid  | homedir        | shell         |
+--------+---------+------+------+----------------+---------------+
| test   | testftp | 5001 | 5001 | /home/ftp/test | /sbin/nologin | 
+--------+---------+------+------+----------------+---------------+
1 row in set (0.00 sec)


Настройка proftpd:

egrep -v "^#|\ $" /etc/proftpd/proftpd.conf

Include /etc/proftpd/modules.conf
UseIPv6                         off
ServerName                      "Debian"
ServerType                      standalone
DeferWelcome                    off
MultilineRFC2228                on
DefaultServer                   on
ShowSymlinks                    on
TimeoutNoTransfer               600
TimeoutStalled                  600
TimeoutIdle                     1200
DisplayLogin                    welcome.msg
DisplayFirstChdir               .message
ListOptions                     "-l"
DenyFilter                      \*.*/
Port                            21
MaxInstances                    30
User                            proftpd
Group                           nogroup
Umask                           022  022
AllowOverwrite                  on
<IfModule mod_sql.c>
SQLBackend                      mysql
SQLConnectInfo proftpd@localhost:3306 root rootpass
SQLAuthTypes Backend PlainText
SQLUserInfo users userid passwd uid gid homedir shell
DefaultRoot ~
RequireValidShell off
SQLGroupInfo groups groupname gid members
SQLAuthenticate users groups
SQLLogFile /var/log/proftpd.log
</IfModule>
TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log
<IfModule mod_tls.c>
TLSEngine off
</IfModule>
<IfModule mod_quota.c>
QuotaEngine on
</IfModule>
<IfModule mod_ratio.c>
Ratios on
</IfModule>
<IfModule mod_delay.c>
DelayEngine on
</IfModule>
<IfModule mod_ctrls.c>
ControlsEngine        on
ControlsMaxClients    2
ControlsLog           /var/log/proftpd/controls.log
ControlsInterval      5
ControlsSocket        /var/run/proftpd/proftpd.sock
</IfModule>
<IfModule mod_ctrls_admin.c>
AdminControlsEngine on
</IfModule>


Создание домашнего каталога для ftp пользователя:

sudo mkdir /home/ftp/test
sudo chown 5001:5001 /home/ftp/test
sudo touch /home/ftp/test/test_file

Проверка:

ftp 77.123.137.68
Connected to 77.123.137.68.
220 ProFTPD 1.3.0 Server (Debian) [77.123.137.68]
Name (77.123.137.68:clint): test
331 Password required for test.
Password:
230 User test logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful
150 Opening ASCII mode data connection for file list
-rw-r--r--   1 root     root            0 Aug 19 19:58 test_file
226 Transfer complete.
ftp> quit
221 Goodbye.

[править] Использование стандартной таблицы mysql.user

mysql> use mysql
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              | 
| db                        | 
| func                      | 
| help_category             | 
| help_keyword              | 
| help_relation             | 
| help_topic                | 
| host                      | 
| proc                      | 
| procs_priv                | 
| tables_priv               | 
| time_zone                 | 
| time_zone_leap_second     | 
| time_zone_name            | 
| time_zone_transition      | 
| time_zone_transition_type | 
| user                      | 
+---------------------------+
17 rows in set (0.00 sec)
  • Создание пользователя
create user 'ftptestuser'@'%';
  • Пароль
set password for 'ftptestuser'=PASSWORD('password');
  • Настройка proftpd на использование таблицы mysql.user

База mysql:

 
SQLConnectInfo mysql@localhost:3306 root password

Проверка пароля:

SQLAuthTypes Backend

Так как в таблице mysql.user отсутствуют поля для uid, gid, homedir, shell, то необходимо изменить следующее (если поле shell указано как null, то оно не используется):

SQLDefaultUID 5002
SQLDefaultGID 5002
SQLDefaultHomedir /home/ftp/test2

Таблица user и поля:

SQLUserInfo user user password null null null null

Так как в таблице mysql.user нет информации о группах, то отключаем использование информации о группах:

SQLAuthenticate users
  • Проверка:
ftp 77.123.137.68
Connected to 77.123.137.68.
220 ProFTPD 1.3.0 Server (Debian) [77.123.137.68]
Name (77.123.137.68:clint): ftptestuser
331 Password required for ftptestuser.
Password:
230 User ftptestuser logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is current directory.
ftp> ls
200 PORT command successful
150 Opening ASCII mode data connection for file list
-rw-r--r--   1 root     root            0 Aug 19 22:00 testfile_test2
226 Transfer complete.
ftp> quit
221 Goodbye.
  • Конфиг сервера:
egrep -v "^#|\ $" /etc/proftpd/proftpd.conf

Include /etc/proftpd/modules.conf
UseIPv6                         off
ServerName                      "Debian"
ServerType                      standalone
DeferWelcome                    off
MultilineRFC2228                on
DefaultServer                   on
ShowSymlinks                    on
TimeoutNoTransfer               600
TimeoutStalled                  600
TimeoutIdle                     1200
DisplayLogin                    welcome.msg
DisplayFirstChdir               .message
ListOptions                     "-l"
DenyFilter                      \*.*/
Port                            21
MaxInstances                    30
User                            proftpd
Group                           nogroup
Umask                           022  022
AllowOverwrite                  on

<IfModule mod_sql.c>
SQLBackend                      mysql
SQLConnectInfo mysql@localhost:3306 root password
SQLAuthTypes Backend PlainText
SQLDefaultUID 5002
SQLDefaultGID 5002
SQLDefaultHomedir /home/ftp/test2
SQLUserInfo user user password null null null null
DefaultRoot ~
RequireValidShell off
SQLAuthenticate users
SQLLogFile /var/log/proftpd/proftpd.log
</IfModule>

TransferLog /var/log/proftpd/xferlog
SystemLog   /var/log/proftpd/proftpd.log

<IfModule mod_tls.c>
TLSEngine off
</IfModule>

<IfModule mod_quota.c>
QuotaEngine on
</IfModule>

<IfModule mod_ratio.c>
Ratios on
</IfModule>


<IfModule mod_delay.c>
DelayEngine on
</IfModule>

<IfModule mod_ctrls.c>
ControlsEngine        on
ControlsMaxClients    2
ControlsLog           /var/log/proftpd/controls.log
ControlsInterval      5
ControlsSocket        /var/run/proftpd/proftpd.sock
</IfModule>

<IfModule mod_ctrls_admin.c>
AdminControlsEngine on
</IfModule>

[править] Базовая настройка прокси-сервера squid

[править] Установка и начальная настройка

  • Настройка интерфейсов такова:
# ifconfig

eth0      Link encap:Ethernet  HWaddr AA:00:00:00:00:03
          inet addr:192.168.16.200  Bcast:192.168.16.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2749 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1766 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1656718 (1.5 MiB)  TX bytes:272841 (266.4 KiB)
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:763 errors:0 dropped:0 overruns:0 frame:0
          TX packets:763 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:333837 (326.0 KiB)  TX bytes:333837 (326.0 KiB)
  • Посмотрим, ведется ли прослушивание порта прокси-сервера:
# netstat -lnp | grep :3128 
  • Установка:
# apt-get install squid

Чтение списков пакетов... Готово
Построение дерева зависимостей... Готово
Будут установлены следующие дополнительные пакеты:
  squid-common
Предлагаемые пакеты:
  squidclient squid-cgi logcheck-database resolvconf smbclient
НОВЫЕ пакеты, которые будут установлены:
  squid squid-common
обновлено 0, установлено 2 новых пакетов, для удаления отмечено 0 пакетов, и 47 пакетов не обновлено.
Необходимо скачать 1061kБ архивов.
...
Выбор ранее не выбранного пакета squid-common.
(Чтение базы данных... на данный момент установлено 24580 файлов и каталогов.)
Распаковывается пакет squid-common (из файла .../squid-common_2.6.3-1_all.deb)...
Выбор ранее не выбранного пакета squid.
Распаковывается пакет squid (из файла .../squid_2.6.3-1_i386.deb)...
Настраивается пакет squid-common (2.6.3-1) ...
Настраивается пакет squid (2.6.3-1) ...
Creating squid spool directory structure
2006/10/12 17:00:34| Creating Swap Directories
Restarting Squid HTTP proxy: squid.

Еще раз проверяем прослушивание порта squid:

# netstat -lnp | grep :3128

tcp        0      0 0.0.0.0:3128            0.0.0.0:*               LISTEN     3394/(squid)

Промотрим файл конфигурации:

  • http_port - порт прослушивания, по умолчанию 3128, взможны другие варианты записи, в версии 2.3 можно указывать перед портом имя хоста или IP-адрес:
http_port 3128 
  • cache_mgr - Адрес электроннй почты администратора прокси-сервера, по умолчанию имеет значение webmaster
  • ftp_user - Описание пользователя для анонимного входа
  • hierarchy_stoplist (список строк - через пробел, - при встрече которых в URL, запрос будет направлен сразу напрямую, а не "по соседям"; по-умолчанию - "cgi-bin ?"):
 hierarchy_stoplist cgi-bin ?
  • Постараться не кэшировать эти файлы:
 
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
  • Размер кэша( В ЧЕМ?), количество каталогов первого уровня в каталоге /var/spool/squid и ворого уровня того же каталога
cache_dir ufs /var/spool/squid 100 16 256
  • Настройка логирования:
access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log
cache_store_log none
  • Программа аутентификации и путь к файлу с паролями:
auth_param basic program /usr/lib/squid/ncsa_auth /usr/etc/passwd
  • Ограничение на количество дочерних процессов:
auth_param basic children 5
  • Определение имени хоста и домена, которое будет указываться в заголовке окна аутентификации:
auth_param basic realm Squid proxy-caching web server
  • Оределение времени, в течении которго пара username:password действительны. По соображениям безопасности дефолтное значение 2 часа:
auth_param basic credentialsttl 2 hours
  • Определение чуствительности к регистру в имени пользователя:
auth_param basic casesensitive off
  • Дефолтные настройки определения срока жизни данных кэша squid. Данные описываются регулярными выражениями:
#Suggested default:
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320
 * Запись вида 
refresh_pattern [-i] regex MIN_AGE(В ЧЕМ?) percent MAX_AGE[options]
  • Рекомендуемый минимум access листов:
#Recommended minimum configuration:
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563      # https, snews
acl SSL_ports port 873          # rsync
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443 563     # https, snews
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl Safe_ports port 631         # cups
acl Safe_ports port 873         # rsync
acl Safe_ports port 901         # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
  • И рекомендуемый минимум правил доступа по access листам:
#Recommended minimum configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager
# Only allow purge requests from localhost
http_access allow purge localhost
http_access deny purge
# Deny requests to unknown ports
http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
http_access deny CONNECT !SSL_ports
  • Проверим - отвечает ли на интерфейсах squid:

# telnet 127.0.0.1 3128

Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
^]
telnet> q
Connection closed.


# telnet 192.168.16.200 3128

Trying 192.168.16.200...
Connected to 192.168.16.200.
Escape character is '^]'.
^]
telnet> q
Connection closed.
  • Как видно - всё работает.
  • Проверяем: в настройках internet-browser`a необходимо указать прокси-сервер 127.0.0.1 на порту 3128 - выход в интернет имеется.Если прописать сейчас в качестве прокси-сервера адрес 192.168.16.200:3128 то работать ничего не будет. Это означает, что прокси -сервер в дефолтной конфигурации настроен на access localhost only!

[править] Администрирование прокси-сервера

[править] Разрешение доступа к сети Интернет пользователям сети

Для решения зтой задачи необходимо указвать явно в конфигурационном файле /etc/squid/squid.conf хосты или сети, которым разрешать доступ к Интернет.

  • Например, для раазрешения доступа к сети Интернет сети 192.168.16.0/24 необходимо вписать в /etc/squid/squid.conf следующие строки:
# vi /etc/squid/squid.conf

2577,2578c2577,2579
< #acl our_networks src 192.168.1.0/24 192.168.2.0/24
< #http_access allow our_networks
---
> acl our_networks src 192.168.16.0/24
> http_access allow our_networks

  • Даём:
 
squid -k reconfigure 

и проблема решена.

[править] Парольная аутентификация
  • Если есть необходимость устроить парольную аутентификацию пользователей сети 192.168.16.0/24 то необходимо немного модифицировать конфигурационный файл:
# vi /etc/squid/squid.conf

1799,1803c1799,1803
< #auth_param basic program <uncomment and complete this line>
< #auth_param basic children 5
< #auth_param basic realm Squid proxy-caching web server
< #auth_param basic credentialsttl 2 hours
< #auth_param basic casesensitive off
---
> auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd
> auth_param basic children 5
> auth_param basic realm Squid proxy-caching web server
> auth_param basic credentialsttl 2 hours
> auth_param basic casesensitive off
  • Назначение этих строк описано выше.
  • Кроме этого необходимо:
 - назначить авторизацию acl листу;
 - определить группу пользователей для аутентификации.
# vi /etc/squid/squid.conf

> acl myacl proxy_auth REQUIRED
< http_access allow our_networks
---
> http_access allow our_networks myacl
  • Генерацию пар пользователь-пароль можно выполнить внешней программой htpasswd, которая входит в состав пакета apache2-utils:
htpasswd -c /etc/squid/passwd foo

New password:
Re-type new password:
Adding password for user foo
  • Теперь
     squid -k reconfigure 
    и после настойки броузера все должно работать.


[править] Ограничение доступа отдельным пользователям
  • Если необходимо запретить доступ отельным пользователям (в примере nouser), то необходимо ввести следующие строки в /etc/squid/squid.conf
acl deny_users proxy_auth nouser
http_access deny deny_users 

Или при объединении с другими acl:

acl deny_users proxy_auth nouser
acl no_google url_regex -i search
acl daytime time 08:00-17:00 
http_access deny deny_users no_google daytime

И пользователь nouser не сможет осуществлять поиск через google с 8 до 17 часов

[править] Ограничение доступа на определённые сайты и домены
  • Если существует необходимость ограничить доступ на определенные сайты, то нужно их описать:
# vi /etc/squid/squid.conf

> acl nomailru url_regex -i ^http://mail.ru
> http_access deny nomailru

  • Теперь
 
squid -k reconfigure 
и на mail.ru не зайти.
  • Есть возможность описывать запрещенные сайты группами - по доменам:
vi /etc/squid/squid.conf

50,51c50,53
> acl no_google_search dstdomain .google.com
> http_access deny no_google_search
  • И все попытки поиска в google завершатся неудачей для пользователя.


[править] Блокирование определённого трафика на примере редиректора rejik3
  • Наверняка может возникнуть необходимость блокирования определенного тррфика ( например сайты и файлы mp3 или порнографические сайты). Рассмотрим на примере программы http://rejik.ru/index.html

Инсталляция и настройка на сайте http://rejik.ru/index.html


  • И далее, принятым в операционной системе методом, устанавливаем необходимые программы:
# wget http://rejik.ru/download/redirector-3.2.1.tgz

--17:59:01--  http://rejik.ru/download/redirector-3.2.1.tgz
           => `redirector-3.2.1.tgz'
Распознаётся rejik.ru... 84.252.152.241
Устанавливается соединение с rejik.ru|84.252.152.241|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: 46.022 (45K) [application/x-tar]
100%[====================================>] 46.022        68.29K/s
17:59:02 (68.17 KB/s) - `redirector-3.2.1.tgz' сохранён [46022/46022]

# tar xvzfC redirector-3.2.1.tgz /usr/src

redirector-3.2.1/
redirector-3.2.1/tools/
redirector-3.2.1/tools/benchmark
redirector-3.2.1/tools/IN.gz
redirector-3.2.1/tools/kill-cache
redirector-3.2.1/AUTHORS
redirector-3.2.1/COPYING
redirector-3.2.1/INSTALL
redirector-3.2.1/Makefile
redirector-3.2.1/VERSION
...
redirector-3.2.1/prune_urls.c
redirector-3.2.1/redirect.c
redirector-3.2.1/redirector.c
redirector-3.2.1/redirector.conf.dist
redirector-3.2.1/run_make_cache.c
redirector-3.2.1/vars.h
redirector-3.2.1/write_cache.c
redirector-3.2.1/raw_change.c
redirector-3.2.1/pass.c
redirector-3.2.1/Log

# cd /usr/src/redirector-3.2.1/
# vi Makefile

3,4c3,4
< SQUID_USER=nobody
< SQUID_GROUP=nogroup
---
> SQUID_USER=proxy
> SQUID_GROUP=proxy

# apt-get install libpcre3-dev

Чтение списков пакетов... Готово
Построение дерева зависимостей... Готово
Будут установлены следующие дополнительные пакеты:
  libc6-dev libpcre3 libpcrecpp0 linux-kernel-headers
Предлагаемые пакеты:
  glibc-doc manpages-dev
НОВЫЕ пакеты, которые будут установлены:
  libc6-dev libpcre3-dev libpcrecpp0 linux-kernel-headers
Пакеты, которые будут обновлены:
  libpcre3
...
Распаковывается замена для пакета libpcre3...
Выбор ранее не выбранного пакета libpcrecpp0.
Распаковывается пакет libpcrecpp0 (из файла .../libpcrecpp0_6.7-1_i386.deb)...
Выбор ранее не выбранного пакета libpcre3-dev.
Распаковывается пакет libpcre3-dev (из файла .../libpcre3-dev_6.7-1_i386.deb)...
Настраивается пакет linux-kernel-headers (2.6.17.10-3) ...
Настраивается пакет libc6-dev (2.3.6.ds1-4) ...
Настраивается пакет libpcre3 (6.7-1) ...
Настраивается пакет libpcrecpp0 (6.7-1) ...
Настраивается пакет libpcre3-dev (6.7-1) ..

# make

rm -f pass.o raw_change.o load_cache.o pcre.o parse_input.o init_vars.o check_urls.o run_make_cache.o new_url.o redirect.o err_mes.o now.o get_opt.o parse_urls.o cache2url.o ip.o id.o comparing.o  load_urls.o prune_urls.o write_cache.o need_cache_update.o err_mes.o now.o get_opt.o parse_urls.o cache2url.o ip.o id.o comparing.o  redirector make-cache OUT
gcc -Wall -I/usr/include -I/usr/local/include -I/usr/include/pcre -c pass.c
gcc -Wall -I/usr/include -I/usr/local/include -I/usr/include/pcre -c raw_change.c
raw_change.c: In function ‘raw_change’:
raw_change.c:25: warning: pointer targets in passing argument 1 of ‘strstr’ differ in signedness
raw_change.c:25: warning: pointer targets in passing argument 2 of ‘strstr’ differ in signedness
raw_change.c:25: warning: pointer targets in assignment differ in signedness
raw_change.c:33: warning: pointer targets in passing argument 1 of ‘strlen’ differ in signedness
raw_change.c:34: warning: pointer targets in passing argument 1 of ‘strlen’ differ in signedness
raw_change.c:35: warning: pointer targets in passing argument 1 of ‘strchr’ differ in signedness
...
redirector.c:51: warning: pointer targets in passing argument 1 of ‘fopen’ differ in signedness
redirector.c:53: warning: pointer targets in passing argument 1 of ‘sprintf’ differ in signedness
redirector.c:54: warning: pointer targets in passing argument 1 of ‘printf’ differ in signedness
redirector.c:69: warning: pointer targets in passing argument 1 of ‘fgets’ differ in signedness
redirector.c:78: warning: pointer targets in passing argument 1 of ‘sprintf’ differ in signedness
redirector.c:79: warning: pointer targets in passing argument 1 of ‘err_mes’ differ in signedness
redirector.c:133: warning: pointer targets in passing argument 2 of ‘parse_urls’ differ in signedness
redirector.c:136: warning: pointer targets in passing argument 1 of ‘sprintf’ differ in signedness
redirector.c:137: warning: pointer targets in passing argument 1 of ‘err_mes’ differ in signedness
gcc -Wall -I/usr/include -I/usr/local/include -I/usr/include/pcre -o make-cache make-cache.c -L/lib `pcre-config --libs` load_urls.o prune_urls.o write_cache.o need_cache_update.o err_mes.o now.o get_opt.o parse_urls.o cache2url.o ip.o id.o comparing.o

# make install
mkdir -p /usr/local/rejik3/tools
cp make-cache /usr/local/rejik3
cp redirector /usr/local/rejik3
cp redirector.conf.dist /usr/local/rejik3
echo "#!/bin/sh" > /usr/local/rejik3/tools/check-redirector
echo 'su proxy -c "echo \"http://sex.ru 127.0.0.1/- - GET\" | /usr/local/rejik3/redirector /usr/local/rejik3/redirector.conf;"' >> /usr/local/rejik3/tools/check-redirector
chmod 755  /usr/local/rejik3/tools/check-redirector
echo "#!/bin/sh" > /usr/local/rejik3/tools/set-permissions
echo 'chown -R proxy:proxy /usr/local/rejik3' >> /usr/local/rejik3/tools/set-permissions
chmod 755  /usr/local/rejik3/tools/set-permissions
cp tools/kill-cache /usr/local/rejik3/tools
chmod 755  /usr/local/rejik3/tools/kill-cache
cp tools/benchmark /usr/local/rejik3/tools
chmod 755  /usr/local/rejik3/tools/benchmark
cp tools/IN.gz /usr/local/rejik3/tools
chmod 644 /usr/local/rejik3/tools/IN.gz
chown -R proxy:proxy /usr/local/rejik3
chmod 770 /usr/local/rejik3
chmod 644 /usr/local/rejik3/redirector.conf.dist
chmod 755 /usr/local/rejik3/redirector
chmod 755 /usr/local/rejik3/make-cache

</pre>

  • Необходимо переименовать и поправить файл:
#mv /usr/local/rejik3/redirector.conf.dist /usr/local/rejik3/redirector.conf

#vi /usr/local/rejik3/redirector.conf

< error_log /usr/local/rejik3/redirector.err
< change_log /usr/local/rejik3/redirector.log
---
> error_log /var/log/squid/redirector.err
> change_log /var/log/squid/redirector.log

  • Таким образом настроена система журнализации редиректора.
  • Теперь необходим список сайтов для органиченя доступа пользователей сети:
#wget http://rejik.ru/download/banlists-2.x.x.tgz
-18:03:11--  http://rejik.ru/download/banlists-2.x.x.tgz
           => `banlists-2.x.x.tgz'
Распознаётся rejik.ru... 84.252.152.241
Устанавливается соединение с rejik.ru|84.252.152.241|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: 116.100 (113K) [application/x-tar]
100%[====================================>] 116.100      146.11K/s
18:03:12 (145.75 KB/s) - `banlists-2.x.x.tgz' сохранён [116100/116100]
  • И распаковываем в /usr/local/rejik3/:
# tar xvzfC banlists-2.x.x.tgz /usr/local/rejik3/

banlists/
banlists/porno/
banlists/porno/urls
banlists/banners/
banlists/banners/urls
banlists/banners/pcre
banlists/js/
banlists/js/urls
banlists/mp3/
banlists/mp3/pcre

  • Теперь необходимо поставить, если он еще не установлен в системе, веб-сервер apache:
# apt-get install apache

Чтение списков пакетов... Готово
Построение дерева зависимостей... Готово
Будут установлены следующие дополнительные пакеты:
  apache-common mime-support
Предлагаемые пакеты:
  apache-doc apache-ssl apache-perl
НОВЫЕ пакеты, которые будут установлены:
  apache apache-common mime-support
обновлено 0, установлено 3 новых пакетов, для удаления отмечено 0 пакетов, и 53 пакетов не обновлено.
Необходимо скачать 1270kБ архивов.
...
Настраивается пакет mime-support (3.37-1) ...
Настраивается пакет apache-common (1.3.34-4) ...
Настраивается пакет apache (1.3.34-4) ...
WARNING: local host name (;; connection timed out; no servers could be reached) is not qualified; see cf/README: WHO AM I?
/etc/mail/aliases: 5 aliases, longest 10 bytes, 79 bytes total
Creating config file /etc/apache/httpd.conf with new version
Creating config file /etc/apache/srm.conf with new version
Creating config file /etc/apache/access.conf with new version
Creating config file /etc/apache/modules.conf with new version
Starting apache 1.3 web server....

  • Проверяем:
# netstat -lnp | grep :80

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN     6247/apache
  • И устанавливаем сами странички, которые будут нервировать пользователей:
# wget http://rejik.ru/download/www.tgz
--18:04:54--  http://rejik.ru/download/www.tgz
           => `www.tgz'
Распознаётся rejik.ru... 84.252.152.241
Устанавливается соединение с rejik.ru|84.252.152.241|:80... соединение установлено.
Запрос HTTP послан, ожидается ответ... 200 OK
Длина: 824 [application/x-tar]
100%[====================================>] 824           --.--K/s
18:04:54 (90.81 KB/s) - `www.tgz' сохранён [824/824]
  • Распаковываем в /var/www/:
# tar xvzfC www.tgz /var/www/

www/
www/1x1.gif
www/js.js
www/mp3.html
www/porno.html

Согласно /usr/local/rejik3/redirector.conf:

# mv /var/www/www /var/www/ban

Для корректного отображения символов страничек замены в /etc/apache/httpd.conf

# vi /etc/apache/httpd.conf

838c838,839
< AddDefaultCharset on
---
> AddDefaultCharset off
  • И далее:
# apachectl restart
  • Прописываем в squid наш redirector:
# vi /etc/squid/squid.conf

1519a1520,1522
> url_rewrite_program /usr/local/rejik3/redirector /usr/local/rejik3/redirector.conf
  • Проверяем:
# ls -l /usr/local/rejik3/

итого 100
drwxr-xr-x 6 nobody nogroup  4096 2006-10-12 21:40 banlists
-rwxr-xr-x 1 proxy  proxy   39108 2006-10-12 18:01 make-cache
-rwxr-xr-x 1 proxy  proxy   43897 2006-10-12 18:01 redirector
-rw-r--r-- 1 nobody nogroup  3046 2006-10-12 18:09 redirector.conf
-rw-r--r-- 1 proxy  proxy    3052 2006-10-12 18:01 redirector.conf.dist
drwxr-sr-x 2 proxy  proxy    4096 2006-10-12 18:01 tools
  • Такого быть не должно:
# chown -R proxy:proxy /usr/local/rejik3/
  • И
# ls -l /usr/local/rejik3/

итого 100
drwxr-xr-x 6 proxy proxy  4096 2006-10-12 21:40 banlists
-rwxr-xr-x 1 proxy proxy 39108 2006-10-12 18:01 make-cache
-rwxr-xr-x 1 proxy proxy 43897 2006-10-12 18:01 redirector
-rw-r--r-- 1 proxy proxy  3046 2006-10-12 18:09 redirector.conf
-rw-r--r-- 1 proxy proxy  3052 2006-10-12 18:01 redirector.conf.dist
drwxr-sr-x 2 proxy proxy  4096 2006-10-12 18:01 tools

  • Проверим доступность страничек замены запрещенных веб-сайтов:
#. /usr/local/rejik3/tools/check-redirector 
http://127.0.0.1/ban/porno.html 127.0.0.1/- - GET
  • Теперь не будем запускать squid демоном, а привяжем его к терминалу для отладки:
# squid -d 1 -N

2006/10/12 21:43:57| Starting Squid Cache version 2.6.STABLE3 for i386-debian-linux-gnu...
2006/10/12 21:43:57| Process ID 7486
2006/10/12 21:43:57| With 1024 file descriptors available
2006/10/12 21:43:57| Using epoll for the IO loop
2006/10/12 21:43:57| Performing DNS Tests...
2006/10/12 21:43:57| Successful DNS name lookup tests...
2006/10/12 21:43:57| DNS Socket created at 0.0.0.0, port 32799, FD 5
2006/10/12 21:43:57| Adding domain chubba.net from /etc/resolv.conf
2006/10/12 21:43:57| Adding nameserver 192.168.16.100 from /etc/resolv.conf
2006/10/12 21:43:57| helperOpenServers: Starting 5 'redirector' processes
...
  • Проверяем броузером...
  • Все работает
  • Ctrl+C
2006/10/12 21:44:21| Preparing for shutdown after 3 requests
2006/10/12 21:44:21| Waiting 0 seconds for active connections to finish
2006/10/12 21:44:21| FD 21 Closing HTTP connection
2006/10/12 21:44:22| Shutting down...
2006/10/12 21:44:22| FD 22 Closing ICP connection
2006/10/12 21:44:22| Closing unlinkd pipe on FD 20
2006/10/12 21:44:22| storeDirWriteCleanLogs: Starting...
2006/10/12 21:44:22|   Finished.  Wrote 67 entries.
2006/10/12 21:44:22|   Took 0.0 seconds (376404.5 entries/sec).
2006/10/12 21:44:22| Squid Cache (Version 2.6.STABLE3): Exiting normally.
Проверка работы редиректора
  • И только потом:
#/etc/init.d/squid start
  • Может возникнуть необходимость в добавлении новвых сайтов, обнаруженных Вами вручную в базу данных rejik`a:
#echo mp3.ru  >> /usr/local/rejik3/banlists/mp3/urls
  • Проверка --> см. рис. Проверка работы редиректора


[править] Выбор языка текста сообщений прокси-сервера
  • Для того, чтобы странички ошибок и сообщений прокси-сервера были на русском языке, то можно исправить значение по умолчанию:
# vi /etc/squid/squid.conf

64a65,66
> 
> error_directory /usr/share/squid/errors/Russian-koi8-r


[править] Ограничение скорости скачивания определенного трафика
  • Во-первых - необходимо описать файлы, скорость скачивания которых будет ограничиваться:
acl our url_regex \.iso$ \.avi$ \.mp3$
  • Для организации задержек используются пулы задержек, количество которых определяестя количеством типов файлов.
  • Создание пула --> Запись в /etc/squid/squid.conf:
delay_pools 1
delay_class 1 2
delay_parameters 1 -1/-1 8000/4000
  • В результате был создан пул 1, класса 2 с ограничением каждого пользователя скоростью 4000 байт/сек, причем первые 8000байт cкачиваются на полной скорости
  • И теперь в /etc/squid/squid.conf:
delay_access 1 allow our
delay_access 1 deny all
  • Теперь:
# squid -k reconfigure
  • И проверяем


[править] Организация иерархии запросов и кэширования
  • Для организации иерархии запросов и кэширования исмпользуется директива chache_peer:
cache_peer 10.0.1.1 parent   8080  3130  default login=foo:password no-query
  • То есть порт 8080 родительского прокси-сервера будет доступен через интерфейс 127.0.0.1 порта 3130 локального хоста с именем пользователа foo и password - это пароль. Опция no_query отключает ICP-запросы к родительскому кэшу, опция default сообщает о том,что сервер должен использоваться по умолчанию.
[править] Примерный файл конфигурации прокси-сервера squid

http_port 3128
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
cache_dir ufs /var/spool/squid 100 16 256
access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log
cache_store_log none
hosts_file /etc/hosts
url_rewrite_program /usr/local/rejik3/redirector /usr/local/rejik3/redirector.conf
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563      # https, snews
acl SSL_ports port 873          # rsync
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443 563     # https, snews
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl Safe_ports port 631         # cups
acl Safe_ports port 873         # rsync
acl Safe_ports port 901         # SWAT
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
#acl nomailru url_regex -i ^http://mail.ru
#http_access deny nomailru
#acl no_google_search dstdomain .google.com
#http_access deny no_google_search
acl our_networks src 192.168.16.0/24
acl my_acl proxy_auth REQUIRED
http_access allow our_networks my_acl
http_access allow localhost
http_access deny all
http_reply_access allow all
icp_access allow all
coredump_dir /var/spool/squid
error_directory /usr/share/squid/errors/Russian-koi8-r

[править] Clamav

Черновик

sudo apt-get install clamav clamav-daemon
dpkg -l | egrep 'libcurl3|apache'

ii  apache                            1.3.34-4.1                           versatile, high-performance HTTP server
ii  apache-common                     1.3.34-4.1                           support files for all Apache webservers
ii  apache2-utils                     2.2.3-4                              utility programs for webservers
ii  libcurl3                          7.15.5-1                             Multi-protocol file transfer library
ii  libcurl3-dev                      7.15.5-1                             Transitional package to libcurl3-openssl-dev
ii  libcurl3-gnutls                   7.15.5-1                             Multi-protocol file transfer library
ii  libcurl3-openssl-dev              7.15.5-1                             Development files and documentation for libc


wget http://www.samse.fr/GPL/squidclamav/squidclamav-3.0.tar.gz
sudo tar xvzfC /old/install/squidclamav-3.0.tar.gz /usr/src

Password:
squidclamav/
squidclamav/squidclamav.c
squidclamav/squidclamav.h
squidclamav/clwarn.cgi.de_DE
squidclamav/clwarn.cgi.en_EN
squidclamav/clwarn.cgi.fr_FR
squidclamav/clwarn.cgi.pt_BR
squidclamav/depcomp
squidclamav/.deps/
squidclamav/.deps/lists.Po
squidclamav/.deps/config.Po
squidclamav/.deps/squidclamav.Po
squidclamav/.deps/main.Po
squidclamav/.deps/log.Po
squidclamav/Makefile.orig
squidclamav/aclocal.m4
squidclamav/config.status
squidclamav/log.c
squidclamav/log.h
squidclamav/README
squidclamav/configure
squidclamav/lists.c
squidclamav/lists.h
squidclamav/configure.in
squidclamav/config.guess
squidclamav/install-sh
squidclamav/config.sub
squidclamav/missing
squidclamav/squidclamav.conf.dist
squidclamav/mkinstalldirs
squidclamav/config.c
squidclamav/config.h
squidclamav/Makefile.am
squidclamav/Makefile.in
squidclamav/main.c
squidclamav/config.h.in
squidclamav/clwarn.cgi
squidclamav/paths.h
squidclamav/INSTALL
squidclamav/ChangeLog
squidclamav/COPYING
sudo ./configure

checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables... 
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
checking for a BSD-compatible install... /usr/bin/install -c
checking for main in -lcurl... yes
checking how to run the C preprocessor... gcc -E
checking for egrep... grep -E
checking for ANSI C header files... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking arpa/inet.h usability... yes
checking arpa/inet.h presence... yes
checking for arpa/inet.h... yes
checking fcntl.h usability... yes
checking fcntl.h presence... yes
checking for fcntl.h... yes
checking netdb.h usability... yes
checking netdb.h presence... yes
checking for netdb.h... yes
checking netinet/in.h usability... yes
checking netinet/in.h presence... yes
checking for netinet/in.h... yes
checking for stdlib.h... (cached) yes
checking for string.h... (cached) yes
checking sys/socket.h usability... yes
checking sys/socket.h presence... yes
checking for sys/socket.h... yes
checking sys/timeb.h usability... yes
checking sys/timeb.h presence... yes
checking for sys/timeb.h... yes
checking for unistd.h... (cached) yes
checking for size_t... yes
checking for stdlib.h... (cached) yes
checking for GNU libc compatible malloc... yes
checking for function prototypes... yes
checking whether setvbuf arguments are reversed... no
checking return type of signal handlers... void
checking for ftime... yes
checking for gethostbyname... yes
checking for memset... yes
checking for regcomp... yes
checking for socket... yes
checking for strdup... yes
checking for strspn... yes
checking for strstr... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
sudo make 

make  all-am
make[1]: Entering directory `/usr/src/squidclamav'
if gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -MT config.o -MD -MP -MF ".deps/config.Tpo" -c -o config.o config.c; \
        then mv -f ".deps/config.Tpo" ".deps/config.Po"; else rm -f ".deps/config.Tpo"; exit 1; fi
if gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -MT lists.o -MD -MP -MF ".deps/lists.Tpo" -c -o lists.o lists.c; \
        then mv -f ".deps/lists.Tpo" ".deps/lists.Po"; else rm -f ".deps/lists.Tpo"; exit 1; fi
if gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -MT log.o -MD -MP -MF ".deps/log.Tpo" -c -o log.o log.c; \
        then mv -f ".deps/log.Tpo" ".deps/log.Po"; else rm -f ".deps/log.Tpo"; exit 1; fi
if gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -MT main.o -MD -MP -MF ".deps/main.Tpo" -c -o main.o main.c; \
        then mv -f ".deps/main.Tpo" ".deps/main.Po"; else rm -f ".deps/main.Tpo"; exit 1; fi
if gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -MT squidclamav.o -MD -MP -MF ".deps/squidclamav.Tpo" -c -o squidclamav.o squidclamav.c; \
        then mv -f ".deps/squidclamav.Tpo" ".deps/squidclamav.Po"; else rm -f ".deps/squidclamav.Tpo"; exit 1; fi
gcc  -g -O2   -o squidclamav  config.o lists.o log.o main.o squidclamav.o  -lcurl 
make[1]: Leaving directory `/usr/src/squidclamav'
echo $?
0
sudo make install

make[1]: Entering directory `/usr/src/squidclamav'
test -z "/usr/local/bin" || mkdir -p -- "/usr/local/bin"
  /usr/bin/install -c 'squidclamav' '/usr/local/bin/squidclamav'
make[1]: Цель `install-data-am' не требует выполнения команд.
make[1]: Leaving directory `/usr/src/squidclamav'
sudo cp /usr/src/squidclamav/squidclamav.conf.dist /etc/squidclamav.conf
sudo touch /var/log/squid/squidclamav.log 

sudo chown proxy:proxy /var/log/squid/squidclamav.log

sudo cp /usr/src/squidclamav/clwarn.cgi /usr/lib/cgi-bin/
sudo egrep -v '#|^\ *$' /etc/squid/squid.conf

http_port 3128 
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
broken_vary_encoding allow apache
access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log
hosts_file /etc/hosts
redirect_program /usr/local/bin/squidclamav
redirect_children 15
auth_param basic program /usr/lib/squid/ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern .               0       20%     4320
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny to_localhost
http_access allow localhost
acl myacl proxy_auth REQUIRED
acl our_networks src 192.168.0.0/16 10.0.0.0/16
http_access allow our_networks
acl our_networks2 src 192.168.17.22
http_access allow our_networks2 myacl
redirector_access deny localhost
http_access deny all
http_reply_access allow all
icp_access allow all
cache_mgr clint@net.nt
cache_effective_group proxy
httpd_accel_no_pmtu_disc on
error_directory /usr/share/squid/errors/Russian-koi8-r
coredump_dir /var/spool/squid
sudo egrep -v '#|^\ *$' /etc/clamav/clamd.conf 

TCPSocket 65000
TCPAddr 10.0.17.1
FixStaleSocket true
User clamav
AllowSupplementaryGroups true
ScanMail true
ScanArchive true
ArchiveMaxRecursion 5
ArchiveMaxFiles 1000
ArchiveMaxFileSize 10M
ArchiveMaxCompressionRatio 250
ArchiveLimitMemoryUsage false
ArchiveBlockEncrypted false
MaxDirectoryRecursion 15
FollowDirectorySymlinks false
FollowFileSymlinks false
ReadTimeout 180
MaxThreads 12
MaxConnectionQueueLength 15
StreamMaxLength 10M
LogSyslog false
LogFacility LOG_LOCAL6
LogClean false
LogVerbose false
PidFile /var/run/clamav/clamd.pid
DatabaseDirectory /var/lib/clamav
TemporaryDirectory /tmp
SelfCheck 3600
Foreground false
Debug true
ScanPE true
ScanOLE2 true
ScanHTML true
DetectBrokenExecutables false
MailFollowURLs false
ArchiveBlockMax false
ExitOnOOM false
LeaveTemporaryFiles false
AlgorithmicDetection true
ScanELF true
NodalCoreAcceleration false
IdleTimeout 30
MailMaxRecursion 64
PhishingSignatures true
LogFile /var/log/clamav/clamav.log
LogTime true
LogFileUnlock false
LogFileMaxSize 0
sudo egrep -v '#|^\ *$' /etc/squidclamav.conf

logfile /var/log/squid/squidclamav.log
redirect http://10.0.17.1/cgi-bin/clwarn.cgi
debug 1
force 1
stat 1
clamd_ip 10.0.17.1
clamd_port 65000
timeout 60
regexi ^.*\.txt$
regexi ^.*\.com$
regexi ^.*\.zip$
export http_proxy=http\://10.0.17.1\:3128

echo $http_proxy 
http://10.0.17.1:3128
lynx http://www.eicar.org/download/eicar.com

SquidClamAv 3.0 : Virus detection
     __________________________________________________________________________________________________________________________________

   The requested URL http://www.eicar.org/download/eicar.com
   contains the virus : Eicar-Test-Signature

   This URL can not be dowloaded.

   Origin: 10.0.17.1 / -
     __________________________________________________________________________________________________________________________________

   Powered by SquidClamAv 3.0.



Команды: стрелки - перемещение, '?' - помощь, 'q' - выход, '<-' - назад.
Стрелки: Вверх, Вниз - перемещение. Вправо - переход по ссылке; Влево - возврат.
 H)elp O)ptions P)rint G)o M)Глав экран Q)uit /=поиск [delete]=список истории 


sudo tail -f /var/log/clamav/clamav.log

Thu Jun 14 19:22:23 2007 -> +++ Started at Thu Jun 14 19:22:23 2007
Thu Jun 14 19:22:23 2007 -> clamd daemon 0.90.1 (OS: linux-gnu, ARCH: i386, CPU: i486)
Thu Jun 14 19:22:23 2007 -> Log file size limit disabled.
Thu Jun 14 19:22:23 2007 -> Reading databases from /var/lib/clamav
Thu Jun 14 19:23:13 2007 -> Loaded 125655 signatures.
Thu Jun 14 19:23:13 2007 -> Bound to address 10.0.17.1 on tcp port 65000
Thu Jun 14 19:23:13 2007 -> Setting connection queue length to 15
Thu Jun 14 19:23:13 2007 -> Archive: Archived file size limit set to 10485760 bytes.
Thu Jun 14 19:23:13 2007 -> Archive: Recursion level limit set to 5.
Thu Jun 14 19:23:13 2007 -> Archive: Files limit set to 1000.
Thu Jun 14 19:23:13 2007 -> Archive: Compression ratio limit set to 250.
Thu Jun 14 19:23:13 2007 -> Archive support enabled.
Thu Jun 14 19:23:13 2007 -> Algorithmic detection enabled.
Thu Jun 14 19:23:13 2007 -> Portable Executable support enabled.
Thu Jun 14 19:23:13 2007 -> ELF support enabled.
Thu Jun 14 19:23:13 2007 -> Mail files support enabled.
Thu Jun 14 19:23:13 2007 -> Mail: Recursion level limit set to 64.
Thu Jun 14 19:23:13 2007 -> OLE2 support enabled.
Thu Jun 14 19:23:13 2007 -> PDF support disabled.
Thu Jun 14 19:23:13 2007 -> HTML support enabled.
Thu Jun 14 19:23:13 2007 -> Self checking every 3600 seconds.
Thu Jun 14 19:25:50 2007 -> stream 1278: Eicar-Test-Signature FOUND
Проверка работы редиректора
sudo tail -f /var/log/squid/squidclamav.log

Thu Jun 14 19:22:33 2007 [11748] LOG SquidClamav (PID 11748) started
Thu Jun 14 19:22:33 2007 [11751] LOG SquidClamav (PID 11751) started
Thu Jun 14 19:22:33 2007 [11752] LOG SquidClamav (PID 11752) started
Thu Jun 14 19:22:33 2007 [11753] LOG SquidClamav (PID 11753) started
Thu Jun 14 19:22:33 2007 [11754] LOG SquidClamav (PID 11754) started
Thu Jun 14 19:22:33 2007 [11749] LOG SquidClamav (PID 11749) started
Thu Jun 14 19:22:33 2007 [11756] LOG SquidClamav (PID 11756) started
Thu Jun 14 19:22:33 2007 [11757] LOG SquidClamav (PID 11757) started
Thu Jun 14 19:22:33 2007 [11758] LOG SquidClamav (PID 11758) started
Thu Jun 14 19:22:33 2007 [11755] LOG SquidClamav (PID 11755) started
Thu Jun 14 19:22:33 2007 [11759] LOG SquidClamav (PID 11759) started
Thu Jun 14 19:22:33 2007 [11763] LOG SquidClamav (PID 11763) started
Thu Jun 14 19:22:33 2007 [11764] LOG SquidClamav (PID 11764) started
Thu Jun 14 19:22:33 2007 [11765] LOG SquidClamav (PID 11765) started
Thu Jun 14 19:22:34 2007 [11760] LOG SquidClamav (PID 11760) started
Thu Jun 14 19:25:49 2007 [11748] DEBUG Request:http://www.eicar.org/download/eicar.com 10.0.17.1/- - GET
Thu Jun 14 19:25:49 2007 [11748] DEBUG regex matched: http://www.eicar.org/download/eicar.com
Thu Jun 14 19:25:49 2007 [11748] DEBUG Getting header for url http://www.eicar.org/download/eicar.com
Thu Jun 14 19:25:50 2007 [11748] DEBUG File size is 68.00
Thu Jun 14 19:25:50 2007 [11748] DEBUG Sending STREAM to clamd.
Thu Jun 14 19:25:50 2007 [11748] DEBUG Received port 1278 from clamd.
Thu Jun 14 19:25:50 2007 [11748] DEBUG Trying to connect to clamd [port: 1278].
Thu Jun 14 19:25:50 2007 [11748] DEBUG Scanning data received against clamd stream
Thu Jun 14 19:25:50 2007 [11748] DEBUG Sending data to clamd
Thu Jun 14 19:25:50 2007 [11748] DEBUG Write 68 bytes on 68 to socket
Thu Jun 14 19:25:50 2007 [11748] DEBUG Connection to clamd on port: 1278 closed.
Thu Jun 14 19:25:50 2007 [11748] DEBUG Reading clamd scan result.
Thu Jun 14 19:25:50 2007 [11748] DEBUG received from Clamd: stream: Eicar-Test-Signature FOUND
Thu Jun 14 19:25:50 2007 [11748] LOG Redirecting URL to: http://10.0.17.1/cgi-bin/clwarn.cgi?url=http://www.eicar.org/download/eicar.com&source=10.0.17.1/-&user=-&virus=stream: Eicar-Test-Signature FOUND

Thu Jun 14 19:25:50 2007 [11748] DEBUG End reading clamd scan result.
Thu Jun 14 19:25:50 2007 [11748] STAT Virus Scanning process time   0.108 second(s)
Thu Jun 14 19:25:50 2007 [11748] DEBUG Virus found send redirection to Squid.
Thu Jun 14 19:25:50 2007 [11748] STAT Total process time   0.226 second(s)
sudo apt-get install clamav-testfiles

Чтение списков пакетов... Готово
Построение дерева зависимостей... Готово
НОВЫЕ пакеты, которые будут установлены:
  clamav-testfiles
обновлено 0, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 2 пакетов не обновлено.
Необходимо скачать 157kБ архивов.
После распаковки объем занятого дискового пространства возрастёт на 242kB.
Получено:1 http://debian.org.ua etch/main clamav-testfiles 0.90.1-2 [157kB]
Получено 157kB за 1s (144kB/c)           
Выбор ранее не выбранного пакета clamav-testfiles.
(Чтение базы данных... на данный момент установлено 183726 файлов и каталогов.)
Распаковывается пакет clamav-testfiles (из файла .../clamav-testfiles_0.90.1-2_all.deb)...
Настраивается пакет clamav-testfiles (0.90.1-2) ...
dpkg -L clamav-testfiles

/.
/usr
/usr/share
/usr/share/clamav-testfiles
/usr/share/clamav-testfiles/debugm.c
/usr/share/clamav-testfiles/clam.cab
/usr/share/clamav-testfiles/clam.exe
/usr/share/clamav-testfiles/clam.exe.bz2
/usr/share/clamav-testfiles/clam-v2.rar
/usr/share/clamav-testfiles/clam-v3.rar
/usr/share/clamav-testfiles/clam.zip
/usr/share/doc
/usr/share/doc/clamav-testfiles
/usr/share/doc/clamav-testfiles/AUTHORS
/usr/share/doc/clamav-testfiles/BUGS
/usr/share/doc/clamav-testfiles/FAQ
/usr/share/doc/clamav-testfiles/NEWS.Debian.gz
/usr/share/doc/clamav-testfiles/changelog.Debian.gz
/usr/share/doc/clamav-testfiles/copyright
/usr/share/doc/clamav-testfiles/changelog.gz
/usr/share/doc/clamav-testfiles/README.gz
/usr/share/doc/clamav-testfiles/README.Debian.gz
sudo cp /usr/share/clamav-testfiles/clam.zip /var/www/
lynx http://net.nt/clam.zip

SquidClamAv 3.0 : Virus detection
     __________________________________________________________________________________________________________________________________

   The requested URL http://net.nt/clam.zip
   contains the virus : ClamAV-Test-File

   This URL can not be dowloaded.

   Origin: 10.0.17.1 / -
     __________________________________________________________________________________________________________________________________

   Powered by SquidClamAv 3.0.


Команды: стрелки - перемещение, '?' - помощь, 'q' - выход, '<-' - назад.
Стрелки: Вверх, Вниз - перемещение. Вправо - переход по ссылке; Влево - возврат.
 H)elp O)ptions P)rint G)o M)Глав экран Q)uit /=поиск [delete]=список истории 

[править] Анализ логов прокси-сервера

  • tail -f /var/log/squid/access.log - просмотр в реальном времени процесс определения доступа к ресурсам сети Интернет
  • /var/log/squid/cache.log - логирование процесса кэширования
  • /var/log/squid/redirector.log - журнал работы редиректора
  • /var/log/squid/redirector.err - журнал ошибок редирекора

[править] Доплнительные источники

  • [1] - Squid (кеширующий прокси для http): установка, настройка и использование.
  • [2] - Как не получать рекламы через Internet
  • [3] - squid-faq-rus
  • [4] - Squid: Logfile Analysis

[править] MIMEDefang

Настройка yum

vi /etc/yum.repos.d/asplinux-updates.repo


[updates-released]
name=ASPLinux 11 - $basearch - Updates
# Moscow
#baseurl=http://download.asplinux.ru/$basearch/updates/11/
# Moscow2
#baseurl=http://download2.asplinux.ru/install/ftp/$basearch/updates/11/
# UA-IX only
#baseurl=ftp://ftp.asplinux.com.ua/pub/$basearch/updates/11/

#baseurl=http://download.asplinux.ru/$basearch/updates/11/
baseurl=ftp://ftp.asp-linux.com.ua/pub/$basearch/updates/11/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-asplinux

Далле обновим yum и поставим необходимые пакеты:

yum update yum
yum install clamav.i386
yum install clamav-milter
yum install spamassassin.i386
wget http://mimedefang.org/static/mimedefang-2.57.tar.gz
tar xvzfC ~user/Desktop/mimedefang-2.57.tar.gz /usr/src
cd /usr/src/mimedefang-2.57/redhat/
cp ~user/Desktop/mimedefang-2.57.tar.gz /usr/src/asplinux/SOURCES/mimedefang-2.57.tar.gz

rpmbuild mimedefang.spec
ошибка: Неудовлетворенные зависимости сборки:
        sendmail-devel > 8.12.0 нужен для mimedefang-2.57-1.i386
        perl-MIME-tools нужен для mimedefang-2.57-1.i386
        perl-IO-stringy нужен для mimedefang-2.57-1.i386
        perl-MailTools нужен для mimedefang-2.57-1.i386

yum install sendmail-devel.i386
yum install perl-MIME-tools.noarch
yum install perl-Archive-Zip.noarch
yum install perl-File-Scan.noarch

***
wget http://mailtools.anomy.net/dist/anomy-HTMLCleaner-1.26.tar.gz
tar xvzfC ~user/anomy-HTMLCleaner-1.26.tar.gz /usr/src
mv /usr/src/Anomy /usr/lib/perl5/5.8.6/
***
wget http://search.cpan.org/CPAN/authors/id/M/MH/MHARNISCH/Unix-Syslog-0.100.tar.gz
tar xvzfC ~user/Unix-Syslog-0.100.tar.gz /usr/src/
cd /usr/src/Unix-Syslog-0.100/
perl Makefile.PL
make test
make install
***
vim /usr/src/mimedefang-2.57/redhat/mimedefang.spec
> 129 %define with_antivirus 1
***
rpmbuild -bb mimedefang.spec 
****
rpm -Uhv --force /usr/src/asplinux/RPMS/i386/mimedefang*
ошибка: Неудовлетворенные зависимости:
        perl(Unix::Syslog) нужен для mimedefang-2.57-1.i386
[root@asp:redhat]# rpm -Uhv --nodeps /usr/src/asplinux/RPMS/i386/mimedefang*
Подготовка...     ########################################### [100%]
   1:mimedefang-debuginfo   ########################################### [ 33%]
   2:mimedefang             ########################################### [ 67%]

In order to complete the installation of mimedefang, you will need to add the 
following line to your sendmail mc file:

   INPUT_MAIL_FILTER(`mimedefang', `S=unix:/var/spool/MIMEDefang/mimedefang.sock, F=T, T=S:1m;R:1m;E:5m')

Use the sendmail-cf package to rebuild your /etc/mail/sendmail.cf file and 
restart your sendmail daemon.

   3:mimedefang-contrib     ########################################### [100%]


*******
vi /etc/mail/sendmail.mc
>112 dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
>166 INPUT_MAIL_FILTER(`mimedefang', `S=unix:/var/spool/MIMEDefang/mimedefang.sock, F=T, T=S:1m;R:1m;E:5m')
>167 define(`confINPUT_MAIL_FILTERS', `mimedefang')dnl
****



Что сделано!

[править] Анализ логов прокси-сервера

  • tail -f /var/log/squid/access.log - просмотр в реальном времени процесс определения доступа к ресурсам сети Интернет
  • /var/log/squid/cache.log - логирование процесса кэширования
  • /var/log/squid/redirector.log - журнал работы редиректора
  • /var/log/squid/redirector.err - журнал ошибок редирекора

[править] Доплнительные источники

  • [5] - Squid (кеширующий прокси для http): установка, настройка и использование.
  • [6] - Как не получать рекламы через Internet
  • [7] - squid-faq-rus

[править] MIMEDefang

Настройка yum

vi /etc/yum.repos.d/asplinux-updates.repo


[updates-released]
name=ASPLinux 11 - $basearch - Updates
# Moscow
#baseurl=http://download.asplinux.ru/$basearch/updates/11/
# Moscow2
#baseurl=http://download2.asplinux.ru/install/ftp/$basearch/updates/11/
# UA-IX only
#baseurl=ftp://ftp.asplinux.com.ua/pub/$basearch/updates/11/

#baseurl=http://download.asplinux.ru/$basearch/updates/11/
baseurl=ftp://ftp.asp-linux.com.ua/pub/$basearch/updates/11/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-asplinux

Далле обновим yum и поставим необходимые пакеты:

yum update yum
yum install clamav.i386
yum install clamav-milter
yum install spamassassin.i386
wget http://mimedefang.org/static/mimedefang-2.57.tar.gz
tar xvzfC ~user/Desktop/mimedefang-2.57.tar.gz /usr/src
cd /usr/src/mimedefang-2.57/redhat/
cp ~user/Desktop/mimedefang-2.57.tar.gz /usr/src/asplinux/SOURCES/mimedefang-2.57.tar.gz

rpmbuild mimedefang.spec
ошибка: Неудовлетворенные зависимости сборки:
        sendmail-devel > 8.12.0 нужен для mimedefang-2.57-1.i386
        perl-MIME-tools нужен для mimedefang-2.57-1.i386
        perl-IO-stringy нужен для mimedefang-2.57-1.i386
        perl-MailTools нужен для mimedefang-2.57-1.i386

yum install sendmail-devel.i386
yum install perl-MIME-tools.noarch
yum install perl-Archive-Zip.noarch
yum install perl-File-Scan.noarch

***
wget http://mailtools.anomy.net/dist/anomy-HTMLCleaner-1.26.tar.gz
tar xvzfC ~user/anomy-HTMLCleaner-1.26.tar.gz /usr/src
mv /usr/src/Anomy /usr/lib/perl5/5.8.6/
***
wget http://search.cpan.org/CPAN/authors/id/M/MH/MHARNISCH/Unix-Syslog-0.100.tar.gz
tar xvzfC ~user/Unix-Syslog-0.100.tar.gz /usr/src/
cd /usr/src/Unix-Syslog-0.100/
perl Makefile.PL
make test
make install
***
vim /usr/src/mimedefang-2.57/redhat/mimedefang.spec
> 129 %define with_antivirus 1
***
rpmbuild -bb mimedefang.spec 
****
rpm -Uhv --force /usr/src/asplinux/RPMS/i386/mimedefang*
ошибка: Неудовлетворенные зависимости:
        perl(Unix::Syslog) нужен для mimedefang-2.57-1.i386
[root@asp:redhat]# rpm -Uhv --nodeps /usr/src/asplinux/RPMS/i386/mimedefang*
Подготовка...     ########################################### [100%]
   1:mimedefang-debuginfo   ########################################### [ 33%]
   2:mimedefang             ########################################### [ 67%]

In order to complete the installation of mimedefang, you will need to add the 
following line to your sendmail mc file:

   INPUT_MAIL_FILTER(`mimedefang', `S=unix:/var/spool/MIMEDefang/mimedefang.sock, F=T, T=S:1m;R:1m;E:5m')

Use the sendmail-cf package to rebuild your /etc/mail/sendmail.cf file and 
restart your sendmail daemon.

   3:mimedefang-contrib     ########################################### [100%]


*******
vi /etc/mail/sendmail.mc
>112 dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
>166 INPUT_MAIL_FILTER(`mimedefang', `S=unix:/var/spool/MIMEDefang/mimedefang.sock, F=T, T=S:1m;R:1m;E:5m')
>167 define(`confINPUT_MAIL_FILTERS', `mimedefang')dnl
****



Что сделано!

[править] Временно(взможно) исправлено

В /usr/src/mimedefang-2.57/redhat/mimedefang.spec

%define dir_spool      /var/spool/MIMEDefang
%define dir_quarantine /var/spool/MD-Quarantine
%define dir_log        /var/log/mimedefang
%define user           defang
%define with_antivirus 0

[править] /etc/mail/mimedefang-filter

[root@asp:~]# cat /etc/mail/mimedefang-filter

[править] Описание....

114 sub filter_begin {
115     my($entity) = @_;
116     # ALWAYS drop messages with suspicious chars in headers
117     if ($SuspiciousCharsInHeaders) {
118         md_graphdefang_log('suspicious_chars');
119         action_quarantine_entire_message("Message quarantined because of         suspicious characters in headers");
120         # Do NOT allow message to reach recipient(s)
121         return action_discard();
122     }
123      md_copy_orig_msg_to_work_dir_as_mbox_file();
129      my($code, $category, $action) = message_contains_virus();
132      $FoundVirus = ($category eq "virus");
135      $FoundVirus = ($action eq "quarantine");
137     if ($FoundVirus) {
138         md_graphdefang_log('virus', $VirusName, $RelayAddr);
139         md_syslog('warning', "Discarding because of virus $VirusName");
140         return action_discard();
141     }
142 
143     if ($action eq "tempfail") {
144         action_tempfail("Problem running virus-scanner");
145         md_syslog('warning', "Problem running virus scanner: code=$code,         category=$category, action=$action");
146     }
147 }

[править] Описание

172 sub filter {
173     my($entity, $fname, $ext, $type) = @_;
174 
175     return if message_rejected(); # Avoid unnecessary work
176 
177     # Block message/partial parts
178     if (lc($type) eq "message/partial") {
179         md_graphdefang_log('message/partial');
180         action_bounce("MIME type message/partial not accepted here");
181         return action_discard();
182     }
183 
184     if (filter_bad_filename($entity)) {
185         md_graphdefang_log('bad_filename', $fname, $type);
186         action_quarantine($entity, "A known virus was discovered and del        eted. Virus-scanner messages follow:\n$VirusScannerMessages\n\n");
188     }
190     # eml is bad if it's not multipart
191     if (re_match($entity, '\.eml')) {
192         md_graphdefang_log('non_multipart');
193         action_quarantine($entity, "A known virus was discovered and del        eted. Virus-scanner messages follow:\n$VirusScannerMessages\n\n");
205     return action_accept();
206 }

[править] Описание

224 sub filter_multipart {
225     my($entity, $fname, $ext, $type) = @_;
226 
227     return if message_rejected(); # Avoid unnecessary work
228 
229     if (filter_bad_filename($entity)) {
230         md_graphdefang_log('bad_filename', $fname, $type);
231         action_notify_administrator("A MULTIPART attachment of type $typ        e, named $fname was dropped.\n");
232         action_quarantine($entity, "A known virus was discovered and del        eted. Virus-scanner messages follow:\n$VirusScannerMessages\n\n");
236     # eml is bad if it's not message/rfc822
237     if (re_match($entity, '\.eml') and ($type ne "message/rfc822")) {
238         md_graphdefang_log('non_rfc822',$fname);
239         action_quarantine($entity, "A known virus was discovered and del        eted. Virus-scanner messages follow:\n$VirusScannerMessages\n\n");
241 
242 }
244     # Block message/partial parts
245     if (lc($type) eq "message/partial") {
246         md_graphdefang_log('message/partial');
247         action_bounce("MIME type message/partial not accepted here");
248         return;
249     }
250 
251     return action_accept();
252 }

[править] Описание

266 sub defang_warning {
267     my($oldfname, $fname) = @_;
268     return
269         "An attachment named '$oldfname' was converted to '$fname'.\n" .
270         "To recover the file, right-click on the attachment and Save As\        n" .
271         "'$oldfname'\n";
272 }

[править] Описание

276 sub filter_end {
277     my($entity) = @_;
288     return if message_rejected();
291     if ($Features{"SpamAssassin"}) {
292         if (-s "./INPUTMSG" < 100*1024) {
296             my($hits, $req, $names, $report) = spam_assassin_check();
297             my($score);
298             if ($hits < 40) {
299                 $score = "*" x int($hits);
300             } else {
301                 $score = "*" x 40;
302             }
309             if ($hits >= $req) {
310                 action_change_header("X-Spam-Score", "$hits ($score) $na     mes");
311                 md_graphdefang_log('spam', $hits, $RelayAddr);
314                 action_add_part($entity, "text/plain", "-suggest",
315                                 "$report\n",
316                                 "SpamAssassinReport.txt", "inline");
317             } else {
318                 # Delete any existing X-Spam-Score header?
319                 action_delete_header("X-Spam-Score");
320             }
321         }
322     }
332     md_graphdefang_log('mail_in');
344 }
347 1;


[править] /etc/sysconfig/mimedefang

[root@asp:~]# egrep -v '#|^ *$' /etc/sysconfig/mimedefang
SPOOLDIR=/var/spool/MIMEDefang
SOCKET=$SPOOLDIR/mimedefang.sock
LOG_FILTER_TIME=yes
MX_USER=defang
MX_LOG=yes
LOOPBACK_RESERVED_CONNECTIONS=-1
MX_SOCKET=$SPOOLDIR/mimedefang-multiplexor.sock
MX_MINIMUM=2
ALLOW_NEW_CONNECTIONS_TO_QUEUE=yes
MX_MAXIMUM=10
MX_BUSY=600
SUBFILTER=/etc/mail/mimedefang-filter

[править] /etc/clamd.conf

[root@asp:~]# egrep -v '#|^ *$' /etc/clamd.conf
LogFile /var/log/clamav/clamd.log
LogFileMaxSize 1M
LogTime
LogSyslog
LogVerbose
PidFile /var/run/clamav/clamd.pid
TemporaryDirectory /tmp
DatabaseDirectory /var/lib/clamav
LocalSocket /var/spool/MIMEDefang/clamd.sock
FixStaleSocket
MaxConnectionQueueLength 30
MaxThreads 50
ReadTimeout 300
VirusEvent /usr/local/bin/send_sms 380676666666@2sms.kiyvstar.net "VIRUS ALERT: %v"
User defang
AllowSupplementaryGroups
Debug
LeaveTemporaryFiles
ScanPE
DetectBrokenExecutables
ScanOLE2
ScanMail
MailFollowURLs
ScanHTML
ScanArchive
ArchiveMaxFileSize 10M
ArchiveMaxRecursion 9
ArchiveMaxFiles 1500
ArchiveMaxCompressionRatio 250
ArchiveLimitMemoryUsage
ArchiveBlockEncrypted
ArchiveBlockMax

Перезапускаем:


[root@asp:~]# /etc/init.d/clamd restart
Stopping Clam AV daemon:                                   [ СБОЙ ]
Starting Clam AV daemon: LibClamAV debug: Setting /tmp as global temporary direc
tory
LibClamAV debug: Loading databases from /var/lib/clamav
LibClamAV debug: Loading /var/lib/clamav/daily.cvd
LibClamAV debug: in cli_cvdload()
LibClamAV debug: MD5(.tar.gz) = 2667d3188bb524ca5cb7f0c5fd165be8
LibClamAV debug: Decoded signature: 2667d3188bb524ca5cb7f0c5fd165be8
LibClamAV debug: Digital signature is correct.
LibClamAV debug: in cli_untgz()
LibClamAV debug: Unpacking /tmp/clamav-09d49669922f6331/COPYING
LibClamAV debug: Unpacking /tmp/clamav-09d49669922f6331/daily.db
LibClamAV debug: Unpacking /tmp/clamav-09d49669922f6331/daily.hdb
LibClamAV debug: Unpacking /tmp/clamav-09d49669922f6331/daily.ndb
LibClamAV debug: Unpacking /tmp/clamav-09d49669922f6331/daily.zmd
LibClamAV debug: Unpacking /tmp/clamav-09d49669922f6331/daily.fp
LibClamAV debug: Unpacking /tmp/clamav-09d49669922f6331/daily.info
LibClamAV debug: Loading databases from /tmp/clamav-09d49669922f6331
LibClamAV debug: Loading /tmp/clamav-09d49669922f6331/daily.db
LibClamAV debug: Initializing main node
LibClamAV debug: Initializing trie
LibClamAV debug: Initializing BM tables
LibClamAV debug: in cli_bm_init()
LibClamAV debug: BM: Number of indexes = 63744
LibClamAV debug: Loading /tmp/clamav-09d49669922f6331/daily.hdb
LibClamAV debug: Initializing md5 list structure
LibClamAV debug: Loading /tmp/clamav-09d49669922f6331/daily.ndb
LibClamAV debug: Loading /tmp/clamav-09d49669922f6331/daily.zmd
LibClamAV debug: Loading /tmp/clamav-09d49669922f6331/daily.fp
LibClamAV debug: Loading /var/lib/clamav/main.cvd
LibClamAV debug: in cli_cvdload()
LibClamAV debug: MD5(.tar.gz) = c6c0e5c39b28fdbc7f2e23ce1c5166fc
LibClamAV debug: Decoded signature: c6c0e5c39b28fdbc7f2e23ce1c5166fc
LibClamAV debug: Digital signature is correct.
LibClamAV debug: in cli_untgz()
LibClamAV debug: Unpacking /tmp/clamav-8774734a52b5bbee/COPYING
LibClamAV debug: Unpacking /tmp/clamav-8774734a52b5bbee/main.db
LibClamAV debug: Unpacking /tmp/clamav-8774734a52b5bbee/main.hdb
LibClamAV debug: Unpacking /tmp/clamav-8774734a52b5bbee/main.ndb
LibClamAV debug: Unpacking /tmp/clamav-8774734a52b5bbee/main.zmd
LibClamAV debug: Unpacking /tmp/clamav-8774734a52b5bbee/main.fp
LibClamAV debug: Unpacking /tmp/clamav-8774734a52b5bbee/main.info
LibClamAV debug: Loading databases from /tmp/clamav-8774734a52b5bbee
LibClamAV debug: Loading /tmp/clamav-8774734a52b5bbee/main.db
LibClamAV debug: Loading /tmp/clamav-8774734a52b5bbee/main.hdb
LibClamAV debug: Loading /tmp/clamav-8774734a52b5bbee/main.ndb
LibClamAV debug: Loading /tmp/clamav-8774734a52b5bbee/main.zmd
LibClamAV debug: Loading /tmp/clamav-8774734a52b5bbee/main.fp
                                                           [  ОК  ]

[править] /etc/mail/sendmail.mc


[root@asp:~]# egrep -v '^dnl|^ *$' /etc/mail/sendmail.mc
divert(-1)dnl
include(`/usr/share/sendmail-cf/m4/cf.m4')dnl
VERSIONID(`setup for ASPLinux')dnl
OSTYPE(`linux')dnl
INPUT_MAIL_FILTER(`mimedefang', `S=unix:/var/spool/MIMEDefang/mimedefang.sock, F
=T, T=S:1m;R:1m;E:5m')
define(`confDEF_USER_ID',``8:12'')dnl
define(`confTO_CONNECT', `1m')dnl
define(`confTRY_NULL_MX_LIST',true)dnl
define(`confDONT_PROBE_INTERFACES',true)dnl
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl
define(`ALIAS_FILE', `/etc/aliases')dnl
define(`STATUS_FILE', `/var/log/mail/statistics')dnl
define(`UUCP_MAILER_MAX', `2000000')dnl
define(`confUSERDB_SPEC', `/etc/mail/userdb.db')dnl
define(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn,restrictqrun')dnl
define(`confAUTH_OPTIONS', `A')dnl
define(`confTO_IDENT', `0')dnl
FEATURE(`no_default_msa',`dnl')dnl
FEATURE(`smrsh',`/usr/sbin/smrsh')dnl
FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl
FEATURE(redirect)dnl
FEATURE(always_add_domain)dnl
FEATURE(use_cw_file)dnl
FEATURE(use_ct_file)dnl
FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnl
FEATURE(`access_db',`hash -T<TMPF> -o /etc/mail/access.db')dnl
FEATURE(`blacklist_recipients')dnl
EXPOSED_USER(`root')dnl
DAEMON_OPTIONS(`Port=smtp, Name=MTA')dnl
FEATURE(`accept_unresolvable_domains')dnl
LOCAL_DOMAIN(`localhost.localdomain')dnl
MASQUERADE_DOMAIN(ukr.net)dnl
MAILER(smtp)dnl
MAILER(procmail)dnl


[править] Куда все попадает: /var/spool/MD-Quarantine/

[root@asp:~]# tree /var/spool/MD-Quarantine/
/var/spool/MD-Quarantine/
|-- qdir-2006-10-30-18.11.04-001
|   |-- HEADERS
|   |-- MSG.1
|   |-- PART.1.BODY
|   |-- PART.1.HEADERS
|   |-- RECIPIENTS
|   |-- SENDER
|   `-- SENDMAIL-QID
|-- qdir-2006-10-30-18.11.57-001
|   |-- HEADERS
|   |-- MSG.1
|   |-- PART.1.BODY
|   |-- PART.1.HEADERS
|   |-- RECIPIENTS
|   |-- SENDER
|   `-- SENDMAIL-QID
`-- qdir-2006-10-30-18.15.56-001
    |-- HEADERS
    |-- MSG.1
    |-- PART.1.BODY
    |-- PART.1.HEADERS
    |-- RECIPIENTS
    |-- SENDER
    `-- SENDMAIL-QID

3 directories, 21 files

[править] Просмотр прикрепленных файлов, попавших в карантин:

[root@asp:~]# cat /var/spool/MD-Quarantine/qdir-2006-10-30-18.15.56-001/PART.1.HEADERS 
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="Thunderbird Setup 1.5.0.4.exe"
Content-Transfer-Encoding: base64

и

[root@asp:~]# file /var/spool/MD-Quarantine/qdir-2006-10-30-18.15.56-001/PART.1.BODY 
/var/spool/MD-Quarantine/qdir-2006-10-30-18.15.56-001/PART.1.BODY: PE executable for MS Windows (GUI) Intel 80386 32-bit, UPX compressed

[править] Логи:

less /var/log/maillog

Oct 30 18:15:54 asp sendmail[10055]: k9UGFr4G010055: from=root, size=8558821, class=0, nrcpts=1, msgid=<20061030161552.GA10051@
asp.linux.nt>, relay=root@localhost
Oct 30 18:15:55 asp sendmail[10056]: k9UGFslK010056: from=<root@asp.linux.nt>, size=8558967, class=0, nrcpts=1, msgid=<20061030
161552.GA10051@asp.linux.nt>, proto=ESMTP, daemon=MTA, relay=localhost.localdomain [127.0.0.1]
Oct 30 18:15:56 asp mimedefang.pl[9772]: MDLOG,k9UGFslK010056,bad_filename,Thunderbird Setup 1.5.0.4.exe,application/octet-stre
am,<root@asp.linux.nt>,<user@asp.linux.nt>,re
Oct 30 18:15:56 asp mimedefang.pl[9772]: MDLOG,k9UGFslK010056,mail_in,,,<root@asp.linux.nt>,<user@asp.linux.nt>,re
Oct 30 18:15:57 asp mimedefang.pl[9772]: filter: k9UGFslK010056:  quarantine=1
Oct 30 18:15:57 asp sendmail[10056]: k9UGFslK010056: Milter change: header Content-Type: from multipart/mixed; boundary="fdj2Rf
SjLxBAspz7" to multipart/mixed; boundary="fdj2RfSjLxBAspz7"
Oct 30 18:15:57 asp sendmail[10056]: k9UGFslK010056: Milter change: header MIME-Version: from 1.0 to 1.0
Oct 30 18:15:57 asp sendmail[10056]: k9UGFslK010056: Milter change: header Content-Disposition: from inline to inline
Oct 30 18:15:57 asp sendmail[10056]: k9UGFslK010056: Milter message: body replaced
Oct 30 18:15:58 asp sendmail[10056]: k9UGFslK010056: Milter add: header: X-Scanned-By: MIMEDefang 2.57 on 192.168.15.150
Oct 30 18:15:58 asp sendmail[10055]: k9UGFr4G010055: to=user@asp.linux.nt, ctladdr=root (0/0), delay=00:00:05, xdelay=00:00:04,
 mailer=relay, pri=8588821, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (k9UGFslK010056 Message accepted for delivery)
Oct 30 18:15:59 asp sendmail[10059]: k9UGFslK010056: to=<user@asp.linux.nt>, ctladdr=<root@asp.linux.nt> (0/0), delay=00:00:05,
 xdelay=00:00:01, mailer=local, pri=8613319, dsn=2.0.0, stat=Sent

[править] После рестарта mimedefang`a все остается

[править] nt-fbsdnet


[править] Эталонная модель OSI

При написании статьи использовались следующие материалы: Модель ISO/OSI Сетевая модель OSI

Эталонная модель OSI


Уровень OSI Протоколы
Прикладной NFS, IMAP, POP3, SMB
Представления HTTP/HTML, XML, FTP, Telnet, SMTP, NCP
Сеансовый ASP, NetBIOS, SSL, TLS
Транспортный TCP, UDP, NetBEUI, SMB, TFTP
Сетевой IP, IPv6, ICMP, IGMP, IPX, NetBEUI, IPSec, ARP, RARP, DHCP, BootP
Канальный WiFi, PPTP
Физический ISDN, T-carrier (T1, E1), модификации стандарта Ethernet: 10BASE-T, 10BASE2, 10BASE5, 100BASE-TX, 100BASE-FX, 100BASE-T, 1000BASE-T, 1000BASE-TX, 1000BASE-SX


[править] Прикладной уровень

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

[править] Уровень представления

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

[править] Сеансовый уровень

На этом уровне осуществляется контроль диалога между устройствами. Служит для организации связи в трёх режимах:

  • симплексный;
  • полудуплексный;
  • дуплексный.

Сеанс связи имеет 3 фазы:

  • фаза установления связи: устройства согласовывают межлу собой параметры связи и протоколы;
  • фаза передачи данных: узлы вступают в диалог и обмениваются информациеий;
  • завершения сеанса.

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

На практике редко такие функции выделяются в отдельный уровень - обычно они встраиваются в прикладной и объединяются в одном протоколе прикладного уровня.

[править] Транспортный уровень

На сетевом уровне нет никаких гарантий, что данные поступят в том виде, в котором они отправлялись - пакеты могут быть повреждены, перемешаны или повреждены. Кроме того, на сетевом уровне отсутствует информация о том, какому процессу на хосте предназначаются данные — он знает только об адресе самого хоста. Транспортный уровень решает все эти проблемы — он организует надежную доставку данных между процессами. Транспортный уровень обеспечивает надежную доставку данных с использованием подтверждения приема, нумерации байтов в канале и других специальных решений. Для адресации процесса в пределах компьютера используется номер порта. Существует два вида доставки, которые реализуются на этом уровне:

  • - гарантированная
  • - негарантированная
При гарантированной доставке транспортный уровень обрабатывает ошибки двумя способами:
    • - сообщение на более высокие уровни о наличии ошибок
    • - самостоятельная отправка испорченных пакетов

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

[править] Сетевой уровень

Сетевой уровень служит для создания единой транспортной системы, объединяющей несколько сетей, причем эти сети могут использовать совершенно различные принципы работы, обладать произвольной структурой. На сетевом уровне термин сеть означает совокупность компьютеров, которые могут обмениваться между собой данными на канальном уровне. Внутри сети проблема доставки данных полностью решается канальным уровнем, а при передаче данных за пределы сети обязательно включается сетевой уровень. Сети соединены между собой маршрутизаторами — устройствами, которые передают данные из одной сети в другую на основании известных им таблиц маршрутизации. Последовательность маршрутизаторов, через которые должен пройти пакет по пути от отправителя к получателю, образует маршрут. Маршрут не известен заранее, он строится по мере прохождения пакета каждым маршрутизатором. Проблема выбора наилучшего маршрута для пакета называется маршрутизацией (routing).

[править] Канальный уровень

Этот уровень предназначен для обеспечения взаимодействия сетей на физическом уровне и контроля за ошибками, которые могут возникнуть. Полученные с физического уровня данные он упаковывает в кадры данных, проверяет на целостность, если нужно исправляет ошибки и отправляет на сетевой уровень. Канальный уровень может взаимодействовать с одним или несколькими физическими уровнями, контролируя и управляя этим взаимодействием. Спецификация IEEE 802 разделяет этот уровень на 2 подуровня — MAC (Media Access Control) регулирует доступ к разделяемой физической среде, LLC (Logical Link Control) обеспечивает обслуживание сетевого уровня. На этом уровне работают коммутаторы, мосты и сетевые адаптеры. В программировании этот уровень представляет драйвер сетевой платы, в операционных системах имеется программный интерфейс взаимодействия канального и сетевого уровня между собой, это не новый уровень, а просто реализация модели для конкретной ОС.

[править] Физический уровень

Самый нижний уровень модели, предназначен непосредственно для передачи потока данных. Этот уровень имеет дело с передачей битов по физическим каналам, таким, например, как коаксиальный кабель, витая пара или оптоволоконный кабель. К этому уровню имеют отношение характеристики физических сред передачи данных, такие как полоса пропускания, помехозащищенность, волновое сопротивление и другие. На этом же уровне определяются характеристики электрических сигналов, такие как требования к фронтам импульсов, уровням напряжения или тока передаваемого сигнала, тип кодирования, скорость передачи сигналов. Кроме этого, здесь стандартизуются типы разъемов и назначение каждого контакта. На этом уровне работают концентраторы и повторители (ретрансляторы) сигнала.


[править] Стек протоколов TCP/IP

Структура стека протоколов TCP/IP

Стек TCP/IP, называемый также стеком DoD и стеком Internet, является одним из наиболее популярных и перспективных стеков коммуникационных протоколов. Стек был разработан по инициативе Министерства обороны США (Department of Defence, DoD) более 20 лет назад для связи экспериментальной сети ARPAnet с другими сателлитными сетями как набор общих протоколов для разнородной вычислительной среды. Большой вклад в развитие стека TCP/IP внес университет Беркли, реализовав протоколы стека в своей версии ОС UNIX. Широкое распространение ОС UNIX привело и к широкому распространению протокола IP и других протоколов стека. На этом же стеке работает всемирная информационная сеть Internet. Так как стек TCP/IP был разработан до появления модели взаимодействия открытых систем ISO/OSI, то, хотя он также имеет многоуровневую структуру, соответствие уровней стека TCP/IP уровням модели OSI достаточно условно.

[править] Уровень IV (Network Access)

Как видно из рисунка, физический и канальный уровни модели OSI объединены в VI уровень стека TCP/IP. Этот уровень в протоколах TCP/IP не стандартизирован, но поддерживает все популярные стандарты физического и канального уровня: для локальных сетей это Ethernet, Token Ring, FDDI, Fast Ethernet, 100VG-AnyLAN, для глобальных сетей - протоколы соединений "точка-точка" SLIP и PPP.

[править] Ни туда - ни сюда протоколы

[править] Протокол ARP (Address Resolution Protocol)

Любое устройство, подключенное к локальной сети (Ethernet, FDDI и т.д.), имеет уникальный физический сетевой адрес, заданный аппаратным образом. 6-байтовый Ethernet-адрес выбирает изготовитель сетевого интерфейсного оборудования из выделенного для него по лицензии адресного пространства. Если у машины меняется сетевой адаптер, то меняется и ее Ethernet-адрес.

Формат Ethrnet-адреса (или MAC-адреса) имеет следующий формат: MAC-адрес всегда записывается в виде последовательности из 12 шестнадцатеричных цифр (2 числа - 1 байт)

ff:ff:ff:ff:ff:ff

    где: первые три байта указывают на произодителя (Vendor ID), 
          последние три байта - уникальная последовательность   

Узнать производителя сетевого адаптера по Vendor ID его MAC-адреса можно на сайте http://standards.ieee.org/regauth/oui/oui.txt|standards.ieee.org

MAC-адреса формируют основу сетей на канальном уровне, которую используют протоколы более высокого (сетевого) уровня. Для преобразования MAC-адресов в адреса сетевого уровня и обратно применяются специальные протоколы (например, ARP и RARP в сетях TCP/IP).

Когда фрейм Ethernet отправляется от одного хоста по локальной сети к другому, по его 48-битному Ethernet адресу определяется, к какому интерфейсу он должен быть доставлен. Драйвер сетевой платы никогда не смотрит на IP адрес назначения в IP датаграмме.

Другими словами возникает необходимость установить соответствие между двумя различными формами адресов: 32-битными IP адресами и каким-либо типом адресов канального уровня.

официальная спецификация ARP находится в стандарте RFC 826.


[править] Формат ARP-пакета
Формат ARP-запроса
  • Два первых поля в Ethernet заголовке - поля источника и назначения Ethernet. Специальный адрес назначения Ethernet, состоящий из всех единиц, означает широковещательный адрес. Фреймы с таким адресом будут получены всеми Ethernet интерфейсами на кабеле.
  • Двухбайтовый тип фрейма (frame type) Ethernet указывает, данные какого типа, пойдут следом. Для ARP запроса или ARP отклика это поле содержит 0x0806.
  • Поле hard type указывает на тип аппаратного адреса. Для Ethernet это значение равно единице. Prot type указывает тип адреса протокола, к которому будет приведено соответствие. Для IP адресов используется значение 0x0800. По своему целевому назначению это значение соответствует полю типа во фрейме Ethernet, который содержит IP датаграмму.
  • Два следующих однобайтных поля, hard size и prot size, указывают на размеры в байтах аппаратного адреса и адреса протокола. В ARP запросах и откликах они составляют 6 для Ethernet и 4 для IP адреса
  • Поле op указывает на тип операции: ARP запрос (значение устанавливается в 1), ARP отклик (2), RARP запрос (3) и RARP отклик (4). Это поле необходимо, так как поля типа фрейма (frame type) одинаковы для ARP запроса и ARP отклика.
  • Следующие четыре поля: аппаратный адрес отправителя (Ethernet адрес в данном примере), адрес протокола (IP адрес), аппаратный адрес назначения и адрес протокола назначения. Обратите внимание, что в данном случае происходит некоторое дублирование информации: аппаратный адрес отправителя может быть получен как из Ethernet заголовка, так и из ARP запроса.

Для ARP запроса все поля заполнены, за исключением аппаратного адреса назначения. Когда система получает ARP запрос, который предназначается ей, она вставляет свой аппаратный адрес, меняет местами адреса источника и назначения, устанавливает поле op в значение 2 и отправляет отклик.

[править] Протокол RARP

Обратный протокол определения адреса

Когда загружается система с локальным диском, она обычно получает свой IP адрес из конфигурационного файла, который считывается с диска. Однако для систем, не имеющих диска, таких как X терминалы или бездисковые рабочие станции, требуются другой способ определения собственного IP адреса.

Каждая система в сети имеет уникальный аппаратный адрес, который назначается производителем сетевого интерфейса (сетевой платы). Принцип работы RARP заключается в том, что бездисковая система может считать свой уникальный аппаратный адрес с интерфейсной платы и послать RARP запрос (широковещательный фрейм в сеть), где потребует кого-нибудь откликнуться и сообщить IP адрес (с помощью RARP отклика).

Несмотря на то что концепция довольно проста, ее реализация как правило значительно сложнее чем ARP, который был описан в выше. Официальная спецификация RARP находится в RFC 903.

[править] Формат пакета RARP

Формат пакета RARP практически идентичен пакету ARP (см. рисунок выше). Единственное отличие заключается в том, что поле тип фрейма (frame type) для запроса или отклика RARP установлено в 0x8035, а поле op имеет значение 3 для RARP запроса и значение 4 для RARP отклика.

RARP запрос является широковещательным, а RARP отклик обычно персональный.

[править] Протокло Bootp

При использовании RARP возникает две проблемы: (1) единственное, что можно узнать, это IP адрес, и (2) так как RARP использует широковещательный запрос на канальном уровне, запросы RARP не перенаправляются маршрутизаторами (поэтому RARP сервер должен находиться в каждой физической сети). В этой главе мы опишем альтернативный метод загрузки бездисковых систем, который называется протоколом загрузки (BOOTP - Bootstrap Protocol).

BOOTP использует UDP и обычно используется совместно с TFTP (глава 15). Официальная спецификация BOOTP приведена в RFC 951 [Croft and Gilmore 1985], пояснения даются в RFC 1542 [Wimer 1993].

[править] Формат пакета BOOTP
Формат 300-байтного BOOTP запроса и отклика


  • Код операции (opcode) равен 1 для запроса и 2 для отклика.
  • Поле типа аппаратного адреса (hardware type) равно 1 для Ethernet 10 Мбит/сек, это же значение находится в поле с таким же именем в ARP запросе или отклике
  • Счетчик пересылок (hop count) устанавливается клиентом в 0, однако может быть использован уполномоченным сервером
  • Идентификатор транзакции (transaction ID) - 32-битное целое число, которое устанавливается клиентом и возвращается сервером. Оно позволяет клиенту сопоставить отклик с запросом. Клиент устанавливает в это поле случайное число для каждого запроса.
  • В поле количество секунд (number of seconds) клиент записывает время, когда он предпринял первую попытку загрузиться. На основании значения этого поля вторичный сервер делает вывод о том, что первичный сервер не доступен. (Вторичный сервер делает подобный вывод если величина в поле количества секунд достигла определенного значения.)
  • Если клиент уже знает свой IP адрес, он заполняет поле IP адрес клиента (client IP address). Есле нет - клиент устанавливает это значение в 0. В последнем случае сервер вставляет в поле ваш IP адрес (your IP address) IP адрес клиента. Поле IP адрес сервера (server IP address) заполняется сервером. Если используется уполномоченный сервер, он заполняет IP адрес шлюза (gateway IP address).
  • Клиент должен установить свой аппаратный адрес клиента (client hardware address). Это то же значение, которое находиться в заголовке Ethernet и в поле UDP датаграммы, благодаря чему оно становится доступным любому пользовательскому процессу (например, серверу BOOTP), который получил датаграмму. Обычно процессу, работающему с UDP датаграммами, сложно или практически невозможно определить значение, находящееся в поле заголовка Ethernet датаграммы, в которой передается UDP датаграмма.
  • Имя хоста сервера (server hostname) это строка, которая заполняется сервером (не обязательно). Сервер также может заполнить поле имени загрузочного файла (boot filename). В это поле заносится полный путь к файлу, который используется при загрузке.
  • Область производителя (vendor-specific) используется для различных расширений BOOTP.

[править] Уровень III (Inernet)

К уровню межсетевого взаимодействия относятся и все протоколы, связанные с составлением и модификацией таблиц маршрутизации, такие как протоколы сбора маршрутной информации RIP (Routing Internet Protocol) и OSPF (Open Shortest Path First), а также протокол межсетевых управляющих сообщений ICMP (Internet Control Message Protocol). Последний протокол предназначен для обмена информацией об ошибках между маршрутизатором и шлюзом, системой-источником и системой-приемником, то есть для организации обратной связи. С помощью специальных пакетов ICMP сообщается о невозможности доставки пакета, о превышении времени жизни или продолжительности сборки пакета из фрагментов, об аномальных величинах параметров, об изменении маршрута пересылки и типа обслуживания, о состоянии системы и т.п.

Двумя главными функциями этого уровня являются:

  • маршрутизация
  • обеспечение единого сетевого интерфейса для верхних уровней

Ни один из протоколов других уровней не имеет отношения к маршрутизации. Эта сложная иважная процедура выполняется именно на Internet уровне протоколом с такимже названием Internet Protocol. Другие протоколы этого уровня служат лишь для поддержки IP. Протокол IP просматривает адреса всех IP-пакетов, а затем с помощью протокола маршрутизации определяет следующий пункт назначения конкретного пакета, выбирая для него лучший маршрут.

Второй важной функцией уровня Internet является создание единого сетевого интерфейса для протоколов верхних уровней. Без него создателям програмного обеспечения необходимо было бы включать в каждое приложение програмные методы для каждого отличающегося от других протокола сетевого доступа, что привело бы к созданию различных версий каждого приложения - для Ethernet, Token Ring и т.д. Вместо этого IP создает единый сетевой интерфейс, обеспечивающий совмесную работу множества протоколов сетевого доступа.

[править] Протокол RIP

[править] Протокол (E)IGRP

[править] Протокол OSPF

[править] Протокол IP

[править] IP-датаграмма
Формат IP датаграммы

На рисунке показан формат IP датаграммы. Стандартный размер IP заголовка составляет 20 байт, если не присутствуют опции.

  • Номер версии - первые 4 бита

4 - для протокола IPv4

6 - для протокола IPv6

  • Длина заголовка - следующие 4 бита

Длина заголовка в 32-битных словах. Обычно заголовок имеет длину в 20 байт (октетов), что составляет 5 32-битных слов, но в некоторых случаях может быть больше.

  • Тип сервиса - 8 битов

!!!!!!!!!!!! Вставить таблицу типов сервисов [8]

Указывает на приоритет и срочность датаграммы.

    • Первые три бита характеризуют величину приоритета: от 0 (нормальная датаграмма-самы низкий приоритет) до 7(управляющая информация - самый высокий приоритет)
    • Следующие три бита указывают на флаги определения критерия выбора маршрута:
      • D(Delay) - минимальная задержка
      • T(Throughput) - Максимальная пропускная способность
      • R(Reliability) - Максимальная надежность
    • Следующие 2 бита зарезервированы и не используются
  • Длина датараммы - 16 битов

Полная длина датаграммы . Определяет полную длину датаграммы, включая заголовок и поле данных, в 8-битных октетах. Таким образом, максимальная длина IP-датаграммы не может превышать 65535 октетов.

  • Идентификатор датаграммы - 16 битов

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

  • Флаги -3 бита

Используются для управления фрагментами датаграммы.

    • Первый бит не используется.
    • Второй бит (DF, Don't Fragment) запрещает фрагментировать датаграмму. Установленный бит гарантирует, что если адресат получит датаграмму, то она обязательно будет состоять из одного фрагмента (Маршрутизаторы обязаны уметь передавать нефрагментированные датаграммы размером 576 байт и менее. В некоторых случаях маршрутизаторы не могут передать датаграммы большего размера без фрагментирования. Тогда они просто отбрасываются.) .
    • Третий бит (MF, More Fragments)

означает, что этот фрагмент является не последним в датаграмме и будет продолжение. Последний фрагмент в датаграмме имеет бит MF равный нулю.

  • Смещение фрагмента - 13 битов.

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

  • Время жизни (TTL) - 8 битов.

Означает предельный срок, в течение которого датаграмма может перемещаться по сети. При прохождении маршрутизатора (hop) значение TTL уменьшается на 1. Когда значение TTL достигает 0, датаграмма уничтожается, а отправитель получает сообщение о том, что время жизни пакета истекло. Тем самым мы избавляемся от опасности бесконечного блуждания паке- тов по сети.

  • Протокол верхнего уровня - 8 битов.

Информация о протоколе нужна для того чтобы выбрать, куда именно должны передаваться данные по стеку протоколов вверх. Номера протоколов определены документом RFC 1700. Например, TCP имеет номер 6, а UDP — 17.

  • Контрольная сумма заголовка - 16 битов.

Защищает заголовок от наличия ошибок в нем. Вычисляется как логическое дополнение суммы всех остальных данных заголовка, разбитых на 16-битные слова. Таким образом, сумма всех 16-битных слов заголовка должна быть равна нулю. Если это не так, датаграмма считается поврежденной и отбрасывается.

  • Адрес отправителя - 32 бита.
  • Адрес получателя - 32 бита.

Оба поля имеют одинаковую структуру.Они содержат так называемые IP-адреса хостов сети.

  • Опции.

Поле, которое является не обязательным и используется в основном только при отладке сети.

    • Безопасность. Поле, которое теоретически, должно запрещать передачу датаграмм через небезопасные маршрутизаторы. На практике не используется.
    • Строгая маршрутизация от источника. Требует чтобы датаграмма передавалась через указанную последовательность маршрутизаиторов.
    • Нестрогая маршрутизация от источника. Требует, чтобы датаграмма прошла через заданные маршрутиазаторы.
    • Маршрут. Можно заставить маршрутизаторы добавлять к этому полю информацию о том, что датаграмма прошла через них. В результате, поле содержит список всех узлов, через которые проходил пакет.
    • Временной штамп. Маршрутизаторы добавляют в поле не только информацию о собственном адресе, но и временной штамп (32-битное слово).
  • Выравнивание. Поле, заполненное нулями до 32-битной границы.


[править] IP-адреса
[править] Понятие IP-адреса
IP-адрес, маска подсети и префикс

IP-адрес представляет собой 32-битное двоичное число. Обычно его принято записывать в так называемой десятичной точечной нотации (dotted quad notation), когда каждый байт адреса представляется в виде числа в десятеричной системе счисления и отделяется от остальных точкой. Например, ниже приведены различные представления одного и того же адреса:

192.168.1.15
                                                       
11000000 10101000 00000001 00001111
                                                       
C0A8010F

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


[править] Классы IP-адресов
Форматы классов IP -адресов
Деление IP -адресов на классы

Одно из основных достоинств использования классов заключается в том, что каждый адрес содержит ключ, который идентифицирует точку, расположенную между сетевым префиксом и номером хоста. Например, если старшие два бита адреса установлены в 1 и 0, то линия раздела пролегает между 15 и 16-м битами. IP-адрес разбивается на два элемента: адрес сети и адрес хоста. В зависимости от того, какому классу принадлежит IP-адрес, граница сеть-хост может пролегать между первым и вторым (класс A), вторым и третьим (класс B) или третьим и четвертым байтами (класс C).

Таблица Итоговые сведения о классах IP-адресов


Класс Пределы значений первого октета Общее количество сетей Общее количество хостов в сети Применяемая маска по умолчанию Назначение
A 1-126 126 16,7 млн 255.0.0.0 Стандартный класс
B 128-191 16384 65534 255.255.0.0 Стандартный класс
C 192-223 2 млн 254 255.255.255.0 Стандартный класс
D 224-239 Не рассматривается Не рассматривается 224.0.0.0 Mногоадресатная рассылка
E 240-255 Не рассматривается Не рассматривается Не рассматривается Экспериментальный класс
[править] IP-адреса, зарезервированные для часного использования

Таблица IP-адресов, зарезервированных для часного использования

Диапазон IP-адресов Количество IP-адресов Наибольший блок Описано в
10.0.0.0 – 10.255.255.255 16,777,216 10.0.0.0/8 RFC 1597, RFC 1918
172.16.0.0 – 172.31.255.255 1,048,576 172.16.0.0/12
192.168.0.0 – 192.168.255.255 65,536 192.168.0.0/16
169.254.0.0 – 169.254.255.255 65,536 169.254.0.0/16 RFC 3330, RFC 3927
[править] Специальные IP-адреса

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

  • Этот хост. Адрес, состоящий из всех нулей, означает сам хост;
  • Адрес сети. Адрес, хост-часть которого состоит из одних нулей, означает адрес этой сети;
  • Адрес в текущей сети. Адрес, сетевая часть которого состоит из одних нулей, означает хост с заданным адресом в этой сети;
  • Широковещательный адрес. Адрес, хост-часть которого наоборот состоит из одних единиц, означает широковещательный адрес. Датаграммы, отправленные по этому адресу, получат все компьютеры, находящиеся в этой сети;
  • Широковещательный адрес в пределах этой сети. Адрес, состоящий из всех единиц, означает широковещательный адрес в пределах этой сети.
  • Петля обратной связи. Любой адрес, первый байт которого равен 127, зарезервирован для петли обратной связи. Такой адрес всегда принадлежит самому хосту. Обычно, для петли обратной связи принято использовать адрес 127.0.0.1, однако это не имеет никакого значения.


[править] Разбиение заданного адресного пространства на подсети

Разбиение пространства на сети, в том виде, в каком оно обеспечивается классами адресов, оказалось не очень удобным. Огромное количество сетей в действительности содержат намного меньше чем 254 хоста. Даже для адресов класса C, значительная часть адресов сети попросту не используется. Для сетей классов A и B ситуация обостряется еще сильнее. В результате, адресное пространство расходуется неэкономно. Для того чтобы сделать разбиение адресного пространства более гибким, было введено понятие подсети и маски подсети. Часть IP-адреса, которая относится к адресу хоста, разбивается на две части: несколько старших битов адресуют подсеть, остальные хост — в пределах этой подсети. Маска подсети представляет собой 32-разрядное двоичное число, которое содержит 0 в разрядах, относящихся к адресу хоста и 1 во всех остальных. Таким образом, маска описывает границу, проходящую между адресом подсети и адресом хоста. Например, пусть адрес 172.16.1.2 принадлежит подсети с маской 255.255.255.0:

Адрес: 172.16.1.2

Маска подсети: 255.255.255.0

Адрес подсети: 172.16.1.0

Широковещательный адрес: 172.16.1.255

Обратите внимание на то, что в соответствии с классом адреса (класс B), адрес сети должен быть равен 172.16.0.0, а широковещательный: 172.16.255.255. Но так как маска задана явно, граница сетевой и хостовой части находится в другом месте, между третьим и четвертым байтом. В любой подсети адреса, хост-часть которых равна нулю и хост-часть которых содержит одни единицы, зарезервирована для адреса подсети и широковещательного адреса. Адреса, в которых номер подсети равен нулю или наоборот, содержит одни единицы, также зарезервированы, и использовать их не рекомендуется. Из-за того, что некоторые адреса зарезервированы, количество адресов, которые можно использовать для назначения компьютерам, после разбиения сокращается. Например, пусть сеть 192.168.1.0 нужно разбить на 18 подсетей. Какое количество адресов будет доступно в каждой подсети, и каково суммарное количество доступных адресов? Разбиение проходит по границе бита, поэтому количество подсетей может быть только степени 2, минус зарезервированные сети. То есть, мы можем получить: 2, 6, 14, 30 или 62 подсети, выделяя для этого под ее адрес 2, 3, 4, 5 или 6 битов соответственно. Подсеть с адресом, состоящим из одного бита, использовать можно, но в этом случае нам придется задействовать зарезервированные адреса. Разбить сеть ровно на 18 подсетей не удастся, сеть придется разбить минимум на 30 подсетей (Разбиение можно выполнить и иначе. Например, разделить сеть на 14 подсетей одну или две из которых разбить на более мелкие части и получить тем самым необходимое их количество). При разбиении на 32-2 сети адрес подсети занимает 5 битов, а под адрес хоста отводится 3 бита. Таким образом, маска подсети выглядит так:

11111111 11111111 11111111 11111000

255.255.255.248

В каждой подсети может быть 8-2 хоста (2 адреса резервируются под широковещательный адрес и адрес подсети). В итоге получается, что после разбиения число доступных адресов равно 180 (30*6), против тех 254, которые были доступны изначально. Адреса полученных сетей:

192.168.1.0 - зарезервирован 192.168.1.8 192.168.1.16 ... 192.168.1.240 192.168.1.248 - зарезервирован

Бесклассовая маршрутизация (CIDR, Classless IntrerDomain Routing), описанная документом RFC 1519, предлагает не разбивать адреса на классы, а выполнять разбиение просто исходя из потребностей в адресном пространстве.


[править] Протокол ICMP

ICMP сообщение

протокол управления сообщениями Internet

С его помощью передаются сообщения об ошибках и сообщения о возникновении условий и ситуаций, которые требуют к себе особого внимания. ICMP сообщения обрабатываются IP уровнем или более высокими уровнями (TCP или UDP). При появлении некоторых ICMP сообщений генерируются сообщения об ошибках, которые передаются пользовательским процессам.

Официальная спецификация ICMP находится в RFC 792

На рисунке показан формат ICMP сообщения.


  • Первые 4 байта одинаковы для всех сообщений, однако остальные отличаются в зависимости от типа сообщения.
  • Существует 15 различных значений для поля типа (type), которые указывают на конкретныей тип ICMP сообщения. Для некоторых ICMP сообщений используются различные значения в поле кода (code), подобным образом осуществляется дальнейшее подразделение ICMP сообщений.
  • Поле контрольной суммы (checksum) охватывает ICMP сообщения целиком.


Сообщение об ошибке ICMP никогда не генерируется в ответ на:

  ICMP сообщение об ошибке. (ICMP сообщение об ошибке, однако, может быть сгенерировано в ответ на ICMP запрос.)
  
  Датаграмму, направляющуюся на широковещательный IP адрес (рисунок 3.9) или групповой адрес IP (адрес класса D, рисунок 1.5).

  Датаграмму, которая посылается широковещательным запросом на канальном уровне.
  
  Фрагмент, который не является первым.

  Датаграмму, адрес источника которой не указывает на конкретный хост. Это означает, что адрес источника не может быть нулевым, loopback адресом, широковещательным или групповым адресом.


Таблица - типы сообщений ICMP


тип код Описание
00эхо-отклик (отклик-Ping)
3 назначение недоступно:
0сеть недоступна - network unreachable
1хост недоступен - host unreachable
2протокол недоступен - protocol unreachable
3порт недоступен - port unreachable
4необходима фрагментация, однако установлен бит “не фрагментировать”- fragmentation needed but don’t-fragment bit set
5не работает маршрутизация от источника - source route failed
6неизвестна сеть назначения - destination network unknown
7неизвестен хост назначения - destination host unknown
8хост источник изолирован - source host isolated
9сеть назначения закрыта администратором - destination network administrativrly prohibited
10хост назначения закрыт администратором - destination host administrativrly prohibited
11сеть недоступна для TOS - network unreachable for TOS
12хост недоступен для TOS - host unreachable for TOS
13связь административно закрыта путем фильтрации - communication administratively prohibited by filtering
14нарушено старшинство для хоста - host precedence violation
15старшинство разъединено - precedence cutoff in effect
40подавление источника (элементарное управление потоком данных) - source quench
5 перенаправление - redirect
0перенаправление в сеть - redirect for network
1перенаправление в хост - redirect for host
2перенаправление для типа сервиса и сети - redirect for type-of-service and network
3перенаправление для типа сервиса и хоста - redirect for type-of-service and host
80эхо запрос - echo request (Ping запрос)
90объявление маршрутизатора - router advertisement
100запрос к маршрутизатору - router solicitation
11 время истекло - time exceeded:
0время жизни стало равным 0 в процессе передачи - time-to-live equals 0 during transit
1время жизни стало равным 0 в процессе повторной сборки - time-to-live equals 0 during reassembly
12 проблемы с параметрами - parameter problem:
0неверный IP заголовок - IP header bad
1отсутствует необходимая опция - required option missing
130запрос временной марки - timestamp request
140отклик с временной маркой - timestamp reply
150информационный запрос - information request
160информационный отклик - information reply
170запрос маски адреса - address mask request
180отклик с маской адреса - address mask reply

[править] Уровень II (Transport)

Транспортный уровень (transport layer) отвечает за передачу потока данных между двумя компьютерами и обеспечивает работу прикладного уровня, который находится выше. В семействе протоколов TCP/IP существует два транспортных протокола: TCP (Transmission Control Protocol) и UDP (User Datagram Protocol). TCP осуществляет надежную передачу данных между двумя компьютерами. Он обеспечивает деление данных, передающихся от одного приложения к другому, на пакеты подходящего для сетевого уровня размера, подтверждение принятых пакетов, установку тайм-аутов, в течение которых должно прийти подтверждение на пакет, и так далее. Так как надежность передачи данных гарантируется на транспортном уровне, на прикладном уровне эти детали игнорируются. UDP предоставляет более простой сервис для прикладного уровня. Он просто отсылает пакеты, которые называются датаграммами (datagram) от одного компьютера к другому. При этом нет никакой гарантии, что датаграмма дойдет до пункта назначения. За надежность передачи данных, при использовании датаграмм отвечает прикладной уровень. Для каждого транспортного протокола существуют различные приложения, которые их используют.

[править] протокол TCP

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

TcpHeader.jpg

На рисунке показан формат TCP-заголовка и включает в себя он следующее:

  • Порт источника и порт назначения:

Каждый TCP сегмент содержит номер порта (port number) источника и назначения, с помощью которых идентифицируются отправляющее и принимающее приложения. Эти два значения вместе с IP адресом источника и назначения в IP заголовке уникально идентифицируют каждое соединение.

  • Номер последовательности (sequence number)

Идентифицирует байт в потоке данных от отправляющего TCP к принимающему TCP. Если мы представим поток байтов, текущий в одном направлении между двумя приложениями, TCP нумерует каждый байт номером последовательности. Номер последовательности представляет собой 32-битное беззнаковое число, которое переходит через 0, по достижению значения 232 - 1.

При установлении нового соединения, взводится флаг SYN. Поле номера последовательности (sequence number field) содержит исходный номер последовательности (ISN - initial sequence number), который выбирается хостом для данного соединения. Номер последовательности первого байта данных, который посылается этим хостом, будет равен ISN плюс один, потому что флаг SYN занимает собой номер последовательности.

  • Номер подтверждения (acknowledgment number)

Так как каждый байт, который участвует в обмене, пронумерован, номер подтверждения (acknowledgment number) это следующий номер последовательности, который ожидает получить отправитель подтверждения. Это номер последовательности плюс 1 последнего успешно принятого байта данных. Это поле принимается в рассмотрение, только если флаг ACK взведен.


  • Длина заголовка (header length)

Содержит длину заголовка в 32-битных словах. Это объясняется тем, что длина поля опций переменная. С 4-битным полем у TCP есть ограничение на длину заголовка в 60 байт. Без опций, однако, стандартный размер составляет 20 байт.


  • Флаги

В TCP заголовке существуют 6 флаговых битов. Один или несколько из них могут быть установлены в единицу в одно и то же время. Вот их краткое описание:

    • URG
   Указатель срочности (urgent pointer) 
    • ACK
   Номер подтверждения необходимо принять в рассмотрение (acknowledgment).
    • PSH
   Получатель должен передать эти данные приложению как можно скорее.
    • RST
   Сбросить соединение.
    • SYN
   Синхронизирующий номер последовательности для установления соединения.
    • FIN
   Отправитель заканчивает посылку данных.
  • Размер окна

Контроль потока данных TCP осуществляется на каждом конце с использованием размера окна (window size) . Это количество байт, начинающееся с указанного в поле номера подтверждения, которое приложение собирается принять. Это 16-битовое поле ограничивает размер окна в 65535 байт.

  • Контрольная сумма (checksum)

Охватывает собой весь TCP сегмент: TCP заголовок и TCP данные. Это обязательное поле, которое должно быть рассчитано и сохранено отправителем, а затем проверено получателем.

  • Указатель срочности (urgent pointer)

Действителен только в том случае, если установлен флаг URG. Этот указатель является положительным смещением, которое должно быть прибавлено к полю номера последовательности сегмента, чтобы получить номер последовательности последнего байта срочных данных. Режим срочности TCP это способ, с помощью которого отправитель передает срочные данные на удаленный конец.


[править] Установка и закрытие соединения

Установка и закрытие соединения

[править] Порты

В то время как задача IP заключается в передаче данных между произвольными узлами сети, задача транспортного уровня, которую решает протокол TCP, заключается в передаче данных между любыми прикладными процессами, выполняющимися на любых узлах сети. Данные, которые доставляет протокол IP на компьютер, должны быть переданы конкретном процессу на этом хосте. Пакеты, поступающие на транспортный уровень, организуются в виде очередей к множеству точек входа различных прикладных процессов. Такие очереди называются портами . Таким образом, адресом назначения, который используется протоколом является идентификатор (номер) порта прикладной службы.

Номер порта в совокупности с адресом узла и типом протокола однозначно определяют прикладной процесс в сети. Такой набор идентифицирующих параметров носит название сокет (socket).

Номер порта представляет собой двухбайтное число от 0 до 65535. Назначение номеров портов прикладным процессам осуществляется либо централизованно, если эти процессы обеспечивают популярные общедоступные службы (например, порт 25 закреплен за службой ретрансляции сообщений электронной почты SMTP), либо локально для тех служб, которые еще не стали столь распространенными, чтобы закреплять за ними зарезервированные номера.

[править] Протокол UDP (User Datagram Protocol)

Формат UPD заголовка

В тех случаях, когда нижние сетевые уровни обеспечивают достаточно надежную доставку, а потеря передаваемых данных не вызывает больших проблем, вся мощь протокола TCP оказывает ненужной и даже в определенном смысле вредной: с одной стороны, генерируется дополнительный трафик; с другой — передача требует больших вычислительных и временных затрат.

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

  • Порт отправителя (16 битов). Числовой идентификатор порта отправителя данных.
  • Порт получателя (16 битов). Числовой идентификатор порта получателя данных.
  • Длина (16 битов). Суммарное количество октетов в заголовке и поле данных. Не может быть меньше 8.
  • Контрольная сумма (16 битов). Логическое дополнение суммы, вычисляемой по полю данных и заголовку сообщения.


[править] Уровень I (Applications)

Верхний уровень (уровень I) называется прикладным. За долгие годы использования стек TCP/IP накопил большое количество протоколов и сервисов прикладного уровня. К ним относятся такие широко используемые протоколы, как протокол копирования файлов FTP, протокол эмуляции терминала telnet, почтовый протокол SMTP, используемый в электронной почте сети Internet, гипертекстовые сервисы доступа к удаленной информации, такие как WWW и многие другие.

[править] Протокол SNMP (Simple Network Management Protocol)

Протокол SNMP (Simple Network Management Protocol) используется для организации сетевого управления. Проблема управления разделяется здесь на две задачи. Первая задача связана с передачей информации. Протоколы передачи управляющей информации определяют процедуру взаимодействия сервера с программой-клиентом, работающей на хосте администратора. Они определяют форматы сообщений, которыми обмениваются клиенты и серверы, а также форматы имен и адресов. Вторая задача связана с контролируемыми данными. Стандарты регламентируют, какие данные должны сохраняться и накапливаться в шлюзах, имена этих данных и синтаксис этих имен. В стандарте SNMP определена спецификация информационной базы данных управления сетью. Эта спецификация, известная как база данных MIB (Management Information Base), определяет те элементы данных, которые хост или шлюз должен сохранять, и допустимые операции над ними.

[править] Протокол FTP (File Transfer Protocol)

FTP отличается от других приложений тем, что он использует два TCP соединения для передачи файла.

  • Управляющее соединение устанавливается как обычное соединение клиент-сервер. Сервер осуществляет пассивное открытие на заранее известный порт FTP (21) и ожидает запроса на соединение от клиента. Клиент осуществляет активное открытие на TCP порт 21, чтобы установить управляющее соединение. Управляющее соединение существует все время, пока клиент общается с сервером. Это соединение используется для передачи команд от клиента к серверу и для передачи откликов от сервера. Тип IP сервиса для управляющего соединения устанавливается для получения "минимальной задержки", так как команды обычно вводятся пользователем.
  • Соединение данных открывается каждый раз, когда осуществляется передача файла между клиентом и сервером. (Оно также открывается и в другие моменты, как мы увидим позже.) Тип сервиса IP для соединения данных должен быть "максимальная пропускная способность", так как это соединение используется для передачи файлов.

[править] Протокол TFTP (Trivial File Transfer Protocol)

Приложения, которым не требуются все возможности FTP, могут использовать другой, более экономичный протокол - простейший протокол пересылки файлов TFTP (Trivial File Transfer Protocol). Этот протокол реализует только передачу файлов, причем в качестве транспорта используется более простой, чем TCP, протокол без установления соединения - UDP.

[править] Протокол Telnet

Telnet был разработан, для того чтобы работать между хостами работающими под управлениием любых операционных систем, а также с любыми терминалами. Его спецификация, приведенная в RFC 854 [Postel and Reynolds 1983a], определяет терминал, который может являться наиболее общим, и который называется виртуальным сетевым терминалом (NVT - network virtual terminal). NVT это воображаемое устройство, находящееся на обоих концах соединения, у клиента и сервера, с помощью которого устанавливается соответствие между их реальными терминалами. Таким образом, операционная система клиента должна определять соответствие между тем типом терминала, за которым работает пользователь, с NVT. В свою очередь, сервер должен устанавливать соответствие между NVT и теми типами терминалов, которые он (сервер) поддерживает.

[править] Протокол SMTP

[править] Элементы компьютерных сетей

Устройства, образующие компьютерную сеть, можно разделить на два класса:

  • Коммуникационные устройства, то есть устройства, которые предназначены в первую очередь для передачи данных и решения сопутствующих задач;
  • Серверы, то есть системы, которые предоставляют свои ресурсы для использования другим компьютерам сети.

Это разделение весьма условно, поскольку в первом случае, можно говорить о предоставлении коммуникационного ресурса, во втором — о том, что некоторые серверы, например почтовый, занимаются передачей данных. Тем не менее, его смысл ясен.

Коммуникационные устройства работают на нижних уровнях модели сетевого взаимодействия, а серверы — на ее верхних уровнях.

[править] 2.1. Коммуникационные устройства

В зависимости от того, на каком уровне OSI работает устройство, и, соответственно, какие функции выполняет, различают:

  • повторители (repeater) и концентраторы (hub);
  • мосты (bridge) и коммутаторы (switch);
  • маршрутизаторы (router).

Повторитель и концентратор — устройства, которое объединяют несколько сетей на физическом уровне. Главное различие между повторителем и концентратором заключается в том, что первый объединят 2 сети, а второй — несколько, от 8 и более.

Основная их задача — передавать сигнал, поступающий на один вход, на все остальные входы. При этом уровень сигнала и его форма восстанавливаются и принимают требуемый вид.

Концентратор может выполнять и другие функции, например, анализировать сигналы, поступающие на его порты и, в том случае, если сигнал выглядит некорректно, блокировать этот порт.

Концентратор не анализирует данные и повторяет сигналы на всех портах, даже в том случае, если компьютера, которому адресуются данные, на этих портах заведомо нет. Концентратор не предотвращает коллизии, то есть столкновение и наложение сигналов от нескольких сетевых устройств. Так, если коллизия возникла в одном сегменте, то она будет распространена во все другие сегменты, подключенные к концентратору. В этом случае, говорят о том, что устройства, соединенные между собой при помощи концентратора или повторителя, составляют домен коллизий.

Повторитель и концентратор работают на первом, физическом, уровне модели сетевого взаимодействия OSI.

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

Коммутатор строит таблицы используемые им для отправки пакетов самостоятельно, анализируя адреса отправителей кадров, поступающих на его порты. Широковещательные кадры отправляются коммутатором на все его порты: таким образом, все компьютеры соединенные одним или несколькими коммутаторами между собой будут получать одинаковые широковещательные кадры. Такие компьютеры по аналогии с доменом коллизий образуют широковещательный домен.

Коммутаторы могут передавать информацию только в пределах одной сети. В том случае, если данные должны быть отправлены куда-то за ее пределы, на помощь приходят маршрутизаторы.

Маршрутизаторы работают на сетевом уровне — они рассматривают поток данных как набор пакетов, например, IP-пакетов, каждый из которых имеет структурированный адрес уникальный для всей сети или, как еще говорят, межсети (internet8). Маршрутизатор анализирует таблицу маршрутизации и отправляет пакет основываясь на данных таблицы. Функции маршрутизатора могут быть возложены на Unix-машину. Для этого она обладает всеми необходимыми возможностями:

  • поддержка маршрутизации IP-пакетов реализована в Unix на уровне ядра;
  • модули ядра предоставляют возможности расширенной маршрутизации;
  • под Unix работает несколько развитых программ динамической маршрутизации.

В английском языке слова internet и Internet имеют разные значения. В первом случае это сеть, состоящая из нескольких сетей, объединенных между собой маршрутизаторами. Во второй — собственно всемирная сеть.

[править] Серверы

Сеть обычно помимо простой задачи передачи данных предоставляет разнообразные вычислительные и информационные возможности, которые оформлены в виде так называемых сервисов или служб. Сервисы обеспечиваются серверами — компьютерами, предоставляющими свои ресурсы для совместного использования сетью.

FreeBSD является одной из наилучших платформ для построения сетевых серверов. Это связано с множеством причин: в первую очередь с тем, что ядро FreeBSD очень хорошо обеспечивает решение разнообразных задач сетевого взаимодействия, а так же с большим объемом качественного программного обеспечения, написанного или перенесенного под FreeBSD.

Популярные сетевые службы

Служба Назначение
СлужбаНазначение
HTTPПротокол HTTP (HyperText Transfer Protocol) — протокол передачи гипертекстовой информации. Один из важнейших протоколов Ин тернет, лежит в основе WWW.

Apache - это мощный, полнофункциональный, эффективный, свободно распространяемый и самый популярный WWW-сервер.

Кэширующий прокси-серверПрокси-сервер — сервер посредник при помощи которого Web-клиенты получают доступ к Web-серверам. Это, с одной стороны, ускоряет доступ (за счет того, что прокси-сервер ускоряет кэширование и некоторые запрашиваемые данные извлекает из кэша, вместотого чтобы обращаться за ними к Web-серверу), с другой — позволяет контролировать трафик, выполнять его анализ и журнализацию.

Squid - это высокоэффективный кэширующий прокси-сервер для веб-клиентов, поддерживающий протоколы FTP, gopher и HTTP.

DNSDNS (Domain Name System) — система доменных имен — механизм представления IP-адресов пакетов в символьном виде, удобном для запоминания и использования людьми.

BIND (Berkeley Internet Name Domain) это реализация протокола DNS (Domain Name System). BIND включает в себя сервер DNS, конвертирующий имена узлов в IP адреса; библиотеку резолвера и утилиты для проверки корректности работы сервера.

FTPFTP (File Transfer Protocol) — протокол передачи файлов.

Программа wu-ftpd — сервер FTP, которой обладает следующими возможностями: ведение журналов передачи данных и команд, сжатие и архивация "на лету", классификация пользователей и их местонахождение, ограничения по классу, загрузка в разрешенные директории, ограничение гостевого входа, передача системных сообщений и сообщений для определенных каталогов, создание псевдонимов каталогов, наличие фильтра имен и поддержка виртуальных серверов.

SMBSMB (Server Message Blocks) - это протокол, при помощи которого компьютеры PC пользуются общими файлами, принтерами и другой информацией (например, списком доступных файлов и принтеров). Операционные системы Windows NT, OS/2 и FreeBSD поддерживают его изначально, а дополнительные пакеты могут сделать это возможным для DOS, Windows, VMS, UNIX всех видов, MVS и т.д. В FreeBSD поддержка протокола SMB обеспечивается при помощи пакета Samba.
NFSNFS (Network FileSystem) — сетевая файловая система, распространенная в UNIX-мире. FreeBSD поддерживает функции клиента NFS на уровне ядра. Сервер NFS организуется при помощи утилит nfsd и mountd.
TelnetTelnet - это распространенный протокол доступа к удаленным системам в интернет. Под FreeBSD работают программа telnet — клиент службы Telnet и telnetd — сервер Telnet.
SSHOpenSSH это версия SSH (Secure SHell), программы для входа и исполнения команд на удаленной машине. Демон sshd позволяет клиентам SSH безопасно соединяться с сервером SSH.
SMTPSMTP - протокол доставки сообщений электронной почты, используемый в Интернет.

Программа sendmail - это широко используемая система доставки электронной почты(MTA). Программа выполняет основную задачу транспортировки почты — передачи с одного хоста на другой с использованием протокола SMTP.

POP3Протокол доступа к удаленному почтовому ящику.

Программа popper — небольшой сервер POP3. Имеет минимальный набор возможностей и, тем самым, обеспечивает высокую производительность и безопасность.

DHCP и BOOTPDHCP (Dynamic Host Configuration Protocol) и BOOTP (Boot Protocol) - это протоколы, предоставляющие отдельным устройствам в IP-сети возможность получать с серверов собственную конфигурационную информацию (IP-адреса, маску подсети, вещательные адреса и т.д.). Главное предназначение DHCP и BOOTP - это обеспечить достаточно легкое управление большой сетью.

DHCP-сервер — программа dhcpd; DHCP-клиент — программа pump.

NTPNTP (Network Time Protocol) используется для синхронизации системных часов с другим источником. Пакет программ ntp содержит демоны и утилиты для синхронизации времени с серверами точного времени через Internet.

Программа ntpdate — утилита для получения точного времени с другой машины посредством сети. Программа ntpd — демон непрерывной настройки системного времени.

[править] Сетевые интефейсы

Сетевое взаимодействие Unix-компьютера происходит через сетевые интерфейсы. Любые данные, которые компьютер отправляет в сеть или получает из сети проходят через сетевой интерфейс. Интерфейс определен реализацией модели TCP/IP для того чтобы скрыть различия в сетевом обеспечении и свести сетевое взаимодействие к об- мену данными с абстрактной сущностью. Для каждого устройства, поддерживаемого ядром, существует сетевой интерфейс. Существует соглашение о наименовании интерфейсов, в соответствии с которым имя интерфейса состоит из префикса, характеризующего его тип, и числа, соответствующего номеру интерфейса данного типа в системе. Имя типа интерфейса определяется драйвером соответствующего сетевого устройства. Так, например, ppp0 соответствует первому интерфейсу PPP, а xl1 — второму интерфейсу 3Com Ethernet. Обратите внимание на то, что нумерация интерфейсов начинается с 0.


[править] SSH

clint:Dom0~$ ssh -v 10.0.17.1
OpenSSH_4.3p2 Debian-3, OpenSSL 0.9.8c 05 Sep 2006

Версия клиента ssh

debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *

Просмотр и применение конфигурационного файла клиента ssh /etc/ssh/ssh_config

debug1: Connecting to 10.0.17.1 [10.0.17.1] port 22.
debug1: Connection established.

Этап установки TCP-соединения завершен

debug1: identity file /home/clint/.ssh/identity type -1
debug1: identity file /home/clint/.ssh/id_rsa type 1
debug1: identity file /home/clint/.ssh/id_dsa type -1

Просмотр пользовательского каталога .ssh и определение существующих ассиметричных ключей пользователя.

debug1: Remote protocol version 2.0, remote software version OpenSSH_4.3p2 Debian-9
debug1: match: OpenSSH_4.3p2 Debian-9 pat OpenSSH*

Определение версии протокола SSH и версии программного обеспечения сервера.

debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.3p2 Debian-3

Вывод информации о версии клиента ssh (то есть о самом клиенте).

debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
Клиент отправил ключ SSH2_MSG_KEXINIT что за ключ?зачем?. И потом его получил
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: kex: client->server aes128-cbc hmac-md5 none

Наверное, тут они договаривались о возможных алгоритмах шифрования

debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY

????

debug1: Host '10.0.17.1' is known and matches the RSA host key.
debug1: Found key in /home/clint/.ssh/known_hosts:16
debug1: ssh_rsa_verify: signature correct

Проверка открытого ключа сервера в файле /home/clint/.ssh/known_hosts

debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received

???

debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Trying private key: /home/clint/.ssh/identity
debug1: Offering public key: /home/clint/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = ru_UA.UTF-8