Nginx + php56 + php-fpm + MySQL (MariaDB) + phpMyAdmin + Python36

0. Обновляемся, отключаем selinux:

$ sudo yum update
$ sudo setenforce 0

Посмотреть состояние:

$ sudo getenforce

Выключить совсем:

$ sudo nano /etc/selinux/config
SELINUX=enforcing

меняем на permissive или disabled.

1. nginx
$ sudo yum install epel-release
$ sudo yum install nginx

2. нужно открыть порты 80 и 443, для этого последовательно выполняем команды:

 $ sudo firewall-cmd --permanent --zone=public --add-service=http
 $ sudo firewall-cmd --permanent --zone=public --add-service=https
 $ sudo firewall-cmd --reload

Или отключаем firewalld, устанавливаем iptables и настраиваем там:

$ sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
$ sudo iptables  -A INPUT -i lo -j ACCEPT
$ sudo iptables  -A INPUT -p icmp -m icmp --icmp-type 0,8,11 -j ACCEPT
$ sudo iptables  -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
$ sudo iptables  -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$ sudo iptables  -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
$ sudo iptables -P INPUT DROP

3. Запускаем Nginx:

$ sudo systemctl start nginx.service

4. добавляем Nginx в автоматическую загрузку при перезапуске сервера:

$ sudo systemctl enable nginx.service

5. проверяем:

http://192.168.113.27
6. MySQL
$ sudo yum install mariadb-server mariadb -y

7. Запускайте MariaDB:

$ sudo systemctl start mariadb

8. Далее нужно настроить безопасность баз данных. При первом заходе будет запрошен пароль, если вы его не установили, то он пустой, нужно нажать просто Enter:

$ sudo mysql_secure_installation

В процессе будут заданы несколько вопросов, после согласия с ними клавишу “y”.

 mysql_secure_installation prompts:
 Enter current password for root (enter for none):
 OK, successfully used password, moving on...

 Setting the root password ensures that nobody can log into the MariaDB
 root user without the proper authorisation.

 New password: password
 Re-enter new password: password
 Password updated successfully!
 Reloading privilege tables..
 ... Success!

9. В конце добавляем для MariaDB автоматический запуск:

$ sudo systemctl enable mariadb.service

Больше никаких настроек для баз данных не нужно.

10. Установим PHP и необходимые компоненты для работы с Nginx и MariaDB:
$ sudo yum install php php-mysql php-fpm -y

10a. Command to install the Remi repository configuration package:

# yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

Command to install the yum-utils package (for the yum-config-manager command):

# yum install yum-utils

The php56 collection is available in the remi-safe repository

Command to install:

# yum install php56w

Command to install additional packages:

# yum install php56w php56w-mysql php56w-fpm

11. Нужна небольшая настройка PHP. Открывайте файл:

$ sudo nano /etc/php.ini

В самом конце дописывайте данную строку:

cgi.fix_pathinfo=0

и, попутно, правим:

display_errors = On // После отладки - Off
post_max_size = 60M
;default_charset = "UTF-8"
default_charset = "windows-1251" // У меня сайты в такой кодировке - меняем.
file_uploads = On
upload_max_filesize = 50M
max_file_uploads = 20
date.timezone = Europe/Kiev

12. Далее редактируйте еще один файл:

$ sudo nano /etc/php-fpm.d/www.conf

Нужно найти строку “listen =” и изменить ее значение. Должно быть вот так:

listen = /var/run/php-fpm/php-fpm.sock

13. Осталось запустить PHP:

$ sudo systemctl start php-fpm

14. И включить автоматическую загрузку при старте сервера:

$ sudo systemctl enable php-fpm.service

15. Нужно настроить Nginx на работу с PHP. Открывайте файл:

$ sudo nano /etc/nginx/conf.d/default.conf

Удаляйте все данные из него и вписывайте данный код, в третьей строке нужно указать домен или ip-адрес виртуального сервера и сохраняем:

server {
 listen 80;
 server_name домен_или_IP_сервера;
 root /usr/share/nginx/html;
 index index.php index.html index.htm;
 location / {
 try_files $uri $uri/ =404;
 }
 error_page 404 /404.html;
 error_page 500 502 503 504 /50x.html;
 location = /50x.html
 {
 root /usr/share/nginx/html;
 }
 location ~ \.php$ {
 try_files $uri =404;
 fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
 fastcgi_index index.php;
 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
 include fastcgi_params;
 }
 }

16. Перезапускаем Nginx, чтобы все изменения вступили в силу:

$ sudo systemctl restart nginx

17. Далее нужно протестировать все настройки. Создаем файл для проверки работы:

$ sudo nano /usr/share/nginx/html/info.php

18. Вписываем в него строку и сохраняем:

<?php phpinfo(); ?>

19. Проверяем:

http://192.168.113.27/info.php

20. Если все нормально удаляем файл:

$ sudo rm /usr/share/nginx/html/info.php

Далее настраиваем nginx по второй ссылке

phpmyadmin

21. Python3.6

Устанавливаем репозиторий:

# yum install https://centos7.iuscommunity.org/ius-release.rpm
# yum install python36u python36u-devel python36u-pip

 

 

https://invs.ru/support/chastie-voprosy/kak-ustanovit-lemp-linux-nginx-mysql-php-na-centos-7/
http://drach.pro/blog/linux/item/38-nginx-apache-web-server
https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-centos-7

image_pdfimage_print

Logwatch – отчет на почту

# yum install logwatch

Logwatch входит в Базовые репозитории CentOS и не требует подключения дополнительных репозиториев. Все зависимости будут автоматом устранены.

Примечание: Для отправки отчёта по email, я использую Postfix так как даже разработчики RedHat в новой версии RedHAt 7 используют его вместо Sendmail. Соответственно и настройка отправки будут заточены под Postfix.

Редактируем основной конфигурационный файл:

# vim /usr/share/logwatch/default.conf/logwatch.conf
##Указываем кому будет отправляться почта 
MailTo = admin@domen.com

## Адрес отправителя отчета
MailFrom = Logwatch@domen.com

##За какой период отправить отчёт: All, Today, Yesterday (переводить не вижу смысла всё и так предельно понятно)
Range = yesterday

##Детализация отчёта, максимальная, средняя либо низкая : High, Med, Low. Практический опыт показал, что оптимальнее всего указать среднюю либо максимальную детализацию.
Detail = Med

##Сервисы подлежащие анализу по умолчанию указаны все
Service = All

##Далее можем исключить сервисы из вывода статистики пример:
Service = "-sendmail"

##По умолчанию Logwatch анализирует логи в директории /var/log, но мы можем задать дополнительные пути, пример:
LogFile = /home/httpd/access_log
LogFile = /home/httpd/error_log

##Задаём путь и ключ к система обработки почтовых сообщений
mailer = "/bin/mailx -t"

На этот настройка конфигурационного файла завершена. Осталось настроить файл для авторизации (ЕСЛИ НУЖНО) на почтовом сервере.

В домашней директории пользователя создаём файл .mailrc и задаём нужные параметры:

Если используется защищенное SSL/TLS соединение то нужно расскоментировать строчки ниже:

#set smtp-use-ssl/tls 
#set ssl-verify=ignore

Далее задаем имя домен (либо IP) порт, способ авторизации, email и пароль:

set smtp=smtp://mail.server.com:25 
set smtp-auth=login 
set smtp-auth-user=logwatch@mail.server.com 
set smtp-auth-password=qwerty123! 
set from="logwatch@mail.server.com(My server)"

