Software

Rsync Server

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

По умолчанию, утилита может бытьне установлена в системе. Установка и последующий запуск выполняются следующими командами.

apt-get install rsync

Открываем следующий файл:

vi /etc/default/rsync

Находим запись:

RSYNC_ENABLE=false

И меняем на:

RSYNC_ENABLE=true

Открываем конфигурационный файл rsync:

vi /etc/rsyncd.conf

И настраиваем его, примерно, следующим образом:

max connections = 10
exclude = lost+found/
dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 *.rar *.7z *.mp3 *.jpg
 

[data1]
    path = /data1/
    comment = Public folders
    read only = yes
    list = yes
    auth users = rsync_d1
    secrets file = /etc/rsyncd.scrt
    hosts allow = localhost 192.168.0.15 192.168.0.20
    hosts deny = *
 

[data2]
    uid = root
    gid = root
    path = /data2/
    comment = Private folders
    read only = yes
    list = yes
    auth users = rsync_d2, backup
    secrets file = /etc/rsyncd.scrt
    hosts allow = localhost 192.168.0.16 192.168.0.21
    hosts deny = *

Где первая группа параметров являются общими настройками:

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

А также каждый ресурс настраивается отдельно (в нашем примере data1 и data2):

  • uid — пользователь, от которого будет выполнена синхронизация для конкретного ресурса.
  • gid — группа, от которой будет выполнена синхронизация для конкретного ресурса.
  • path — путь до ресурса, для которого выполняется синхронизация.
  • comment — описание для удобства.
  • read only — режим для чтения; позволяет защитить данные от удаления или изменения.
  • list — разрешает или запрещает чтения содержимого каталога. Если запрещено (no), синхронизация может выполняться для конкретно перечисленных файлов.
  • auth users — проверка подлинности, вводом логина с паролем.
  • secrets file — файл, в котором размещены логин и пароль.
  • hosts allow — перечисление хостов, с которых разрешено обращаться к rsync серверу.
  • hosts deny — перечисление хостов, с которых запрещено обращаться к rsync серверу (в данном примере, со всех, кроме разрешенных).

Создаем файл для аутентификации:

vi /etc/rsyncd.scrt
rsync_d1:password1
rsync_d2:password2
backup:password3

Где rsync_d1:password1 — соответственно, пользователь rsync_d1 с паролем password1.

В целях безопасности, устанавливаем доступ только для владельца:

chmod 600 /etc/rsyncd.scrt

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

systemctl restart rsyncd

Добавляем порты в брандмауэр.

Устанавливаем rsync, если еще не установлен:

apt-get install rsync

Запускаем синхронизацию:

rsync -avv rsync_d1@192.168.0.5::data1 /tmp/

Пример готового скрипта для синхронизации папок

#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

password_file='/etc/rsyncd.scrt'
user='opros'
ip='192.168.0.15'
source='data1'
destination='/tmp/'

rsync -a --delete-after --password-file=$password_file $user@$ip::$source $destination

* где:

  • password_file — пароль, в котором будет храниться пароль.
  • user — учетная запись для авторизации.
  • ip — IP-адрес сервера rsync.
  • source — имя ресурса на сервере.
  • destination — каталог, в который синхронизируем файлы.

После создаем файл с паролем:

vi /etc/rsyncd.scrt
password

* в данном файле указываем только пароль без имени учетной записи.

После задаем права:

chmod 600 /etc/rsyncd.scrt

Автоматизировать синхронизацию можно с помощью CRON:

crontab -e
0 */1 * * * /scripts/syncing.sh

* где /scripts/syncing.sh — наш скрипт. В данном примере задание будет выполняться каждый час.