Для безопасности меняем права на файл:

chmod 400 .mailrc

Теперь можем проверить работу выполнив команду:

# logwatch

Если будут ошибки то они будут отображены в терминале.

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

echo "Test" | mail -v -s "Test message" admin@domain.com

В конечном итоге на указанный почтовый адрес нам должен придти отчёт. Если есть проблемы читаем ниже.

Cкрипт формирования отчёта и отправки автоматически создался во время установки пакета и помещается в директорию: /etc/cron.daily/0logwatch но на следующий день Вы не получите отчёта, более того добавление скрипта в crontab также не помогает, а проблема эта из-за переменных окружения, точнее путей, которые при работе через cron нужно указывать либо экспортировать.

Проблема решается редактированием файла

/etc/cron.daily/0logwatch
#!/bin/bash
export PATH=$PATH:/usr/sbin
..................................
.................................
then
 logwatch
fi

Теперь нам остаётся только по утрам открывать свою почту и просматривать отчёт.

P.S. если лог файл отличается от стандартного, лежит не в  /var/log/, а в ином место

$ nano /usr/share/logwatch/default.conf/logfiles/
 LogFile = apache/*access.log
 LogFile = /www/site1/logs/access*.log
 LogFile = /www/site2/logs/access*.log
 #LogFile = apache/*access.log.1
 #LogFile = apache2/*access.log.1
 LogFile = apache/error_log
 LogFile = /www/site1/logs/error*.log
 LogFile = /www/site2/logs/error*.log
 #LogFile = httpd/site1/_log
 #LogFile = httpd/site2/error_log............

Пример для OpenVPN:

/etc/logwatch/scripts/openvpn      - Logwatch perl module
/etc/logwatch/conf/openvpn.conf    - Configuration file

# cp /usr/share/logwatch/default.conf/services/openvpn.conf /etc/logwatch/conf/logfiles/

# cp /usr/share/logwatch/scripts/services/openvpn /etc/logwatch/scripts/services/

Проверяем

# logwatch --detail low --range today --service openvpn --debug 5
# logwatch --service openvpn --output stdout --debug 10

https://forum.sys-adm.in/index.php?topic=3808.0
http://www.itword.net/page/logwatch-linux
http://bflinux.blogspot.com/2011/07/logwatch-linux.html

image_pdfimage_print

postfix – спам вида: user@domain.com –> user@domain.com

В последнее время замучил спам вида: user@domain.com –> user@domain.com, т.е. спам, якобы, от себя – себе же.

Правим, добавляя выделенное:

# ee /usr/local/etc/postfix/main.cf
......
# Aутентификация SMTP
smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth

# SPAM user@domen.com --> user@domen.com
smtpd_restriction_classes = OnlyFromMyUsers

OnlyFromMyUsers = permit_mynetworks
 permit_sasl_authenticated
 reject
#*** END SPAM *** access_sender ***

smtpd_client_restrictions =
 permit_mynetworks
 permit_sasl_authenticated
 reject_unauth_pipelining
 permit
....

# Ограничения по отправителю
smtpd_sender_restrictions =
 check_sender_access hash:/usr/local/etc/postfix/access_sender
 check_sender_access hash:/usr/local/etc/postfix/blacklist
 permit_mynetworks
 permit_sasl_authenticated
 check_sender_access hash:/usr/local/etc/postfix/whitelist
 reject_non_fqdn_sender
 reject_unknown_sender_domain
 permit
....
# cat access_sender
domain.com OnlyFromMyUsers

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

# service postfix restart
image_pdfimage_print

Настраиваем vlan на FreeBSD

 

VLAN (от англ. Virtual Local Area Network), VLAN могут являться частью большего LAN, имея определенные правила взаимодействия с другими VLAN, либо быть полностью изолированными от них. Простейший механизм изоляции различных подсетей, работающих через общие свичи и роутеры, известен как 802.1Q.

Преимущества VLAN

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

Транк VLAN — это физический канал, по которому передается несколько VLAN каналов, которые различаются тегами (метками, добавляемыми в пакеты). Транки обычно создаются между «тегированными портами» VLAN-устройств: свитч-свитч или свитч-маршрутизатор. (В документах Cisco термином «транк» также называют объединение нескольких физических каналов в один логический: Link Aggregation, Port Trunking). Маршрутизатор (свитч третьего уровня) выступает в роли магистрального ядра сети (backbone) для сетевого трафика разных VLAN.

На устройствах Cisco, протокол VTP (VLAN Trunking Protocol) предусматривает VLAN-домены для упрощения администрирования. VTP также выполняет «чистку» трафика, направляя VLAN трафик только на те коммутаторы, которые имеют целевые VLAN-порты.
Native VLAN — каждый порт имеет параметр, названный постоянный виртуальный идентификацией (Native VLAN), который определяет VLAN, назначенный получить нетеговые кадры.

Сказав проще, vlan — это логический канал внутри физического канала (кабеля), а trunk это множество логических каналов (vlan`ов) внутри одного физического канала (кабеля).

Итак более-менее с теорией разобрались, теперь подумаем зачем нам это может понадобиться.

Данная технология может пригодиться например если на сервер нужно «подать» несколько физических линков, а сетевая карта всего одна и вставить ещё одну нет возможности.

Возьмем подобную ситуацию как пример и попробуем настроить следущее:

  • У нас сервер только с одной сетевой картой, а необходимо подключить два канала от двух провайдеров
  • Провайдер А выдал IP-адрес 192.168.1.15 маска 255.255.255.0
  • Провайдер Б выдал IP-адрес 172.16.10.48 маска 255.255.255.192

Для того чтобы разрулить данную ситуацию нам понадобится switch который понимает Vlan (802.1Q), уже почти все управляемые свичи идут с этой функцией. В нашем примере рассмотрим два типа свичей:

  1. cisco catalyst (например 2950 или 3560)
  2. dlink DES-3526

Два провайдера и сервер FreeBSD с одной сет.картой

Два провайдера и сервер FreeBSD с одной сет.картой

Начинаем

Воткнем физические связи в наш свич, получим три кабеля и три занятых порта

  1. порт 1 — Провайдер А
  2. порт 2 — Провайдер Б
  3. порт 3 — наш сервер

Настроим cisco catalyst:

configure terminal
vlan 100
name provider_a
vlan 101
name provider_b
int gi0/1
switchport access vlan 100
int gi0/2
switchport access vlan 101
exit
exit

Этими командами мы создали два vlan с номерами 100 и 101 для линков от двух провайдеров и назначили два порта каталиста в эти vlan.

по команде show vlan вы должны видеть созданные vlan

Теперь перейдем к конфигурированию 3-го порта каталиста куда воткнут наш сервер. Т.к. нам придется в этот порт посылать оба vlan (100,101) нам необходимо сделать trunk на этом порту:

configure terminal
int gi 0/3
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk allowed vlan 100,101
exit
exit

Этими командами мы на третьем порту каталиста подняли trunk и разрешили в этом trunk`е два vlan 100,101

В терминах Cisco:

  • порт в аксес/аксес порт (access port) — порт принимающий не тегированные пакеты (пакеты в которых нет тега (номера) vlan которому они принадлежат)
  • порт в транке/транк порт (trunk port) — порт принимающий тегированные пакеты в которых указан тег (номер) vlan

Сделаем тоже самое, но для Dlink:

create vlan provider_a tag 100
create vlan provider_b tag 101
config vlan provider_a add untagged 1
config vlan provider_b add untagged 2
config vlan provider_a add tagged 3
config vlan provider_b add tagged 3

Так же по команде show vlan убеждаемся что все на месте.

В терминах Dlink:

  • антагет порт (untagged port) — порт в аксес режиме принимающий не тегированные пакеты
  • тагет порт (tagged port) — порт в транке принимающий тегерованные пакеты

Переходим к FreeBSD. В качестве примера используется сет. карта 82545EM Gigabit Ethernet Controller интерфейс em0

Для начала удалим все IP-адреса с интерфейса em0 (если они есть):

/sbin/ifconfig em0 delete

Создадим vlan для провайдера А:

/sbin/ifconfig vlan100 create
/sbin/ifconfig vlan100 vlan 100 vlandev em0

Вот и все, vlan создан, проверяем есть ли он в списке интерфейсов:

запускаем команду /sbin/ifconfig vlan100

vlan100: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=3<RXCSUM,TXCSUM>
ether 00:02:a5:4e:92:48
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vlan: 100 parent interface: em0

Итерфейс на месте.

Создадим vlan для провайдера Б:

/sbin/ifconfig vlan101 create
/sbin/ifconfig vlan101 vlan 101 vlandev em0

Проверяем есть ли он в списке интерфейсов:

запускаем команду /sbin/ifconfig vlan101

vlan101: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=3<RXCSUM,TXCSUM>
ether 00:02:a5:4e:92:48
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vlan: 101 parent interface: em0

Интерфейс на месте.

После того как интерфейсы vlan`ов созданы мы обращаемся с ними как с обычными интерфейсами обычных сетевых карт.

Добавим IP-адреса на созданные vlan`ы:

/sbin/ifconfig vlan100 add 192.168.1.15/24
/sbin/ifconfig vlan101 add 172.16.10.48/26

Вот и все, если вы все сделали правильно, то при выводе команды ifconfig получите:

vlan100: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=3<RXCSUM,TXCSUM>
ether 00:02:a5:4e:92:48
inet 192.168.1.15 netmask 0xffffff00 broadcast 192.168.1.255
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vlan: 100 parent interface: em0
vlan101: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=3<RXCSUM,TXCSUM>
ether 00:02:a5:4e:92:48
inet 172.16.10.48 netmask 0xffffffc0 broadcast 172.16.10.63
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
vlan: 101 parent interface: em0

Можете проверять наличие связи с двумя провайдерами ?

Уничтожить/удалить vlan можно командой (например удалим vlan100):

/sbin/ifconfig vlan100 destroy

Осталось последнее дело, чтобы после reboot конфигурация vlan`ов сохранялась.

Для этого добавим в файл /etc/rc.conf следующие строчки:

ifconfig_vlan100="inet 192.168.1.15 netmask 255.255.255.0 vlan 100 vlandev em0"
ifconfig_vlan101="inet 172.16.10.48 netmask 255.255.255.192 vlan 101 vlandev em0"
cloned_interfaces="vlan100 vlan101"

Есть и второй способ сделать тоже самое. Создайте файл /etc/rc.local и в него вставте все команды которые вы вводили для создания vlan`ов и присваевание им IP-адресов. Файл /etc/rc.local так же отрабатывается при загрузке сервера и будут исполнены все команды в нем перечисленные.

Из командной строки vlanы можно создавать так

ifconfig em0.100=”inet 192.168.1.15 netmask 255.255.255.0″

Источник

image_pdfimage_print

robocopy – backup средствами Windows

Создаем бат файл backup.bat на диске (у меня на E:\_bin\) с таким содержанием:

@echo off
 chcp 1251
 robocopy.exe D:\Vvod_Z E:\tmp /mir /log:E:\tmp\backup.log

где D:\Vvod_Z - что копируем,
E:\tmp - куда копируем и лог-файл

Потом Администрирование — > Планировщик заданий (Task Scheduler )

Или,

Win + R 
shell:startup

добавить ярлык скрипта.

Еще пример.

@echo off
set date_=%date:/=-%
set source=D:\source
set dest=\\192.168.36.97\Big_hall\%date_%
REM set dest=E:\dest\%date_%
mkdir %dest%
robocopy "%source%" "%dest%" /E 
@echo on

создается на удаленной машине директория dest с текущей датой вида число.месяц.год

 

robocopy \\testnode1\C$\source\ \\testnode2\c$\dest\ *.txt /MIR /COPYALL /Z /B /J /R:3 /W:1 /REG /TEE /LOG+:%appdata%\robocopy.log

  • \\testnode1\C$\source\ — исходный каталог, откуда копируются файлы
  • \\testnode2\C$\dest\ — каталог назначения, куда скопируются файлы
  • *.txt – фильтр файлов. Синхронизируются только .txt файл и директории.
  • /MIR – полное зеркалирование данных в source и dest директориях. Файлы, удаленные из source директории или не присутствующие в ней, также будут удалены из dest. Если вы хотите, чтобы удаленные из source файлы оставались в dest, то поменяйте параметр /MIR на /E
  • /COPYALL – копирует всю информацию о файле (Атрибуты, параметры безопасности и т.д.). Как альтернатива, можно применять флаг /COPY:DT для копирования timestamp, а не всей информации. /COPALL требует прав администратора
  • /Z – robocopy продолжит копирование файла при обрыве. Полезно при копировании больших файлов (неплохая альтернатива копированию файлов по BITS)
  • /B – позволяет robocopy избегать ошибки access denied error. В этом режиме robocopy игнорирует все права на файлы, которые могли бы помешать прочитать/записать файл. Этот режим требует прав администратора либо участие в группе Операторы архива
  • /J – Копирование без буфера (файлового кэша, оперативной памяти). Эффективно для больших файлов.
  • /R:3 – количество попыток скопировать недоступный файл. Значение по умолчанию – миллион, поэтому необходимо его сменить.
  • /W:1 – секунды между попытками скопировать недоступный файл. Значение по умолчанию – 30 секунд.
  • /REG – сохранить текущие значения ключей /R и /W в реестр как стандартные, для будущих вызовов robocopy.
  • /TEE – разделение вывода работы команды и в лог файл, и в консоль. При фоновом вызове robocopy (например, из планировщика задача) этот параметр можно убрать, оставив только /LOG
  • /LOG – путь к файлу лога

Обратите внимание на ключ /Z даже если вы копируете небольшие файлы по устойчивому каналу. Он не несёт дополнительных расходов при использовании, но в случае обрыва, вы сможете продолжить копирование просто повторно запустив скрипт.

https://winitpro.ru/index.php/2020/05/13/robocopy-sinxronizaciya-i-rezervnoe-kopirovanie-fajlov/

image_pdfimage_print

Крякозяблы в cmd

Досадная мелочь исправляется путем выбора шрифта:

cmd --> Свойства --> Шрифт --> Lucida Console

Также за это отвечает команда chcp. Т.е. для того, что бы изменить кодировку нужно набрать:

chcp - узнать текущую кодировку
chcp 1251 – Windows (кириллица);
chcp 866 – DOC-кодировка;
chcp 65001 – UTF-8

 

 

image_pdfimage_print

Ошибка браузера Mozilla: ssl_error_rx_record_too_long

В адресной строке браузера набрать:

about:config

Кликнуть на появившуюся кнопку

«Я принимаю все риски»

Поиском найти параметр

«security.tls.version.max»

и если там стоит значение 0 (ноль) (у меня стояло 4), то дважды кликните на нём и установите значение 1 (один)

Проверяем.

image_pdfimage_print

ng_ipacct – подсчет трафика на интерфейсах

 

root@tst:/usr # portsnap fetch update
root@tst:/usr # portmaster net-mgmt/ng_ipacct

Для подсчета трафика с прокси Squid, нужно доставить calamaris:

root@tst:/usr # portmaster www/calamaris

Ядро дефолтное – все подгружается модулями.

Снимать статистику нужно на двух интерфейсах rl0 – LAN, re0 – WAN.

Правим /usr/local/etc/ng_ipacct.conf, строки начинающиеся на “ng_ipacct_xl0_” копируем в самый низ конфига (2 раза) и меняем _xl0_ на _rl0_ и re0.

svm@ring:/usr/local/etc# cat ng_ipacct.conf | grep "^[^#]"
ng_ipacct_enable="YES"
ng_ipacct_modules_load="YES"
ng_ipacct_modules_list="netgraph ng_ether ng_ipacct"
ng_ipacct_interfaces="rl0 re0"
ng_ipacct_default_ether_start='
        mkpeer %%iface%%: tee lower right
        name %%iface%%:lower %%iface%%_tee
        connect %%iface%%: lower upper left
        mkpeer %%iface%%_tee: ipacct right2left %%iface%%_in
        name %%iface%%_tee:right2left %%iface%%_ip_acct
        connect %%iface%%_tee: %%iface%%_ip_acct: left2right %%iface%%_out
'
ng_ipacct_default_ether_stop='
        shutdown %%iface%%_ip_acct:
        shutdown %%iface%%_tee:
        shutdown %%iface%%:
'
ng_ipacct_bpf_ether_start='
        mkpeer %%iface%%: tee lower right
        name %%iface%%:lower %%iface%%_tee
        connect %%iface%%: lower upper left
        mkpeer %%iface%%_tee: bpf right2left %%iface%%_in
        name %%iface%%_tee:right2left %%iface%%_bpf
        connect %%iface%%_tee: right2left left2right %%iface%%_out

mkpeer %%iface%%_bpf: ipacct %%iface%%_match_in %%iface%%_in
        name %%iface%%_bpf:%%iface%%_match_in %%iface%%_ip_acct
        connect %%iface%%_bpf: %%iface%%_ip_acct: %%iface%%_match_out %%iface%%_out
'
ng_ipacct_bpf_ether_stop='
        shutdown %%iface%%_ip_acct:
        shutdown %%iface%%_bpf:
        shutdown %%iface%%_tee:
        shutdown %%iface%%:
'
ng_ipacct_xl0_dlt="EN10MB" # required line; see ipacctctl(8)
ng_ipacct_xl0_threshold="15000" # '5000' by default
ng_ipacct_xl0_verbose="yes" # 'yes' by default
ng_ipacct_xl0_saveuid="yes" # 'no' by default
ng_ipacct_xl0_savetime="no" # 'no' by default
ng_ipacct_xl0_start=${ng_ipacct_default_ether_start}
ng_ipacct_xl0_stop=${ng_ipacct_default_ether_stop}
ng_ipacct_xl0_checkpoint_script="path/to/your/script --checkpoint-and-save xl0"
                        # this script is called on "stop" (to save accumulated
                        # data) or via "rc.d/ng_ipacct.sh checkpoint"
ng_ipacct_cx0_dlt="RAW"
ng_ipacct_cx0_start='
        mkpeer %%iface%%: cisco rawdata downstream
        name %%iface%%:rawdata %%iface%%_hdlc
        mkpeer %%iface%%_hdlc: tee inet left
        name %%iface%%_hdlc:inet %%iface%%_tee
        mkpeer %%iface%%_tee: iface right inet
        mkpeer %%iface%%_tee: ipacct right2left %%iface%%_in
        name %%iface%%_tee:right2left %%iface%%_ip_acct
        connect %%iface%%_tee: %%iface%%_ip_acct: left2right %%iface%%_out
'
ng_ipacct_cx0_stop='
        shutdown %%iface%%_ip_acct:
        shutdown %%iface%%_tee:
        shutdown %%iface%%_hdlc:
'
ng_ipacct_vpn0_dlt="RAW"
ng_ipacct_vpn0_start='
        mkpeer ipacct dummy dummy
        name .:dummy %%iface%%_ip_acct
        mkpeer %%iface%%_ip_acct: ksocket %%iface%%_in inet/raw/divert
        name %%iface%%_ip_acct:%%iface%%_in ks_%%iface%%_in
        msg ks_%%iface%%_in: bind inet/0.0.0.0:4001
        mkpeer %%iface%%_ip_acct: ksocket %%iface%%_out inet/raw/divert
        name %%iface%%_ip_acct:%%iface%%_out ks_%%iface%%_out
        msg ks_%%iface%%_out: bind inet/0.0.0.0:4002
        rmhook .:dummy
'
ng_ipacct_vpn0_stop='
        shutdown %%iface%%_ip_acct:
'
ng_ipacct_xl0_dlt="EN10MB" # required line; see ipacctctl(8)
ng_ipacct_xl0_threshold="15000" # '5000' by default
ng_ipacct_xl0_verbose="yes" # 'yes' by default
ng_ipacct_xl0_saveuid="yes" # 'no' by default
ng_ipacct_xl0_savetime="no" # 'no' by default
ng_ipacct_xl0_start=${ng_ipacct_bpf_ether_start}
ng_ipacct_xl0_stop=${ng_ipacct_bpf_ether_stop}
ng_ipacct_xl0_checkpoint_script="path/to/your/script --checkpoint-and-save xl0"
                        # this script is called on "stop" (to save accumulated
                        # data) or via "rc.d/ng_ipacct.sh checkpoint"
ng_ipacct_xl0_afterstart_script="path/to/your/script --load-bpf-filters xl0"
                        # this script is called just after initialization
                        # of nodes to load filters into xl0_bpf
ng_ipacct_ks_start='
        mkpeer ipacct dummy dummy
        name .:dummy %%iface%%_ip_acct
        mkpeer %%iface%%_ip_acct: tee %%iface%%_in left2right
        name %%iface%%_ip_acct:%%iface%%_in %%iface%%_tee_in
        mkpeer %%iface%%_ip_acct: tee %%iface%%_out left2right
        name %%iface%%_ip_acct:%%iface%%_out %%iface%%_tee_out
        mkpeer %%iface%%_tee_in: echo right in
        name %%iface%%_tee_in:right %%iface%%_echo_in
        mkpeer %%iface%%_tee_out: echo right out
        name %%iface%%_tee_out:right %%iface%%_echo_out

        mkpeer %%iface%%_tee_in: ksocket left inet/raw/divert
        name %%iface%%_tee_in:left %%iface%%_ks_in
        msg %%iface%%_ks_in: bind inet/0.0.0.0:4001
        mkpeer %%iface%%_tee_out: ksocket left inet/raw/divert
        name %%iface%%_tee_out:left %%iface%%_ks_out
        msg %%iface%%_ks_out: bind inet/0.0.0.0:4002
        rmhook .:dummy
'
ng_ipacct_ks_stop='
        shutdown %%iface%%_ks_in:
        shutdown %%iface%%_ks_out:
        shutdown %%iface%%_tee_in:
        shutdown %%iface%%_tee_out:
'
ng_ipacct_ks_dlt="RAW" # required line; see ipacctctl(8)
ng_ipacct_ks_threshold="15000" # '5000' by default
ng_ipacct_ks_verbose="yes" # 'yes' by default
ng_ipacct_ks_saveuid="yes" # 'no' by default
ng_ipacct_ks_savetime="no" # 'no' by default
ng_ipacct_ks_checkpoint_script="path/to/your/script --checkpoint-and-save ks"
                       # this script is called on "stop" (to save accumulated
                       # data) or via "rc.d/ng_ipacct.sh checkpoint"
ng_ipacct_rl0_dlt="EN10MB" # required line; see ipacctctl(8)
ng_ipacct_rl0_threshold="15000" # '5000' by default
ng_ipacct_rl0_verbose="yes" # 'yes' by default
ng_ipacct_rl0_saveuid="no" # 'no' by default
ng_ipacct_rl0_savetime="yes" # 'no' by default
ng_ipacct_rl0_start=${ng_ipacct_default_ether_start}
ng_ipacct_rl0_stop=${ng_ipacct_default_ether_stop}
ng_ipacct_rl0_checkpoint_script="/usr/sut/ipacct.sh rl0"
                        # this script is called on "stop" (to save accumulated
                        # data) or via "rc.d/ng_ipacct.sh checkpoint"
ng_ipacct_re0_dlt="EN10MB" # required line; see ipacctctl(8)
ng_ipacct_re0_threshold="15000" # '5000' by default
ng_ipacct_re0_verbose="yes" # 'yes' by default
ng_ipacct_re0_saveuid="no" # 'no' by default
ng_ipacct_re0_savetime="yes" # 'no' by default
ng_ipacct_re0_start=${ng_ipacct_default_ether_start}
ng_ipacct_re0_stop=${ng_ipacct_default_ether_stop}
ng_ipacct_re0_checkpoint_script="/usr/sut/ipacct.sh re0"
                        # this script is called on "stop" (to save accumulated
                        # data) or via "rc.d/ng_ipacct.sh checkpoint"
mkdir /usr/sut

Там же создаем скрипты и файлы для работы нашей системы

root@tst:/usr/sut # touch daily_istat.pl daily_pstat.pl daily_sumnp.pl daily_traf.sh ipacct.sh ipbas ipbase ipblan ipbreal ipmac.base

где *.pl и *.sh рабочие скрипты, а файлы вида ip* – список IP адресов сети.

Наполняем скрипты:

root@ring:/usr/sut # cat ipacct.sh
#!/bin/sh
# /usr/sut/ipacct.sh

IPACCTCTL="/usr/local/sbin/ipacctctl"
INTERFACES="rl0"
IFACE=$1
DIR=/usr/sut/ipacct

if [ ! -e "DIR" ]; then
 mkdir $DIR
fi

NAME="traf.log"
NAMEI=$NAME.$IFACE

for IFACE in $INTERFACES; do
$IPACCTCTL ${IFACE}_ip_acct:$IFACE checkpoint
$IPACCTCTL ${IFACE}_ip_acct:$IFACE show >> $DIR/$NAMEI
$IPACCTCTL ${IFACE}_ip_acct:$IFACE clear
done

dp=`/bin/date +%y%m%d-%H:%M`
messag=`/usr/bin/tail -1 $DIR/$NAMEI | /usr/bin/fgrep exceed`
if [ "$messag" ]; then
echo "$dp $messag" >> /usr/sut/ipacct/alarm.$IFACE
fi
root@ring:/usr/sut # cat daily_istat.pl
#!/usr/local/bin/perl
#
# /usr/sut/daily_istat.pl (daily_istat.pl interface)
# --interface "re0-inet, rl0-lan"

$iface1 = "re0";
$net1 = "194.44.";
$iface2 = "rl0";
$net2 = "192.168.";
#$net2 = /[0-9].[0-9]./;

$iface = shift(@ARGV);

if ($iface eq $iface1) {
        $ipi = "ipbreal";
        $net = $net1;
        }
if ($iface eq $iface2) {
        $ipi = "ipblan";
        $net = $net2;
        }
open (Fip, "/usr/sut/ipmac.base");
open (Fipi, ">/usr/sut/$ipi");
open (Fipii, ">/usr/sut/ipbas");
open (Fipiii, ">/usr/sut/ipbase");
$i = 0;
$j = 0;
while ($line = <Fip>) {
        ($p1,$xlam) = split(' ',$line,2);
        if ($p1 =~ /$net/) {
        print Fipi "$i $p1\n";
        print Fipii "$i $p1\n";
        $i = $i + 1;
        }
        $j = $j + 1;
        print Fipiii "$j       $p1\n";
}
$count = $i;
close (Fip);
close (Fipi);
close (Fipii);
close (Fipiii);


#goto Z1;
open (Fy, "/usr/sut/workyer");
chomp($y = <Fy>);
close (Fy);
open (Fm, "/usr/sut/workmon");
chomp($m = <Fm>);
close (Fm);
open (Fd, "/usr/sut/workday");
chomp($d = <Fd>);
close (Fd);
Z1:
goto Z2;
$y = "13";
$m = "08";
$d = "30";
Z2:

open (Fipii, "/usr/sut/ipbas");
@mip = <Fipii>;
close (Fipii);

$infile = "/usr/sut/$y.$m/$y$m$d.$iface";
open (InF, "$infile");

for ($i = 0; $i < $count; $i++) {
$ipin[$i] = 0;
$ipout[$i] = 0;
$ipsum[$i] = 0;
}

while ($line = <InF>) {
        ($p1,$p2,$p3,$p4,$p5,$p6,$p7,$p8) = split(/     /,$line,8);
        foreach $str (@mip) {
        chomp($str);
        ($i,$ip) = split(/     /,$str,2);
                 if ($p1 eq $ip) {
                 $ipin[$i] = $ipin[$i] + $p7;
                 }
                 if ($p3 eq $ip) {
                 $ipout[$i] = $ipout[$i] + $p7;
                 }
         }
}

close (InF);
#---------------------------------
#goto ZZ;


open (TrF, ">>$infile.o");
$sumfile = "/usr/sut/$y.$m/tsum$y$m.$iface";
open (TrSum, ">>$sumfile");

$Mb = 1048576;
#$Mb = 10;

for ($i = 0; $i < $count; $i++) {
$str = @mip[$i];
chomp($str);
($xlam,$ip) = split(/ /,$str,2);
$ipin[$i] = int ($ipin[$i] / $Mb);
$ipout[$i] = int ($ipout[$i] / $Mb);
$ipsum[$i] = $ipin[$i] + $ipout[$i];

if ($ipsum[$i] > 0) {
printf TrF ("%-15s%15d%15d%15d\n", $ip, $ipin[$i], $ipout[$i], $ipsum[$i]);

if ($d eq "01") {
printf TrSum ("%-15s%15d%15d%15d\n", $ip, $ipin[$i], $ipout[$i], $ipsum[$i]);
}
}
}

close (TrF);
close (TrSum);

if ($d eq "01") {
goto ZZ;
}

#goto ZZ;

open (TekF, "/usr/sut/$y.$m/$y$m$d.$iface.o");
@mt = <TekF>;
close (TekF);

open (SumF, "/usr/sut/$y.$m/tsum$y$m.$iface");
@mts = <SumF>;
close (SumF);


open (SumF, "+>/usr/sut/$y.$m/tsum$y$m.$iface");

for ($k = 0; $k < $count; $k++) {
$str = @mip[$k];
chomp($str);
($k,$ip) = split(/     /,$str,2);
        for ($i = 0; $i < $count; $i++) {
        $line1 = @mts[$i];
#       $line1 = @m[$i];
        ($ip1,$in1,$out1,$sum1) = split(/ +/,$line1,4);
        $line2 = @mt[$i];
        ($ip2,$in2,$out2,$sum2) = split(/ +/,$line2,4);

        if ($ip eq $ip1) {
        $ins[$k] = $ins[$k] + $in1;
        $outs[$k] = $outs[$k] + $out1;
        $sums[$k] = $sums[$k] + $sum1;
        }

        if ($ip eq $ip2) {
        $ins[$k] = $ins[$k] + $in2; 
        $outs[$k] = $outs[$k] + $out2;
        $sums[$k] = $sums[$k] + $sum2;
        }
        }
if ($sums[$k] > 0) {
printf SumF ("%-15s%15d%15d%15d\n", $ip, $ins[$k], $outs[$k], $sums[$k]);
}
}

close (SumF);

ZZ:

#END
root@ring:/usr/sut # cat daily_pstat.pl
#!/usr/local/bin/perl
#
# /usr/sut/daily_pstat.pl
#

#goto Z1;
open (Fy, "/usr/sut/workyer");
chomp($y = <Fy>);
close (Fy);
open (Fm, "/usr/sut/workmon");
chomp($m = <Fm>);
close (Fm);
open (Fd, "/usr/sut/workday");
chomp($d = <Fd>);
close (Fd);

Z1:
goto Z2;
$y = "13";
$m = "08";
$d = "30";
Z2:

$file = "$y$m$d";

@temp = `cat /usr/sut/$y.$m/$file.log | \
 /usr/local/bin/calamaris -n -r -1 -S 14 -O -U M`;
$i = 0;
foreach $line (@temp) {
 ${ip[$i]} = substr($line,0,16);
 ${byte[$i]} = substr($line,51,8);
$i++;
}

$n = $i-7;

open (FH,">/usr/sut/$y.$m/$file.log.o");

print FH $temp[1];
print FH $temp[2];
print FH $temp[3];
print FH $temp[4];
print FH $temp[5];
print FH $temp[6];
for ($k = 7; $k<$n; $k++) {
print FH ${ip[$k]},${byte[$k]},"\n";
}
close (FH);

open (IpF, "/usr/sut/ipblan");
@mip = <IpF>;
close (IpF);

$infile = "/usr/sut/$y.$m/$y$m$d.log.o";
open (InF, "$infile");
@mp = <InF>;
close (InF);

$outfile = "/usr/sut/$y.$m/tsum$y$m.log";
open (OutF, "$outfile");
@msum = <OutF>;
close (OutF);

$outfile = "/usr/sut/$y.$m/tsum$y$m.log";
open (OutF, "+>$outfile");

#print "$y $m $d $infile $outfile\n";
#goto ZZ;


foreach $str (@mip) {
chomp($str);
($i,$ip) = split(/ /,$str,2);
 $ipsums[$i] = 0;
 foreach $strs (@msum) {
 ($ips,$ipsum) = split(/ +/,$strs,2);
 if ($ip eq $ips) {
 $ipsums[$i] = $ipsum;
 }
 }
 foreach $line (@mp) {
 ($p1,$p2) = split(/ /,$line,2);
 $p2 =~ tr/M\n/ /;
 if ($ip eq $p1 & $p2 > 0) {
 $ipsums[$i] = $ipsums[$i] + $p2;
 if ($d eq "01") {
 printf OutF ("%-15s%15d\n", $ip, $p2);
 }
 }
 }
 if ($d ne "01" & $ipsums[$i] > 0) {
 printf OutF ("%-15s%15d\n", $ip, $ipsums[$i]);
 }
}
close (OutF);

ZZ:

#END
root@ring:/usr/sut # cat daily_sumnp.pl
#!/usr/local/bin/perl
# Proxy + NAT
# /usr/sut/sum_n_p.pl

$iface = "rl0";

#goto Z1;
open (Fy, "/usr/sut/workyer");
chomp($y = <Fy>);
close (Fy);
open (Fm, "/usr/sut/workmon");
chomp($m = <Fm>);
close (Fm);
open (Fd, "/usr/sut/workday");
chomp($d = <Fd>);
close (Fd);
Z1:
goto Z2;
$y = "13";
$m = "08";
$d = "30";
Z2:
open (IpF, "/usr/sut/ipblan");
@mip = <IpF>;
close (IpF);

$infile1 = "/usr/sut/$y.$m/tsum$y$m.log";
open (InF1, "$infile1");
@mproxy = <InF1>;
close (InF1);

$infile2 = "/usr/sut/$y.$m/tsum$y$m.$iface";
open (InF2, "$infile2");
@mnat = <InF2>;
close (InF2);

$outfile = "/usr/sut/$y.$m/sumnp$y$m";
open (OutF, "+>$outfile");

#print "$y $m $d\n $infile1\n $infile2\n $outfile\n";
#goto ZZ;
#---------------
$trafproxy = 0;
$trafnat = 0;
$traflan = 0;
$trafproxyr = 0;
$trafnatr = 0;
$traflanr = 0;

foreach $str (@mip) {
chomp($str);
($i,$ip) = split(/ /,$str,2);
 $tsum[$i] = 0;
 $tproxyp[$i] = 0;
 $tsump[$i] = 0;
 foreach $linep (@mproxy) {
 ($ipp,$tproxy) = split(/ +/,$linep,2);
 if ($ip eq $ipp) {
 $tsum[$i] = $tproxy;
 $tproxyp[$i] = $tproxy;
 }
 }
 foreach $linen (@mnat) {
 ($ipn,$inn,$outn,$sumn) = split(/ +/,$linen,4);
 if ($ip eq $ipn) {
 $tsum[$i] = $tsum[$i] + $sumn;
 $tsump[$i] = $sumn;
 }
 }
if ($ip =~ /192.168./) {
$trafproxy = $trafproxy + $tproxyp[$i];
$trafnat = $trafnat + $tsump[$i];
$traflan = $traflan + $tsum[$i];
}
if ($ip =~ /194.***./) {
$trafproxyr = $trafproxyr + $tproxyp[$i];
$trafnatr = $trafnatr + $tsump[$i];
$traflanr = $traflanr + $tsum[$i];
}
$trafproxys = $trafproxy + $trafproxyr;
$trafnats = $trafnat + $trafnatr;
$traflans = $traflan + $trafnatr;

if ($tsum[$i] > 0) {
printf OutF ("%-15s%15d%15d%15d\n", $ip, $tproxyp[$i], $tsump[$i], $tsum[$i]);
}
}
printf OutF ("%-15s%15d%15d%15d\n", "L Pr Nat Summ", $trafproxy, $trafnat, $traflan);
printf OutF ("%-15s%15d%15d%15d\n", "R Pr Nat Summ", $trafproxyr, $trafnatr, $traflanr);
printf OutF ("%-15s%15d%15d%15d\n", "LR Pr Nat Summ", $trafproxys, $trafnats, $traflans);

close (OutF);

ZZ:

`cp $outfile /usr/sut/traffic`;

#END
root@ring:/usr/sut # cat daily_traf.sh
#!/bin/sh
# /usr/sut/daily_traf.sh
# Interfaces (out - WAN, in - LAN)
if_out='re0'
if_in='rl0'

y=`/bin/date +%y`
m=`/bin/date +%m`
d=`/bin/date +%d`

echo "$y" > /usr/sut/workyer
echo "$m" > /usr/sut/workmon
echo "$d" > /usr/sut/workday

DIR=/usr/sut/$y.$m
if [ ! -e "DIR" ]; then
 mkdir $DIR
fi

mv /usr/sut/ipacct/traf.log.$if_out $DIR/$y$m$d.$if_out
mv /usr/sut/ipacct/traf.log.$if_in $DIR/$y$m$d.$if_in
if [ -e /usr/sut/ipacct/alarm.$if_out ]; then
mv /usr/sut/ipacct/alarm.$if_out /usr/sut/ipacct/a$y$m$d.$if_out
fi
if [ -e /usr/sut/ipacct/alarm.$if_in ]; then
mv /usr/sut/ipacct/alarm.$if_in /usr/sut/ipacct/a$y$m$d.$if_in
fi

cp /var/log/squid/access.log $DIR/$y$m$d.log
#cp /dev/null /var/log/squid/access.log

Теперь рабочие файлы:

root@ring:/usr/sut # cat ipbas
0     192.168.113.0
1     192.168.113.1
2     192.168.113.2
.....................
255   192.168.113.255
root@ring:/usr/sut # less ipbase
1     192.168.113.0
2     192.168.113.1
3     192.168.113.2
4     192.168.113.3
5     192.168.113.4
.........................

255   192.168.113.254
256   192.168.113.255
257   194.***.***.**1
258   194.***.***.**2
259   194.***.***.**3
root@ring:/usr/sut # cat ipblan
0     192.168.113.0
1     192.168.113.1
...................

253   192.168.113.253
254   192.168.113.254
255   192.168.113.255
root@ring:/usr/sut # cat ipbreal
0     194.***.***.***
1     194.***.***.***
2     194.***.***.***
3     194.***.***.***

root@ring:/usr/sut # cat ipmac.base
192.168.113.0     sn                      00   001   -----        ----
192.168.113.1     mc  68:05:ca:02:06:62   00   002   g0309   1496   roller
192.168.113.2     bl                      00
192.168.113.3     bl                      00
192.168.113.4     bl                      00
192.168.113.5     bl                      00
192.168.113.6     bl                      00
192.168.113.7     mc  00:07:e9:b8:ad:ee   00   024   g0310    ----     pktn
......................................

Добавляем в крон

root@ring:/usr/sut # cat /etc/crontab
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
MAILTO=""
#minute hour mday month wday who    command
#
*/4     *    *    *     *    root   /usr/local/etc/rc.d/ng_ipacct checkpoint > /dev/null
59      23   *    *     *    root   /usr/sut/daily_traf.sh
10      0    *    *     *    root   /usr/sut/daily_istat.pl re0
20      0    *    *     *    root   /usr/sut/daily_istat.pl rl0
30      0    *    *     *    root   /usr/sut/daily_pstat.pl
1       4    *    *     *    root   /usr/sut/daily_sumnp.pl

Проверка:

root@ring:/usr/sut # ngctl ls
There are 10 total nodes:
 Name: ngctl4605   Type: socket    ID: 000001e2    Num hooks: 0
 Name: mpd658-lso  Type: socket    ID: 00000003    Num hooks: 0
 Name: mpd658-cso  Type: socket    ID: 00000004    Num hooks: 0
 Name: mpd658-eso  Type: socket    ID: 00000005    Num hooks: 0
 Name: re0         Type: ether     ID: 00000006    Num hooks: 2
 Name: rl0         Type: ether     ID: 00000007    Num hooks: 2
 Name: rl0_tee     Type: tee       ID: 00000009    Num hooks: 4
 Name: rl0_ip_acct Type: ipacct    ID: 0000000a    Num hooks: 2
 Name: re0_tee     Type: tee       ID: 00000012    Num hooks: 4
 Name: re0_ip_acct Type: ipacct    ID: 00000013    Num hooks: 2
root@ring:/usr/sut # kldstat
Id Refs Address            Size      Name
 1 46   0xffffffff80200000 1f6e480   kernel
 2 1    0xffffffff82170000 316728    zfs.ko
 3 2    0xffffffff82487000 cb78      opensolaris.ko
 4 4    0xffffffff82494000 44bd8     ipfw.ko
 5 1    0xffffffff824d9000 9bd0      ipfw_nat.ko
 6 2    0xffffffff824e3000 17288     libalias.ko
 7 1    0xffffffff824fb000 28dd0     dummynet.ko
 8 1    0xffffffff82524000 8d40      ipdivert.ko
 9 1    0xffffffff82621000 2986      uhid.ko