Ключ Описание
-v, –verbose Вывод подробной информации о процессе синхронизации. Стоит использовать для отладки.
-q, –quiet Не выводит сообщения об ошибках.
–no-motd Не выводит приветствие в MOTD
-c, –checksum Сравнивать файлы по контрольной сумме, а не времени или размеру.
-a, –archive Режим архивирования или то же самое, что с ключами -rlptgoD (без -H,-A,-X). Используется для удобства, чтобы не перечислять много опций.
–no-<опция> Отключает конкретную опцию, например, вышеописанная no-motd.
-r, –recursive Рекурсивный режим для каталогов.
-R, –relative Использовать относительные пути.
–no-implied-dirs Выключить параметр –relative.
-b, –backup Режим резервного копирования. С его помощью при обновлении файлов в папке назначения для них создается копия.
–backup-dir=<каталог> В режиме резервного копирования указывает каталог, в котором будут храниться копии.
–suffix=SUFFIX В режиме резервного копирования задает суффикс для сохраненных файлов
-u, –update Пропускать файлы, которые новее в папке назначения (копировать только измененные файлы).
-d, –dirs Не использовать рекурсию для каталогов.
-l, –links Копировать симлинки как симлинки.
-L, –copy-links Копировать не симлинк а ее содержимое (трансформировать симлинк в каталог).
-k, –copy-dirlinks Преобразовать симлинк на каталог в обычный каталог.
-K, –keep-dirlinks В папке назначения обрабатывать симлинк как каталог.
-H, –hard-links Сохранять жесткие ссылки.
-p, –perms Сохранять разрешения (права доступа).
-E, –executability Сохранить права на исполнение.
–chmod=<права> Изменить права доступа на конкретные.
-A, –acls Сохранить права ACL.
-X, –xattrs Сохранить атрибуты файлов.
-o, –owner Сохранить владельца (только от суперпользователя).
-g, –group Сохранить группу владельца.
–devices Копировать файлы-устройства (разрешено только при выполнении команды с правами суперпользователя).
–copy-devices Копировать файлы устройства как обычные файлы.
–specials Сохранять специальные файлы.
-D Заменяет –devices и –specials одновременно.
-t, –times Сохранять временные отметки.
-S, –sparse Выполнение дефрагментации в момент копирования данных.
-n, –dry-run Режим тестирования. Выполняется пробный запуск, при котором будет показаны изменения, но сами изменения выполнены не будут.
-W, –whole-file Копировать файлы целиком. По умолчанию, для копирования файлов используется алгоритм дельта-хэфера, который позволяет переносить только часть с изменениями. На практике, это сильно ускоряет процесс копирования. Ключ применяется в тех случаях, когда нужно перенести файл целиком.
-x, –one-file-system Не разрешает переходить границы файловой системы. Например, если в один из синхронизируемых каталогов может быть примонтирована сетевая файловая система, ее копирование может вызвать неудобства.
-B, –block-size=<размер> Принудительно фиксировать размер блока контрольной суммы
-e, –rsh=<команда> Указать оболочку для использования, например SSH.
–existing Не создавать новые файлы в каталоге назначения.
–ignore-existing Не обновлять существующие файлы в каталоге назначения.
–remove-source-files Источник удаляет свои файлы после выполнения синхронизации.
–delete Удалить файлы в папке назначения, если их больше нет в папке источнике (удаление старых файлов).
–delete-before Удалить файлы в папке назначения до начала синхронизации.
–delete-during Удалить файлы в папке назначения в момент синхронизации.
–delete-delay Поиск файлов на удаление в момент синхронизации, а удаление после.
–delete-after Удалить файлы в папке назначения после синхронизации.
–delete-excluded Удалить исключенные из синхронизации файлы в каталоге назначения.
–ignore-errors Удалять файлы даже при ошибках ввода/вывода.
–force Принудительное удаление не пустых каталогов.
–max-delete=<число> Не удалять больше заданного числа файлов.
–max-size=<размер> Не передавать файлы с размером более заданного.
–min-size=<размер> Не передавать файлы с размером менее заданного.
–partial Оставлять файлы, которые переданы не до конца (процесс копирования завершился в процессе).
–partial-dir=<каталог> Хранить частично переданные файлы в специальном каталоге.
–timeout=<секунды> Установить время ожидания от системы ввода/вывода.
–contimeout=<секунды> Установить время ожидания для подключения к демону rsync.
-I, –ignore-times Все равно копировать файлы, если они имеют одинаковые разметы или время изменения.
–size-only Не копировать только те файлы, которые имеют одинаковые размеры.
-T, –temp-dir=<каталог> Все временные файлы размещать в определенном каталоге.
-z, –compress Сжимать данные файла во время передачи
–compress-level=<число> Устанавливает уровень сжатия от 0 до 9.
–skip-compress=<список> Не выполнять компрессию для перечисленных файлов.
-C, –cvs-exclude Исключить от копирования файлы, которые исключаются CVS (RCS/ SCCS/ CVS/ .svn/ CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~ #* .#* ,* *.old *.bak *.BAK *.orig *.rej .del-* *.a *.o *.obj *.so *.Z *.elc *.ln core)
-f, –filter=<правило> Добавить правило для фильтра.
–exclude=<выражение> Исключить из синхронизации файлы, соответствующие выражению.
–exclude-from=<файл> Исключить из синхронизации файлы, перечисленные в файле.
–include=<выражение> Включить в синхронизацию файлы, соответствующие выражению.
–include-from=<файл> Включить в синхронизацию файлы, перечисленные в файле.
–files-from=<файл> Читать список имен исходных файлов из файла.
–address=<IP-адрес> Привязать IP-адрес для исходящего сокета.
–port=<порт> Использовать определенный сетевой порт.
–sockopts=OPTIONS Использовать специальные опции для TCP.
–blocking-io Использовать блокирующий ввод-вывод для удаленной оболочки
–stats Вывод статистики по передаче данных.
-h, –human-readable Вывод чисел в удобном для чтения формате.
–progress Показывать строку прогресса для синхронизации.
-P То же самое, что –partial и –progress.
-i, –itemize-changes Выводить сводку изменений для всех обновлений
–log-file=<файл> Вывод лога в специальный файл.
–password-file=<файл> При аутентификации пароль можно хранить в специальном файле. Это необходимо для автоматизации выполнения команды без пароля.
–list-only Показать список файлов, но не копировать их.
–bwlimit=<число> Ограничить пропускную способность (КБит в секунду).
–protocol=<число> Принудительно использовать более старую версию протокола.
–iconv=<кодировка> Запрос кодировки преобразования имен файлов.
-4, –ipv4 Предпочтительно, использовать IPv4.
-6, –ipv6 Предпочтительно, использовать IPv6.
–version Вывод версии rsync.
(-h) –help Вывод справочной информации по использованию rsync.

* Самый свежий список ключей rsync можно посмотреть командой man rsync.

Gitea

Gitea - лёгкая и нетребовательная к ресурсам система контроля версий (self-hosted). Альтернатива Gitlab, только без без лишних наворотов. Я буду производить установку на VPS с системой Debian 10.

Для начала нужно установить саму ОС.

sudo apt update
sudo apt upgrade
sudo apt install git wget
reboot
sudo adduser \
   --system \
   --shell /bin/bash \
   --gecos 'Git Version Control' \
   --group \
   --disabled-password \
   --home /home/git \
   git
wget -O gitea https://dl.gitea.io/gitea/1.10.1/gitea-1.10.1-linux-amd64
chmod +x gitea
sudo cp gitea /usr/local/bin/gitea
sudo mkdir -p /var/lib/gitea/{custom,data,log}
sudo mkdir /etc/gitea
sudo chown root:git /etc/gitea
sudo chmod 770 /etc/gitea
sudo chown -R git:git /var/lib/gitea
sudo chmod 770 /etc/gitea
sudo chmod 750 /var/lib/gitea
sudo chmod 640 /etc/gitea/app.ini
sudo vim /etc/systemd/system/gitea.service
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target

[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web -c /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start gitea.service
sudo systemctl status gitea.service
sudo systemctl enable gitea.service

Настройки хранятся в файле /etc/gitea/app.ini

screen

Запускаем процессы в фоне с помощью screen

Установка

Чтобы установить screen, воспользуйтесь менеджером пакетов для вашей системы

$ apt install screen

Работа с сессиями

Попробуем создать новую сессию:

$ screen -S my_first_screen_session

Будет запущена новая сессия, как если бы вы авторизовались на сервере в обычной tty-консоли. В ней можно запустить какой-то процесс, «свернуть» ее и продолжить работать в консоли.

Чтобы «свернуть» сессию, нажмите Ctrl+A, затем d. Первый шорткат переведет скрин режим принятия команд, а команда d (disconnect) отключится от текущей сессии, оставив ее запущенной в фоне.

Чтобы вернуться к последней подключенной сессии, введите команду

$ screen -r

Для того, чтобы получить список запущенных сессий от имени текущего пользователя, добавьте ключ -ls или -list

$ screen -list

Вы можете подключиться к определенной сессии по её имени (идентификатору), добавив его в конце команды

$ screen -r Hawk

Чтобы завершить определенную сессию, можно отправить в нее выполнение команды «quit»

$ screen -S Hawk -X quit

Запуск процесса в фоне

Чтобы сразу запустить в скрине какой-то процесс, достаточно передать команду на его выполнение при запуске сессии

$ screen -S <session_name> <command>

Например так:

$ screen -S Hawk node index.js

Перед вами откроется новый скрин, где будет выполняться переданная команда. Теперь можно свернуть скрин и процесс продолжит выполнение. Ctrl+A, D.

Важно помнить, что при подобном запуске, если процесс завершит свое выполнение (например, вследствие ошибки), то скрин также завершит работу. Если вы хотите иметь возможность посмотреть вывод процесса (узнать текст ошибки) в случае остановки скрипта в скрине, запускайте его в два этапа: сперва создаем сессию, потом запускаем в ней процесс — так вы сможете зайти в скрин с помощью -r

Запуск процесса в новой сессии в фоне

Чтобы запустить скрин сразу в свернутом виде, нужно дополнительно передать параметры -dm

$ screen -dmS <session_name> <command>

Рекомендуется либо заранее проверить, что переданная команда запускается корректно. Иначе вы увидите только сообщение о том, что скрин завершил работу.

[screen is terminating]

Вывод

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

rclone

Запуск RClone в виде сервиса

/etc/systemd/system/rclone-sync.service:

[Unit]
Description=Sync files between different remotes via rclone
[Service]
Type=simple
ExecStart=/usr/bin/rclone-sync

/etc/systemd/system/rclone-sync.timer:

[Unit]
Description=Perform an rclone sync periodically.
[Timer]
OnBootSec=1h
OnUnitActiveSec=3h
[Install]
WantedBy=timers.target
/usr/bin/rclone-sync:
#!/bin/bash
rclone sync acd: gdrive:

Включаем в системе:

systemctl enable rclone-sync.timer
systemctl start rclone-sync.timer

Проверяем работоспособность:

systemctl list-timers
journalctl -u rclone-sync -a

Полезные команды почтового сервера Exim

Exim — это так называемый MTA ( Mail Transfer Agent ), агент передачи сообщений, в просторечии - почтовик или почтовый сервер, использующийся в операционных системах Unix. Распространяется по свободной лицензии GPL, то есть доступен для распространения, использования и модификации. Exim, весьма распространен и в некоторых операционных системах является почтовым сервером по умолчанию.

ID сообщений и spool файлы

Идентификаторы сообщений в очередях Exim, представляют из себя буквенно-цифровые последовательности в верхнем и нижнем регистрах: XXXXXX-YYYYYY-ZZ и используются большинством команд администрирования очереди и логгирования в Exim. Для каждого сообщения создаются три файла в spool директории ( зачастую это: /var/spool ). Если вы работает с данными файлами вручную, без использования описанных ниже команд и утилит, убедитесь что обработали все три файла, например, не оставив в очереди exim только один из них, удалив остальные. Каталог /var/spool/exim/msglog содержит файлы со служебной информацией для каждого сообщения и именуются в соответствии с ID этого сообщения. Каталог /var/spool/exim/input содержат файлы заголовков и данных, к ID сообщения в имени, добавлены суффиксы -H и -D, соответственно. Кроме того в этих директориях могут появляться хэшированные подкаталоги для работы с большими почтовыми очередями.

Получение базовой информации по Exim

Вывести количество сообщений в очереди:

root@localhost# exim -bpc

Печать списка сообщений в очереди. Выводятся, время постановки в очередь, размер, ID сообщения, отправитель, получатель:

root@localhost# exim -bp

Печать суммарной информации. Выводимые колонки: количество, объем, старейшее, последнее, домен.

root@localhost# exim -bp | exiqsumm

Чем в данный момент занимается Exim:

root@localhost# exiwhat

Тестирование маршрута доставки до указанного адреса:

root@localhost# exim -bt alias@localdomain.com
user@thishost.com
    <-- alias@localdomain.com
  router = localuser, transport = local_delivery
root@localhost# exim -bt user@thishost.com
user@thishost.com
  router = localuser, transport = local_delivery
root@localhost# exim -bt user@remotehost.com
  router = lookuphost, transport = remote_smtp
  host mail.remotehost.com [1.2.3.4] MX=0

Эмитировать SMTP транзакцию из командной строки, как если-бы сообщение пришло с указанного IP адреса. При этом будет показано прохождение и срабатывание проверок, фильтров и листов доступа (ACL). На самом деле, никакое сообщение никуда доставлено не будет.

root@localhost# exim -bh 192.168.11.22

Листинг всех настроек конфигурации exim:

root@localhost# exim -bP

Поиск очереди с помощью утилиты exiqgrep

Стандартная поставка сервера Exim включает в себя утилиту для поиска по очередям — exiqgrep, это самый оптимальный путь для решения данной задачи. Если вы используете конвейер команд, например из exim -bp в awkgrepcut и т.д., вы просто усложняете себе жизнь. Различные ключи команды exiqgrep, позволяют достаточно тонко настроить критерии поиска. Ключ -f используется для поиска сообщений конкретного отправителя

root@localhost# exiqgrep -f [luser]@domain

Ключ -r используется для поиска сообщений для определенного адресата

root@localhost# exiqgrep -r [luser]@domain

Ключ -o указывает искать сообщения, старее, указанного количества секунд. В примере, сообщения старее 1 дня:

root@localhost# exiqgrep -o 86400 [...]

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

root@localhost# exiqgrep -y 3600 [...]

Ключ -s позволяет искать по размеру сообщения, совпадающего с заданным регулярным выражением:

root@localhost# exiqgrep -s '^7..$' [...]

Для поиска только среди заблокированных( замороженных ) сообщений, используйте ключ -z, или -x для поиска только среди не заблокированных. Еще несколько ключей отвечающих за вывод результатов поиска Вывести только ID сообщения, в одном из вышеупомянутых вариантов поиска

root@localhost# exiqgrep -i [ -r | -f ] ...

Печатать счетчик сообщений при одном из вышеприведенных вариантов поиска:

root@localhost# exiqgrep -c ...

Вывести только идентификатор всей очереди:

root@localhost# exiqgrep -i

Управление очередями сообщений

Основной бинарник Exim ( /usr/sbin/exim ), используется с различными ключами для управления сообщениями в очереди. Многие ключи, подразумевают указание одного или более ID сообщения в командной строке, как раз тут вам и пригодится команда exiqgrep -i, которая была упомянута выше. Запуск очереди:

root@localhost# exim -q -v

Запуск очереди только для локальных доставок:

root@localhost# exim -ql -v

Удалить сообщение из очереди:

root@localhost# exim -Mrm  [  ... ]

Очистит все заблокированные сообщения из очереди:

root@localhost# exipick -zi | xargs exim -Mrm

Очистит все сообщения из очереди:

root@localhost# exipick -i | xargs exim -Mrm 

Заблокировать( заморозить ) сообщение:

root@localhost# exim -Mf  [  ... ]

Разблокировать сообщение:

root@localhost# exim -Mt  [  ... ]

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

root@localhost# exim -M  [  ... ]

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

root@localhost# exim -Mc  [  ... ]

Принудительно остановить сообщение с формулировкой "отменено администратором":

root@localhost# exim -Mg  [  ... ]

Удалить все заблокированные сообщения:

root@localhost# exiqgrep -z -i | xargs exim -Mrm

Удалить все сообщения, старше 5 дней (86400 * 5 = 432000 секунд):

root@localhost# exiqgrep -o 432000 -i | xargs exim -Mrm

Заблокировать все письма от указанного отправителя:

root@localhost# exiqgrep -i -f luser@example.tld | xargs exim -Mf

Просмотреть заголовки сообщений:

root@localhost# exim -Mvh 

Просмотреть тело сообщений:

root@localhost# exim -Mvb 

Просмотр логов сообщения:

root@localhost# exim -Mvl 

Добавить получателя в сообщение:

root@localhost# exim -Mar  
[
... ]

Редактировать отправителя сообщения:

root@localhost# exim -Mes  

Листы контроля доступа (Access Control List, ACL)

Exim предоставляет возможность использовать, листы контроля доступа (ACL) на различных этапах SMTP передачи. Условия ACL назначаются в конфигурационном файле exim.conf. Начать имеет смысл с HELO.

# Назначить ACL для использования после команды HELO
acl_smtp_helo = check_helo

# Условия проверки check_helo для ACL:
check_helo:

    deny message = Gave HELO/EHLO as "friend"
    log_message = HELO/EHLO friend
    condition = ${if eq {$sender_helo_name}{friend} {yes}{no}}

    deny message = Gave HELO/EHLO as our IP address
    log_message = HELO/EHLO our IP address
    condition = ${if eq {$sender_helo_name}{$interface_address} {yes}{no}}

    accept  
Используйте проверку HELO на свой страх и риск. Сейчас HELO не имеет такого большого значения в общей схеме SMTP, так что не стоит сильно доверять его содержимому. Не только спамеры используют строку HELO, вы будете удивлены сколько нормальных сообщений может приходить с кривым HELO. Спамерам не составит труда отправлять сообщения с легальной строкой HELO а не писать там "я спамер", так что много спама вы на этом не отсеете.

Далее, вы можете провести проверку по отправителю или удаленному хосту. В примере показано как фильтровать по содержимому, идущему после команды RCPT TO. Если прием сообщения будет отклонен в этом месте, вы получите больше данных в логах, нежели при блокировке по MAIL FROM.

# Назначит проверку содержимого после RCPT TO
acl_smtp_rcpt = check_recipient

# Условия для check_recipient ACL
check_recipient:

    # [...]

    drop hosts = /etc/exim_reject_hosts
    drop senders = /etc/exim_reject_senders

    # [ Probably a whole lot more... ]

В приведенном примере для блокировки используются два текстовых файла. В файл /etc/exim_reject_hosts, значения добавляются в виде: имя_хоста/IP_адрес, в файл /etc/exim_reject_senders в виде адреса отправителя, по одной записи в строке. Кроме того, можно сканировать содержимое сообщения, на предмет совпадения с регулярным выражением. Имейте в виду, это дает дополнительную нагрузку на процессор, особенно на больших сообщениях.

# Назначить ACL для использования после команды DATA
acl_smtp_data = check_message

# Условия проверки для check_messages ACL
check_message:

    deny message = "Sorry, Charlie: $regex_match_string"
    regex = ^Subject:: .*Lower your self-esteem by becoming a sysadmin

    accept
  

Исправление SMTP аутентификации для pine

В случае, если pine не может использовать аутентификацию на сервере Exim, возвращая сообщение "unable to authenticate", без запроса на ввод пароля, нужно добавить в exim.conf следующие строки.

  begin authenticators

  fixed_plain:
  driver = plaintext
  public_name = PLAIN
  server_condition = "${perl{checkuserpass}{$1}{$2}{$3}}"
  server_set_id = $2
>  server_prompts = :

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

Запись в лог файл заголовка Subject

Один из самых полезных хаков конфигурации Exim. Добавление в exim.conf приведенной строки, позволит писать в лог файл строку subject, писем проходящих через сервер. Это сильно помогает при решении проблем в процессе настройки сервера, а так-же дает дополнительные критерии для отсева спама.

log_selector = +subject

Отключение identd

Честно говоря не думаю что протокол identd был когда либо очень полезен. Identd опирается на подключающийся хост, что-бы подтвердить идентификацию ( System UID ), удаленного пользователя, владельца процесса, устанавливающего сетевое соединение. Это может быть в определенной степени полезно в мире системных оболочек и IRC пользователей, но уж никак не на нагруженном почтовом сервере, где пользователем процесса зачастую является просто какой-нибудь "mail", и за этим может быть любой другой MTA. В итоге куча накладных расходов, нулевой результат, лишь задержки identd запросов и как следствие отказы и таймауты. Можно запретить Exim делать подобные запросы, установив таймаут 0 секунд в exim.conf.

rfc1413_query_timeout = 0s

Отключение блокировки вложений

Что-бы отключить блокировку исполняемых вложений, что CPanel делает по умолчанию, правда не предоставляя при это контроля "для каждого домена", следующий блок нужно добавить в начало файла /etc/antivirus.exim:

if $header_to: matches "example\.com|example2\.com"
then
  finish
endif

Поиск в журнальных файлах с помощью exigrep

Утилита exigrep ( не путайте с exiqgrep, использующейся для поиска в очереди ), используется для поиска по лог файлам. Например exigrep может вывести все записи из лог файла с совпадающим ID сообщения, что довольно удобно, учитывая что каждое сообщение занимает 3 строки в лог файле. Поиск сообщений отправленных с определенного IP адреса:

root@localhost# exigrep '<= .* \[12.34.56.78\] ' /path/to/exim_log

Поиск сообщений отправленных на определенный IP адрес:

root@localhost# exigrep '=> .* \[12.34.56.78\]' /path/to/exim_log

Данный пример ищет сообщения содержащие символы "=>", и отправленные на адрес "user@domain.tld", далее по конвейеру, результат передается команде grep, которая из полученного результата выбирает строки, содержащие "<=" с информацией об отправителе, почтовом адресе, IP адресе, размере сообщения, ID сообщения и заголовок subject, если логгирование этой строки включено.

root@localhost# exigrep '=> .*user@domain.tld' /path/to/exim_log | fgrep '<='

Генерировать из лог файла и показать статистику Exim:

root@localhost# eximstats /path/to/exim_mainlog

То-же что и выше но с более подробными данными:

root@localhost# eximstats -ne -nr -nt /path/to/exim_mainlog

Аналогично но за определенный день:

root@localhost# fgrep YYYY-MM-DD /path/to/exim_mainlog | eximstats

В качестве дополнения Удалить все сообщения в очереди, содержащие в теле, определенную строку:

root@localhost# grep -lr 'a certain string' /var/spool/exim/input/ | \
                sed -e 's/^.*\/\([a-zA-Z0-9-]*\)-[DH]$/\1/g' | xargs exim -Mrm

Командой выше, мы проверяем содержимое каталога /var/spool/exim/input/, в поисках файлов очереди, содержащих определенную строку в теле сообщения, поскольку команда exiqgrep не умеет просматривать тело сообщений. Если вы решите удалить найденные файлы напрямую, ЭТО БУДЕТ НЕ ПРАВИЛЬНО, используйте предназначенные для этого команды exim. Если вывод используемой команды слишком длинный, например ID сообщений при exiqgrep -i, которые нужно передать дальше по конвейеру команде exim, может быть превышено количество аргументов командной строки вашей системной оболочки. В этом случае передавайте результат поиска через конвейер, команде xargs, которая будет обрабатывать результаты ограниченными порциями. Например удалим тысячи сообщений, отправленных с адреса joe@example.com:

root@localhost# exiqgrep -i -f '' | xargs exim -Mrm  

После того как вы внесли изменения в файл конфигурации, необходимо перезапустить exim, или послать рабочему процессу сигнал SIGHUP, что-бы он перечитал конфигурационный файл и изменения вступили в силу. Предпочтительней естественно отправить сигнал, нежели перезапускать приложение.

root@localhost# kill -HUP `cat /var/spool/exim/exim-daemon.pid`

3proxy

Настройка брандмауэра

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

Если используется Iptables:

iptables -I INPUT 1 -p tcp --dport 3128 -j ACCEPT

netfilter-persistent save

Установка и запуск 3proxy

3proxy отсутствует в репозиториях Ubuntu, поэтому есть два варианта установки. Полегче, и для тех, кто любит хардкор.

Готовые пакеты

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

Сначала скачаем стабильный пакет для Ubuntu системы:

wget https://github.com/z3APA3A/3proxy/releases/download/0.9.3/3proxy-0.9.3.x86_64.deb

После чего, мы можем установить его с помощью команды:

sudo dpkg -i 3proxy-0.9.3.x86_64.deb

Исходники

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

apt-get install build-essential git

Клонируем официальный репозиторий

git clone https://github.com/3proxy/3proxy

Переходим в каталог программы:

cd 3proxy

Запускаем компиляцию 3proxy:

make -f Makefile.Linux

Создаем системную учетную запись:

adduser --system --disabled-login --no-create-home --group 3proxy --force-badname

Создаем каталоги и копируем файл 3proxy в /usr/bin:

mkdir -p /var/log/3proxy
mkdir /etc/3proxy
cp bin/3proxy /usr/bin/

Задаем права на созданные каталоги:

chown 3proxy:3proxy -R /etc/3proxy
chown 3proxy:3proxy /usr/bin/3proxy
chown 3proxy:3proxy /var/log/3proxy

Создаем конфигурационный файл:

vi /etc/3proxy/3proxy.cfg

Со следующим содержанием:

nserver 77.88.8.8  
nserver 8.8.8.8  
  
nscache 65536  
timeouts 1 5 30 60 180 1800 15 60  
  
external 0.0.0.0  
internal 0.0.0.0
  
daemon
  
auth none  
  
allow * * * 80-88,8080-8088 HTTP  
allow * * * 443,8443 HTTPS  
  
proxy -n

Запускаем 3proxy:

Если вы производили установку из готовых пакетов, вы можете запустить программу следующей командой:

systemctrl start 3proxy

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

/usr/bin/3proxy /etc/3proxy/3proxy.cfg

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

Настройка автозапуска

Для автозагрузки 3proxy настроим его как сервис. Создаем файл в systemd:

vi /etc/systemd/system/3proxy.service

С содержанием:

[Unit]  
Description=3proxy Proxy Server  
  
[Service]  
Type=simple  
ExecStart=/usr/bin/3proxy /etc/3proxy/3proxy.cfg  
ExecStop=/bin/kill `/usr/bin/pgrep -u proxy3`  
RemainAfterExit=yes  
Restart=on-failure  
  
[Install]  
WantedBy=multi-user.target

Обновляем конфигурацию systemd:

systemctl daemon-reload

Разрешаем запуск сервиса и стартуем его:

systemctl enable 3proxy
systemctl start 3proxy

Настройка аутентификации

Для доступа к web прокси мы можем настроить аутентификацию, для этого нам необходимо отредактировать конфигурационный файл вновь:

vi /etc/3proxy/3proxy.cfg

Сначала необходимо изменить строчку:

auth none

На:

auth strong

После которой вы можете добавить секцию пользователей:

users admin:CL:password
users "3err0:CR:$1$UsbY5l$ufEATFfFVL3xZieuMtmqC0"
В данном примере мы добавили 2-х пользователей:

Для получения хэша пароля можно воспользоваться командой

openssl passwd -1 -salt mysalt
Возможные типы паролей:
Возможные варианты для auth:

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

auth nbname strong

После внесения изменений, перезапускаем службу:

systemctl restart 3proxy

SOCKS

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

vi /etc/3proxy/3proxy.cfg

Добавив в него строчку:

socks

Если необходимо определить порт запуска, необходимо указать аргумент -p:

socks -p8083 -i192.168.1.23 -e111.111.111.111

* запускаем socks на порту 8083; внутренний интерфейс — 192.168.1.23, внешний — 111.111.111.111.

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

systemctl restart 3proxy

Настройка анонимности

Необходимо, чтобы время на сервере совпадало с временем на компьютере.

На стороне сервера необходимо задать часовой пояс, например, если наш прокси находится в Германии, вводим:

timedatectl set-timezone Asia/Irkutsk

На стороне клиента либо меняем часовой пояс в системе, либо устанавливаем плагин для браузера, например, для Mozilla Firefox и меняем часовой пояс уже в нем.

Отключение icmp.

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

iptables -I INPUT -p icmp --icmp-type 8 -j REJECT

И применяем настройку:

netfilter-persistent save

Дополнительные настройки

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

Логирование

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

log filename LOGTYPE
rotate 30

LOGTYPE задает тип ротации и может принимать значения:

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

  log @ident

Настройка портов и прокси-интерфейсов

При необходимости, можно настроить 3proxy на использование разных интерфейсов на разных портах:

vi /etc/3proxy/3proxy.cfg
proxy -n -a -p3128 -i192.168.0.23 -e222.222.222.222  
proxy -n -a -p8080 -i192.168.1.23 -e111.111.111.111

Ограничение пропускной способности

При необходимости, можно ограничить скорость.

vi /etc/3proxy/3proxy.cfg
bandlimin 1000000 user1,user3  
bandlimin 5000000 user2,user4
bandlimin 240000 * 192.168.0.2,192.168.0.3
bandlimin 48000 * 192.168.0.4
bandlimout 24000 *
nobandlimin * * * 110

Ограничения доступа

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

vi /etc/3proxy/3proxy.cfg

Синтаксис:

allow <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist> <weekdays> <timeperiodslist>
deny <userlist> <sourcelist> <targetlist> <targetportlist> <commandlist> <weekdays> <timeperiodslist>

Где:

Примеры:

allow * * * 80 HTTP  
allow * * * 443,8443 HTTPS  
allow * * * 21 FTP

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

maxconn 700  
proxy -n -a -p3128 -i192.168.0.23 -e222.222.222.222  
proxy -n -a -p8080 -i192.168.1.23 -e111.111.111.111

Другие ограничения

deny * 192.168.200.4 * 110 * 1-5 18:00:00-23:59:59,00:00:00-08:00:00
allow * 192.168.200.4 * * * 1-5 09:00:00-18:00:00
allow * 192.168.0.2,192.168.0.3 * 80,443 * 1-7 00:00:00-23:59:59

Настройка браузера

Проверяем работоспособность нашего 3proxy. Для этого настраиваем браузер для работы через прокси-сервер, например, Mozilla Firefox:

Пример настройки Mozilla Firefox для работы через прокси

Настройка почты

3proxy позволяет настроить его не только на WEB-серфинг. Электронная почта - это то, на что можно так-же испольовать это ПО. Для начала настроим получение почты. Для этого в составе 3proxy имеется свой pop3-прокси:

Вновь отредактируем наш конфиг файл:

vi /etc/3proxy/3proxy.cfg

Добавив строчку:

pop3p

В этом случае надо будет настроить ваши мэйл-клиенты. Если, к примеру, для ящика vasya.pupkin@mail.ru в настройках TheBat! в настройках доставки почты (закладка Транспорт) раньше стояли такие параметры:

pop3-сервер: pop.mail.ru
пользователь: vasya.pupkin

То чтобы получать почту через прокси, надо будет их поменять на следующие:

pop3-сервер: 192.168.0.1
пользователь: vasya.pupkin@pop.mail.ru

Для большей наглядности рассмотрим еще вариант настройки клиента:

pop3-сервер: mail.example.com
пользователь: vasya.pupkin@example.com

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

pop3-сервер: 192.168.0.1
пользователь: vasya.pupkin@example.com@mail.example.com

Что же касается отправки почты, то разработчик прокси-сервера рекомендует воспользоваться для этого портмаппингом:

tcppm -i192.168.0.1 25 smtp.provider.ru 25

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

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

SMTP-сервер: 192.168.0.1

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

tcppm -i192.168.0.1 2110 pop.mail.ru 110

Есть в этом варианте одна неприятная сторона - если пользователи будут пользоваться ящиками на разных почтовых серверах, благо что их много развелось (yandex, rambler,newmail...), то для каждого почтового сервера придется завести новую запись портмаппинга в нашем конфиге, к примеру:

tcppm -i192.168.0.1 3110 pop.yandex.ru 110

И дополнительно надо будет поменять порт на 2110 и не забыть дать пользователям разрешение на этот нестандартный порт:

allow * 192.168.0.2,192.168.0.3 * 2110,25,110 * 1-5 00:00:00-20:00:00

Админка

И наконец, рассмотрим важную составляющую прокси-сервера - WEB-интерфейс администрирования. Для доступа к нему надо запустить команду

admin

Для доступа к интерфейсу пропишите в адресной строке браузера следующий адрес: http://192.168.0.1:80, не забыв, конечно, дать разрешение пользователю на использование стандартного для службы admin порта 80. В открывшемся окне можно будет получить доступ к информации о максимально допустимом трафике и его текущем значении, посмотреть конфиг целиком и даже перезапустить прокси-сервер. Поэтому разрешения на эту службу раздавайте крайне внимательно! Впрочем, у службы admin есть ключ -s, который не дает делать пользователю ничего недозволенного. Считаю своим долгом упомянуть о команде writable, которая, будучи размещена в самом начале конфига, дает возможность не только читать конфиг через WEB-интерфейс, но и менять его! Автор программы предлагает дважды подумать, прежде чем включать эту опцию.

Примечание

Хочу прояснить на примерах еще один момент, который я сам понял не сразу и понимание которого, возможно, может вызвать проблемы и у вас. Это использование авторизации auth strong. Предположим, что нам хочется, что доступ к WEB-администрированию был доступен только с компьютера 192.168.0.4, причем даже в этом случае запрашивался пароль доступа. В этом случае соответствующая секция конфига будет выглядеть так:

flush
auth strong
allow Administrator 192.168.0.4 * 80 * 1-5 00:00:00-20:00:00
admin

И разумеется, прежде чем пользоваться авторизацией strong, надо завести пользователя, в нашем случае это Administrator:

users Administrator:CL:password

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

allow Administrator * * 80 * 1-5 00:00:00-20:00:00

То доступ к администрированию можно будет получить с любого компьютера при предъявлении пароля для пользователя Administrator.

Вы, наверное, заметили новую команду flush. Мы ее применили для сброса заданного выше списка доступа, чтобы можно было изменить разрешения доступа для пользователей. Замечу, что сброс не действует на ограничение скорости, которое действует на все службы. И не забываем после его примения задавать способ авторизации.

Конфиг файл

nserver 8.8.8.8
nserver 8.8.4.4

nscache 65536
timeouts 1 5 30 60 180 1800 15 60

external 192.168.0.0
internal 192.168.0.0

daemon

auth strong
users 3err0:CL:password


nobandlimin * * * 110
bandlimin 24000 * 192.168.0.2,192.168.0.3
bandlimin 48000 * 192.168.0.4
bandlimout 24000 *

###############################################################
# РАЗДАЕМ WEB
###############################################################

auth iponly 
allow * 192.168.0.4 * * * 1-5 09:00:00-18:00:00
allow * 192.168.0.2,192.168.0.3 * 80,443 * 1-7 00:00:00-23:59:59
proxy -n -p3128

###############################################################
# РАЗДАЕМ ПОЧТУ
###############################################################

flush
auth iponly
deny * 192.168.200.4 * 110 * 1-5 18:00:00-23:59:59,00:00:00-08:00:00
allow * 192.168.0.2,192.168.0.3,192.168.0.4 * 25,110 * 1-5 00:00:00-20:00:00
tcppm -i192.168.0.1 25 smtp.provider.ru 25
pop3p

###############################################################
# РАЗДАЕМ FTP
###############################################################

flush
auth iponly
allow * 192.168.0.2,192.168.0.3 * 2110,25,110 * 1-5 00:00:00-20:00:00
ftppr 
socks

###############################################################
# АДМИНИСТРАТИВНЫЙ ДОСТУП
###############################################################

flush
auth iponly
allow 3err0 192.168.0.4 * 3129 * 1-5 00:00:00-20:00:00
admin -s -p3129

end

В случае получения почты через портмаппинг секция конфига, идущая после коментария # ПОЧТА выглядела бы немного по другому:

###############################################################
# РАЗДАЕМ ПОЧТУ
###############################################################

flush
auth iponly
deny * 192.168.200.4 * 110 * 1-5 18:00:00-23:59:59,00:00:00-08:00:00
allow * 192.168.0.2,192.168.0.3,192.168.0.4 * 25,110 * 1-5 00:00:00-20:00:00
tcppm -i192.168.0.1 25 smtp.provider.ru 25
tcppm -i192.168.0.1 2110 pop.mail.ru 110
tcppm -i192.168.0.1 3110 pop.yandex.ru 110

Репозиторий OPNsense

Это настраиваемый общественный репозиторий OPNsense, который предлагает несколько пакетов и плагинов, недоступных в основном репозитории. Большинство плагинов имеют только кнопку "Включить", и их нужно настраивать самостоятельно (или они работают сразу, как Unifi или Grafana).

Этот репозиторий не имеет никаких гарантий и управляется в свободное время или во время работы автора, разрешенной его работодателем (@mimugmail), где также доступна коммерческая поддержка на немецком языке: link

Ограничения:

Поддерживается только OpenSSL! Не стоит спрашивать про LibreSSL, так как автор и многие другие пользователи не используют его. Не стоит использовать его в производственных средах, так как автор тестирует его только время от времени на нескольких из них. OPNsense не предоставляет никаких гарантий или поддержки для этого репозитория, также не поддерживает автор за это и может винить его за ошибки. Он не будет работать, если /var находится на ram-диске, так как службы сильно зависят от систем с постоянными данными. Автор старается компилировать только те пакеты, которых нет в стандартном дистрибутиве, чтобы ничего не сломалось, но необходимо быть осторожным при каждом обновлении.

Установка

Чтобы использовать настраиваемый репозиторий, подключитесь к своему маршрутизатору через SSH и введите следующую команду:

fetch -o /usr/local/etc/pkg/repos/mimugmail.conf https://www.routerperformance.net/mimugmail.conf

Теперь вы можете перейти в "Система: Программное обеспечение: Плагины" и проверить наличие обновлений. Некоторые пакеты не имеют плагинов (пока что), поэтому вы можете установить их только через CLI, например:

pkg install ocserv

Список плагинов

Темы

Связь с автором

Если у вас есть новые идеи для пакетов или плагинов, просто свяжитесь с автором Twitter @mimu_muc или создайте новую проблему через GitHub

Лицензия

Эти плагины и пакеты бесплатны как пиво! Нет хостинга исходного кода, но вы можете использовать их бесплатно и навсегда. Продажа этих плагинов запрещена!