10 1    0xffffffff82624000 39cc      ng_socket.ko
11 5    0xffffffff82628000 c57d      netgraph.ko
12 1    0xffffffff82635000 42ab      ng_mppc.ko
13 1    0xffffffff8263a000 81f       rc4.ko
14 1    0xffffffff8263b000 43da      ng_ether.ko
15 1    0xffffffff82640000 17db      ng_ipacct.ko
16 1    0xffffffff82642000 17ce      ng_tee.ko

Пример лога (файл вида /usr/sut/18.04/180408.re0):

Адр. источника   Порт    Адр. получателя  Порт   № прот. Пакетов Байт
192.168.113.11   5230    192.168.113.1    3551   6       2       92     -1
192.168.113.11   5230    192.168.113.1    3551   6       4       168    0
192.168.113.11   5225    192.168.113.1    3551   6       2       92     -1
192.168.113.11   5225    192.168.113.1    3551   6       4       168    0
192.168.113.11   5223    192.168.113.1    3551   6       2       92     -1
192.168.113.11   5223    192.168.113.1    3551   6       4       168    0
192.168.113.17   50646   193.47.166.29    123    17      1       76     -1
192.168.113.11   5233    192.168.113.1    3551   6       2       92     -1
192.168.113.11   5233    192.168.113.1    3551   6       4       168    0
192.168.113.11   4427    92.157.81.29     28858  6       3       471    -1
10.90.90.90      0       239.255.255.100  0      2       2       184    0
192.168.113.11   5213    34.252.56.124    443    6       8       2664   100

где – номер протокола (описываются в /etc/protocols)

image_pdfimage_print

src – доустановить

В большинстве случаев поможет решение вида:

root@tst:/usr # fetch -o /tmp ftp://ftp.freebsd.org/pub/`uname -s`/releases/`uname -m`/`uname -r | cut -d'-' -f1,2`/src.txz
/tmp/src.txz                                        100% of 140 MB 1290 kBps 01m52s

root@tst:/usr # tar -C / -xvf /tmp/src.txz


image_pdfimage_print

SQUID 3.5 – прозрачный прокси

Система:

uname -a
11.1-RELEASE-p8 FreeBSD 11.1-RELEASE-p8 #0: root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC amd64

1. Установка

portsnap fetch update
portmaster www/squid

При выборе опций – мне хватило их по умолчанию, но, на всякий случай, проверяем такие:

В параметрах сборки проверяем, что включена поддержка прозрачного проксирования для используемого брандмауэра (IPFW) и поддержка больших файлов LARGEFILE, ECAP, SSL, SSL_CRTD, а также, если необходима, модификация HTTP-заголовков (использование опций via, request_header_access),  включаем LAX_HTTP, для сборки Squid с параметром –enable-http-violations.

 lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq squid-3.5.27_3 qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
 x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
 x x+[x] ARP_ACL ARP/MAC/EUI based authentification                           x x
 x x+[x] CACHE_DIGESTS Use cache digests                                      x x
 x x+[ ] DEBUG Build with extended debugging support                          x x
 x x+[x] DELAY_POOLS Delay pools (bandwidth limiting)                         x x
 x x+[x] DOCS Build and/or install documentation                              x x
 x x+[х] ECAP Loadable content adaptation modules                             x x
 x x+[ ] ESI ESI support                                                      x x
 x x+[x] EXAMPLES Build and/or install examples                               x x
 x x+[x] FOLLOW_XFF Support for the X-Following-For header                    x x
 x x+[x] FS_AUFS AUFS (threaded-io) support                                   x x
 x x+[x] FS_DISKD DISKD storage engine controlled by separate service         x x
 x x+[x] FS_ROCK ROCK storage engine                                          x x
 x x+[x] HTCP HTCP support                                                    x x
 x x+[x] ICAP the ICAP client                                                 x x
 x x+[x] ICMP ICMP pinging and network measurement                            x x
 x x+[x] IDENT Ident lookups (RFC 931)                                        x x
 x x+[x] IPV6 IPv6 protocol support                                           x x
 x x+[x] KQUEUE Kqueue(2) support                                             x x
 x x+[x] LARGEFILE Support large (>2GB) cache and log files                   x x
 x x+[x] LAX_HTTP Do not enforce strict HTTP compliance                       x x
 x x+[ ] NETTLE Nettle MD5 algorithm support                                  x x
 x x+[x] PCRE Use Perl Compatible Regular Expressions                         x x
 x x+[x] SNMP SNMP support                                                    x x
 x x+[x] SSL SSL gatewaying support                                           x x
 x x+[x] SSL_CRTD Use ssl_crtd to handle SSL cert requests                    x x
 x x+[ ] STACKTRACES Enable automatic backtraces on fatal errors              x x
 x x+[x] VIA_DB Forward/Via database                                          x x
 x x+[x] WCCP Web Cache Coordination Protocol                                 x x
 x x+[x] WCCPV2 Web Cache Coordination Protocol v2                            x x
 x xqqqqqqqqqqqqqqqqqqqqqqqqqq Authentication helpers qqqqqqqqqqqqqqqqqqqqqqqqx x
 x x+[ ] AUTH_LDAP Install LDAP authentication helpers                        x x
 x x+[x] AUTH_NIS Install NIS/YP authentication helpers                       x x
 x x+[ ] AUTH_SASL Install SASL authentication helpers                        x x
 x x+[ ] AUTH_SMB Samba authentication helpers                                x x
 x x+[ ] AUTH_SQL Install SQL based auth                                      x x
 x xqqqqqqqqqqqqqqqqqqqqqqq GSSAPI Security API support qqqqqqqqqqqqqqqqqqqqqqx x
 x x+( ) GSSAPI_NONE Disable GSSAPI support                                   x x
 x x+(*) GSSAPI_BASE GSSAPI support via base system (needs Kerberos)          x x
 x x+( ) GSSAPI_HEIMDAL GSSAPI support via security/heimdal                   x x
 x x+( ) GSSAPI_MIT GSSAPI support via security/krb5                          x x
 x xqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq FW qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqx x
 x x+( ) TP_IPF Transparent proxying with IPFilter                            x x
 x x+(*) TP_IPFW Transparent proxying with IPFW                               x x
 x x+( ) TP_PF Transparent proxying with PF                                   x x
 x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x
 tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu
 x                           < OK >        <Cancel>                             x
 mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj

2. Настройка

Правим

/usr/local/etc/squid/squid.conf
#
# Recommended minimum configuration:
#

visible_hostname squid
dns_nameservers 194.44.219.162 8.8.8.8

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
#acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
#acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.113.0/24 # RFC1918 possible internal network
#acl localnet src fc00::/7 # RFC 4193 local private network range
#acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines

acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
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 CONNECT method CONNECT

# Добавление в acl списков для users и urls/domain: запрещенные, разрешенные 
# и группа расширенного доступа (отключена)
acl denied_users src "/usr/local/etc/squid/denied_users"
acl denied_urls url_regex "/usr/local/etc/squid/denied_urls"
acl allowed_users src "/usr/local/etc/squid/allowed_users"
#acl allowed_urls url_regex "/usr/local/etc/squid/allowed_urls"
#acl extended_access_group src "/usr/local/etc/squid/extended_access_group"

# Deny requests to certain unsafe ports
http_access deny !Safe_ports

# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports

# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager

## Разрешаем осуществлять коннект к ресурсу, если https
http_access allow localnet CONNECT

## Запрещаем всем доступ на запрещенные сайты
http_access deny denied_users denied_urls
http_access allow allowed_users

## Этим правилом разрешаем всем кто не в группе расширенного доступа ходить только на
# разрешенные сайты
# http_access deny !extended_access_group !allowed_urls

http_access allow localnet
http_access allow localhost
http_access deny all

## Обязательно один из портов должен быть в таком виде и являться заглушкой
http_port 3130
http_port 3128 intercept
https_port 3129 intercept ssl-bump options=ALL:NO_SSLv3:NO_SSLv2 connection-auth=off cert=/usr/local/etc/squid/squidCA.pem

always_direct allow all
sslproxy_cert_error allow all
sslproxy_flags DONT_VERIFY_PEER


## Правила доступа для ssl

# правило со списком блокируемых ресурсов (в файле домены вида .domain.com)
acl blocked ssl::server_name_regex "/usr/local/etc/squid/denied_urls"
acl step1 at_step SslBump1
ssl_bump peek step1

# терминируем соединение, если клиент заходит на запрещенный ресурс
ssl_bump terminate blocked
ssl_bump splice all

sslcrtd_program /usr/lib/squid/ssl_crtd -s /var/lib/ssl_db -M 4MB

# Uncomment and adjust the following to add a disk cache directory.
#cache_dir ufs /var/squid/cache 100 16 256

# Leave coredumps in the first cache dir
coredump_dir /var/squid/cache

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320

Создаем файлы:

touch /usr/local/etc/squid/denied_urls
cat /usr/local/etc/squid/denied_urls
.pornhub.com
.xxx.com
touch /usr/local/etc/squid/denied_users
cat /usr/local/etc/squid/denied_users
192.168.113.110 # menagers dep
192.168.113.203 # 

touch /usr/local/etc/squid/allowed_users
cat /usr/local/etc/squid/allowed_users
192.168.113.0/24 # вся сеть
touch /usr/local/etc/squid/extended_access_group
cat /usr/local/etc/squid/extended_access_group
192.168.0.12 # Masha
192.168.0.15 # Direktor
192.168.0.53 # Sasha
192.168.0.54 # My Note

Делаем сертификат

cd /usr/local/etc/squid/
openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout squidCA.pem -out squidCA.pem

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

squid_enable="YES"

Инициализируем кеш:

squid -z

Добавляем правила в IPFW

### LAN
${ipfw} add allow ip from any to any via ${lan}

### SQUID прозрачный
${ipfw} add fwd 127.0.0.1,3128 tcp from table\(0\) to any 80 out via ${wan}
${ipfw} add fwd 127.0.0.1,3129 tcp from table\(0\) to any 443 out via ${wan}

Перезапускаем IPFW и стартуем squid:

/etc/rc.d/ipfw restart
service squid start

Проверяем.

https://www.ew8bak.ru/2017/02/14/

https://wiki.squid-cache.org/ConfigExamples/Intercept/Ipfw

 

image_pdfimage_print