# Software

# Rsync Server

### Настройка и использование 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 = *
```

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

<div class="level3" id="bkmrk-max-connections%C2%A0%E2%80%94-%D0%BC%D0%B0"><div class="level3">- <div class="li">**max connections** — максимальное число одновременных подключений. Стоит задать, чтобы не перегружать сервер.</div>
- <div class="li">**exclude** — папки, которые стоит исключить из синхронизации. В конкретном примере каталог для размещения восстановленных после проверки диска файлов.</div>
- <div class="li">**dont compress** — указываем, какие файлы не нужно сжимать при отправке. Имеет смысл указать те, сжатие которых не даст результата, например, архивы, сжатые аудио и изображения.</div>

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

<div class="level3" id="bkmrk-uid%C2%A0%E2%80%94-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%2C-"><div class="level3">- <div class="li">**uid** — пользователь, от которого будет выполнена синхронизация для конкретного ресурса.</div>
- <div class="li">**gid** — группа, от которой будет выполнена синхронизация для конкретного ресурса.</div>
- <div class="li">**path** — путь до ресурса, для которого выполняется синхронизация.</div>
- <div class="li">**comment** — описание для удобства.</div>
- <div class="li">**read only** — режим для чтения; позволяет защитить данные от удаления или изменения.</div>
- <div class="li">**list** — разрешает или запрещает чтения содержимого каталога. Если запрещено (no), синхронизация может выполняться для конкретно перечисленных файлов.</div>
- <div class="li">**auth users** — проверка подлинности, вводом логина с паролем.</div>
- <div class="li">**secrets file** — файл, в котором размещены логин и пароль.</div>
- <div class="li">**hosts allow** — перечисление хостов, с которых разрешено обращаться к rsync серверу.</div>
- <div class="li">**hosts deny** — перечисление хостов, с которых запрещено обращаться к rsync серверу (в данном примере, со всех, кроме разрешенных).</div>

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

```
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/
```

<div class="level3" id="bkmrk-%D0%B3%D0%B4%D0%B5-192.168.0.5-%E2%80%94-ip">- <div class="li">где 192.168.0.5 — IP-адрес rsync сервера.</div>

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

```
#!/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
```

\* где:

<div class="level4" id="bkmrk-password_file%C2%A0%E2%80%94-%D0%BF%D0%B0%D1%80%D0%BE"><div class="level4">- <div class="li">**password\_file** — пароль, в котором будет храниться пароль.</div>
- <div class="li">**user** — учетная запись для авторизации.</div>
- <div class="li">**ip** — IP-адрес сервера rsync.</div>
- <div class="li">**source** — имя ресурса на сервере.</div>
- <div class="li">**destination** — каталог, в который синхронизируем файлы.</div>

</div></div>После создаем файл с паролем:

```
vi /etc/rsyncd.scrt
```

```
password
```

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

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

```
chmod 600 /etc/rsyncd.scrt
```

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

```
crontab -e
```

```
0 */1 * * * /scripts/syncing.sh
```

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

### Ключи запуска rsync

<div class="level3" id="bkmrk-%D0%9A%D0%BB%D1%8E%D1%87-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5--v%2C-%E2%80%93v"><div class="level3"><div class="table-responsive"><table class="inline table table-striped table-condensed"><thead><tr class="row0"><th class="col0 leftalign">Ключ</th><th class="col1">Описание</th></tr></thead><tbody><tr class="row1"><td class="col0">-v, –verbose</td><td class="col1">Вывод подробной информации о процессе синхронизации. Стоит использовать для отладки.</td></tr><tr class="row2"><td class="col0">-q, –quiet</td><td class="col1">Не выводит сообщения об ошибках.</td></tr><tr class="row3"><td class="col0">–no-motd</td><td class="col1">Не выводит приветствие в MOTD</td></tr><tr class="row4"><td class="col0">-c, –checksum</td><td class="col1">Сравнивать файлы по контрольной сумме, а не времени или размеру.</td></tr><tr class="row5"><td class="col0">-a, –archive</td><td class="col1">Режим архивирования или то же самое, что с ключами -rlptgoD (без -H,-A,-X). Используется для удобства, чтобы не перечислять много опций.</td></tr><tr class="row6"><td class="col0">–no-&lt;опция&gt;</td><td class="col1">Отключает конкретную опцию, например, вышеописанная no-motd.</td></tr><tr class="row7"><td class="col0">-r, –recursive</td><td class="col1">Рекурсивный режим для каталогов.</td></tr><tr class="row8"><td class="col0">-R, –relative</td><td class="col1">Использовать относительные пути.</td></tr><tr class="row9"><td class="col0">–no-implied-dirs</td><td class="col1">Выключить параметр –relative.</td></tr><tr class="row10"><td class="col0">-b, –backup</td><td class="col1">Режим резервного копирования. С его помощью при обновлении файлов в папке назначения для них создается копия.</td></tr><tr class="row11"><td class="col0">–backup-dir=&lt;каталог&gt;</td><td class="col1">В режиме резервного копирования указывает каталог, в котором будут храниться копии.</td></tr><tr class="row12"><td class="col0">–suffix=SUFFIX</td><td class="col1">В режиме резервного копирования задает суффикс для сохраненных файлов</td></tr><tr class="row13"><td class="col0">-u, –update</td><td class="col1">Пропускать файлы, которые новее в папке назначения (копировать только измененные файлы).</td></tr><tr class="row14"><td class="col0">-d, –dirs</td><td class="col1">Не использовать рекурсию для каталогов.</td></tr><tr class="row15"><td class="col0">-l, –links</td><td class="col1">Копировать симлинки как симлинки.</td></tr><tr class="row16"><td class="col0">-L, –copy-links</td><td class="col1">Копировать не симлинк а ее содержимое (трансформировать симлинк в каталог).</td></tr><tr class="row17"><td class="col0">-k, –copy-dirlinks</td><td class="col1">Преобразовать симлинк на каталог в обычный каталог.</td></tr><tr class="row18"><td class="col0">-K, –keep-dirlinks</td><td class="col1">В папке назначения обрабатывать симлинк как каталог.</td></tr><tr class="row19"><td class="col0">-H, –hard-links</td><td class="col1">Сохранять жесткие ссылки.</td></tr><tr class="row20"><td class="col0">-p, –perms</td><td class="col1">Сохранять разрешения (права доступа).</td></tr><tr class="row21"><td class="col0">-E, –executability</td><td class="col1">Сохранить права на исполнение.</td></tr><tr class="row22"><td class="col0">–chmod=&lt;права&gt;</td><td class="col1">Изменить права доступа на конкретные.</td></tr><tr class="row23"><td class="col0">-A, –acls</td><td class="col1">Сохранить права <abbr data-original-title="Access Control List" title="">ACL</abbr>.</td></tr><tr class="row24"><td class="col0">-X, –xattrs</td><td class="col1">Сохранить атрибуты файлов.</td></tr><tr class="row25"><td class="col0">-o, –owner</td><td class="col1">Сохранить владельца (только от суперпользователя).</td></tr><tr class="row26"><td class="col0">-g, –group</td><td class="col1">Сохранить группу владельца.</td></tr><tr class="row27"><td class="col0">–devices</td><td class="col1">Копировать файлы-устройства (разрешено только при выполнении команды с правами суперпользователя).</td></tr><tr class="row28"><td class="col0">–copy-devices</td><td class="col1">Копировать файлы устройства как обычные файлы.</td></tr><tr class="row29"><td class="col0">–specials</td><td class="col1">Сохранять специальные файлы.</td></tr><tr class="row30"><td class="col0">-D</td><td class="col1">Заменяет –devices и –specials одновременно.</td></tr><tr class="row31"><td class="col0">-t, –times</td><td class="col1">Сохранять временные отметки.</td></tr><tr class="row32"><td class="col0">-S, –sparse</td><td class="col1">Выполнение дефрагментации в момент копирования данных.</td></tr><tr class="row33"><td class="col0">-n, –dry-run</td><td class="col1">Режим тестирования. Выполняется пробный запуск, при котором будет показаны изменения, но сами изменения выполнены не будут.</td></tr><tr class="row34"><td class="col0">-W, –whole-file</td><td class="col1">Копировать файлы целиком. По умолчанию, для копирования файлов используется алгоритм дельта-хэфера, который позволяет переносить только часть с изменениями. На практике, это сильно ускоряет процесс копирования. Ключ применяется в тех случаях, когда нужно перенести файл целиком.</td></tr><tr class="row35"><td class="col0">-x, –one-file-system</td><td class="col1">Не разрешает переходить границы файловой системы. Например, если в один из синхронизируемых каталогов может быть примонтирована сетевая файловая система, ее копирование может вызвать неудобства.</td></tr><tr class="row36"><td class="col0">-B, –block-size=&lt;размер&gt;</td><td class="col1">Принудительно фиксировать размер блока контрольной суммы</td></tr><tr class="row37"><td class="col0">-e, –rsh=&lt;команда&gt;</td><td class="col1">Указать оболочку для использования, например SSH.</td></tr><tr class="row38"><td class="col0">–existing</td><td class="col1">Не создавать новые файлы в каталоге назначения.</td></tr><tr class="row39"><td class="col0">–ignore-existing</td><td class="col1">Не обновлять существующие файлы в каталоге назначения.</td></tr><tr class="row40"><td class="col0">–remove-source-files</td><td class="col1">Источник удаляет свои файлы после выполнения синхронизации.</td></tr><tr class="row41"><td class="col0">–delete</td><td class="col1">Удалить файлы в папке назначения, если их больше нет в папке источнике (удаление старых файлов).</td></tr><tr class="row42"><td class="col0">–delete-before</td><td class="col1">Удалить файлы в папке назначения до начала синхронизации.</td></tr><tr class="row43"><td class="col0">–delete-during</td><td class="col1">Удалить файлы в папке назначения в момент синхронизации.</td></tr><tr class="row44"><td class="col0">–delete-delay</td><td class="col1">Поиск файлов на удаление в момент синхронизации, а удаление после.</td></tr><tr class="row45"><td class="col0">–delete-after</td><td class="col1">Удалить файлы в папке назначения после синхронизации.</td></tr><tr class="row46"><td class="col0">–delete-excluded</td><td class="col1">Удалить исключенные из синхронизации файлы в каталоге назначения.</td></tr><tr class="row47"><td class="col0">–ignore-errors</td><td class="col1">Удалять файлы даже при ошибках ввода/вывода.</td></tr><tr class="row48"><td class="col0">–force</td><td class="col1">Принудительное удаление не пустых каталогов.</td></tr><tr class="row49"><td class="col0">–max-delete=&lt;число&gt;</td><td class="col1">Не удалять больше заданного числа файлов.</td></tr><tr class="row50"><td class="col0">–max-size=&lt;размер&gt;</td><td class="col1">Не передавать файлы с размером более заданного.</td></tr><tr class="row51"><td class="col0">–min-size=&lt;размер&gt;</td><td class="col1">Не передавать файлы с размером менее заданного.</td></tr><tr class="row52"><td class="col0">–partial</td><td class="col1">Оставлять файлы, которые переданы не до конца (процесс копирования завершился в процессе).</td></tr><tr class="row53"><td class="col0">–partial-dir=&lt;каталог&gt;</td><td class="col1">Хранить частично переданные файлы в специальном каталоге.</td></tr><tr class="row54"><td class="col0">–timeout=&lt;секунды&gt;</td><td class="col1">Установить время ожидания от системы ввода/вывода.</td></tr><tr class="row55"><td class="col0">–contimeout=&lt;секунды&gt;</td><td class="col1">Установить время ожидания для подключения к демону rsync.</td></tr><tr class="row56"><td class="col0">-I, –ignore-times</td><td class="col1">Все равно копировать файлы, если они имеют одинаковые разметы или время изменения.</td></tr><tr class="row57"><td class="col0">–size-only</td><td class="col1">Не копировать только те файлы, которые имеют одинаковые размеры.</td></tr><tr class="row58"><td class="col0">-T, –temp-dir=&lt;каталог&gt;</td><td class="col1">Все временные файлы размещать в определенном каталоге.</td></tr><tr class="row59"><td class="col0">-z, –compress</td><td class="col1">Сжимать данные файла во время передачи</td></tr><tr class="row60"><td class="col0">–compress-level=&lt;число&gt;</td><td class="col1">Устанавливает уровень сжатия от 0 до 9.</td></tr><tr class="row61"><td class="col0">–skip-compress=&lt;список&gt;</td><td class="col1">Не выполнять компрессию для перечисленных файлов.</td></tr><tr class="row62"><td class="col0">-C, –cvs-exclude</td><td class="col1">Исключить от копирования файлы, которые исключаются 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)</td></tr><tr class="row63"><td class="col0">-f, –filter=&lt;правило&gt;</td><td class="col1">Добавить правило для фильтра.</td></tr><tr class="row64"><td class="col0">–exclude=&lt;выражение&gt;</td><td class="col1">Исключить из синхронизации файлы, соответствующие выражению.</td></tr><tr class="row65"><td class="col0">–exclude-from=&lt;файл&gt;</td><td class="col1">Исключить из синхронизации файлы, перечисленные в файле.</td></tr><tr class="row66"><td class="col0">–include=&lt;выражение&gt;</td><td class="col1">Включить в синхронизацию файлы, соответствующие выражению.</td></tr><tr class="row67"><td class="col0">–include-from=&lt;файл&gt;</td><td class="col1">Включить в синхронизацию файлы, перечисленные в файле.</td></tr><tr class="row68"><td class="col0">–files-from=&lt;файл&gt;</td><td class="col1">Читать список имен исходных файлов из файла.</td></tr><tr class="row69"><td class="col0">–address=&lt;IP-адрес&gt;</td><td class="col1">Привязать IP-адрес для исходящего сокета.</td></tr><tr class="row70"><td class="col0">–port=&lt;порт&gt;</td><td class="col1">Использовать определенный сетевой порт.</td></tr><tr class="row71"><td class="col0">–sockopts=OPTIONS</td><td class="col1">Использовать специальные опции для TCP.</td></tr><tr class="row72"><td class="col0">–blocking-io</td><td class="col1">Использовать блокирующий ввод-вывод для удаленной оболочки</td></tr><tr class="row73"><td class="col0">–stats</td><td class="col1">Вывод статистики по передаче данных.</td></tr><tr class="row74"><td class="col0">-h, –human-readable</td><td class="col1">Вывод чисел в удобном для чтения формате.</td></tr><tr class="row75"><td class="col0">–progress</td><td class="col1">Показывать строку прогресса для синхронизации.</td></tr><tr class="row76"><td class="col0">-P</td><td class="col1">То же самое, что –partial и –progress.</td></tr><tr class="row77"><td class="col0">-i, –itemize-changes</td><td class="col1">Выводить сводку изменений для всех обновлений</td></tr><tr class="row78"><td class="col0">–log-file=&lt;файл&gt;</td><td class="col1">Вывод лога в специальный файл.</td></tr><tr class="row79"><td class="col0">–password-file=&lt;файл&gt;</td><td class="col1">При аутентификации пароль можно хранить в специальном файле. Это необходимо для автоматизации выполнения команды без пароля.</td></tr><tr class="row80"><td class="col0">–list-only</td><td class="col1">Показать список файлов, но не копировать их.</td></tr><tr class="row81"><td class="col0">–bwlimit=&lt;число&gt;</td><td class="col1">Ограничить пропускную способность (КБит в секунду).</td></tr><tr class="row82"><td class="col0">–protocol=&lt;число&gt;</td><td class="col1">Принудительно использовать более старую версию протокола.</td></tr><tr class="row83"><td class="col0">–iconv=&lt;кодировка&gt;</td><td class="col1">Запрос кодировки преобразования имен файлов.</td></tr><tr class="row84"><td class="col0">-4, –ipv4</td><td class="col1">Предпочтительно, использовать IPv4.</td></tr><tr class="row85"><td class="col0">-6, –ipv6</td><td class="col1">Предпочтительно, использовать IPv6.</td></tr><tr class="row86"><td class="col0">–version</td><td class="col1">Вывод версии rsync.</td></tr><tr class="row87"><td class="col0">(-h) –help</td><td class="col1">Вывод справочной информации по использованию rsync.</td></tr></tbody></table>

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

# Gitea

### Gitea. Установка системы контроля версий на Debian 10

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

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

- <div class="li">Обновляем систему, доставляем необходимые пакеты и перезагружаемся.</div>

```
sudo apt update
sudo apt upgrade
sudo apt install git wget
reboot
```

- <div class="li">Создаем пользователя git для Gitea.</div>

```
sudo adduser \
   --system \
   --shell /bin/bash \
   --gecos 'Git Version Control' \
   --group \
   --disabled-password \
   --home /home/git \
   git
```

- <div class="li">Скачиваем последнюю доступную для вас версию, у меня 1.10.1.</div>
- <div class="li">[https://dl.gitea.io/gitea/](https://dl.gitea.io/gitea/ "https://dl.gitea.io/gitea/")</div>

```
wget -O gitea https://dl.gitea.io/gitea/1.10.1/gitea-1.10.1-linux-amd64
```

- <div class="li">Делаем его исполняемым и перемещаем в папку исполняемых файлов.</div>

```
chmod +x gitea
sudo cp gitea /usr/local/bin/gitea
```

- <div class="li">Создаем необходимые папки для работы Gitea. Также даем необходимые права на папки.</div>

```
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
```

- <div class="li">Теперь для запуска и автостарта создаем systemd сервис.</div>

```
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
```

- <div class="li">Делаем релоад systemd и запускаем Gitea. Если запуск прошёл успешно, то включаем автостарт.</div>

```
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 и используются большинством команд [администрирования](http://vds-admin.ru/ "администрирование серверов") очереди и логгирования в *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* в *awk*, *grep*, *cut* и т.д., вы просто усложняете себе жизнь. Различные ключи команды *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  
```

<address id="bkmrk-%5B...-%5D">\[<address>... \]</address></address>Редактировать отправителя сообщения:

```
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*, писем проходящих через сервер. Это сильно помогает при решении проблем в процессе [настройки сервера](http://vds-admin.ru/ "настройка сервера"), а так-же дает дополнительные критерии для отсева спама.

```
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
```

Данный пример ищет сообщения содержащие символы *"=&gt;"*, и отправленные на адрес *"user@domain.tld"*, далее по конвейеру, результат передается команде *grep*, которая из полученного результата выбирает строки, содержащие *"&lt;="* с информацией об отправителе, почтовом адресе, 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

```

- если система вернет ошибку при вводе команды для сохранения правил, устанавливаем пакет командой **apt-get install iptables-persistent**.\*
- **3128** — порт по умолчанию, по которому работает 3proxy в режиме прокси;\*

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

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

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

У 3proxy на официальном сайте есть два вида готовых программных пакетов для возможной установки. [Стабильные](https://3proxy.ru/download/stable/) и те, что в [разработке](https://3proxy.ru/download/devel/).

Сначала скачаем стабильный пакет для 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

```

- *Поскольку в linux не позволяет по умолчанию создать пользоватля с именем, начинающемсяя с цифры, мы добавляем команду **--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

```

- Необходимо обратить внимание на настройки **external** и **internal** — внешний и внутренний интерфейсы (если наш прокси работает на одном адресе, то IP-адреса должны совпадать).\*
- Параметр proxy -n **-p3128** определяет порт запуска

## Запускаем 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-х пользователей:

- **admin** с паролем **password**
- **3err0** с паролем **password** в виде md5 и солью **mysalt**

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

```
openssl passwd -1 -salt mysalt

```

- Где в качестве соли можно использовать любую комбинацию.

##### Возможные типы паролей:

- *CL — текстовый пароль*
- *CR — зашифрованный пароль (md5)*
- *NT — пароль в формате NT.*

##### Возможные варианты для **auth**:

- *none — без авторизации.*
- *iponly — авторизация по IP-адресу клиента.*
- *nbname — по Netbios имени.*
- *strong — по логину и паролю.*

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

```
auth nbname strong

```

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

```
systemctl restart 3proxy

```

## SOCKS

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

```
vi /etc/3proxy/3proxy.cfg

```

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

```
socks

```

- ***socks** Запустится на стандартном орту **1080**.*

Если необходимо определить порт запуска, необходимо указать аргумент **-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](https://addons.mozilla.org/en-US/firefox/addon/change-timezone-time-shift/) и меняем часовой пояс уже в нем.

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

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

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

```

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

```
netfilter-persistent save

```

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

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

### Логирование

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

```
log filename LOGTYPE
rotate 30

```

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

- M, ежемесячная ротация
- W, еженедельная ротация
- D, ежедневная ротация
- H, ежечасная ротация
- C, ежеминутная ротация

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

```
  log @ident

```

- Где **@ident** соответствуют ведению журнала через syslog с соотвествующим идентификатором.

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

При необходимости, можно настроить 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

```

- 3proxy будет слушать на порту **3128** с внутреннего интерфейса **192.168.0.23** и направлять пакеты в сеть Интернет через внешний интерфейс **222.222.222.222**
- Также, на порту **8080** для внутреннего и внешнего интерфейсов **192.168.1.23** и **111.111.111.111** соответственно.
- Не забываем также настраивать брандмауэр (вначале инструкции мы открывали только 3128 порт).\*

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

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

```
vi /etc/3proxy/3proxy.cfg

```

```
bandlimin 1000000 user1,user3  
bandlimin 5000000 user2,user4

```

- В данном примере пользователям **user1** и **user3** установлено ограничение в **1000000** бит/сек (1 мбит) для **user2** и **user4** — 5 мбит/сек.\*

```
bandlimin 240000 * 192.168.0.2,192.168.0.3

```

- Разрешаем качать компьютерам с IP-адресами 192.168.0.2 и 192.168.0.3 со скоростью 24 кбит в секунду, причем это 24 кбит приходятся не на каждый из этих компьютеров, а на оба в совокупности, т.е. если оба будут к примеру, качать одновременно файлы с достаточно быстрых сайтов, то каждому придется только по 12 кбит в секунду (заметьте, килобит, а не килобайт, если надо пересчитать в килобайты, разделите числа на 8)

```
bandlimin 48000 * 192.168.0.4

```

- А этому счастливчику единолично скорость 48 кбит в секунду

```
bandlimout 24000 *

```

- исходящую скорость тоже ограничим всем до 24 килобит в секунду

```
nobandlimin * * * 110

```

- Ну и наконец, если вы хотите, чтобы эти жесткие ограничения не касались, к примеру, скачивания почты, то снимите ограничения на порт 110
- И не забудьте поставить эту команду **ПЕРЕД** прочими командами ограничения скорости - конфиг обрабатывается последовательно до первого удовлетворяющего условия.

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

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

```
vi /etc/3proxy/3proxy.cfg

```

Синтаксис:

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

```

Где:

- ***userlist** — список пользователей через запятую.*
- ***sourcelist** — сети клиентов через запятую.*
- ***targetlist** — сети назначения через запятую.*
- ***targetportlist** — порты назначения через запятую.*
- ***commandlist** — команды, к которым применяется правило.*
- ***weekdays** — в какие дни недели работает правило. 0 - 6 — Пн - Вс, 7 — тоже Вс.*
- ***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

```

- таким образом, мы установим **700** максимальных соединений для прокси на порту **3128** и **700** — для proxy на порту **8080**.\*

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

```
deny * 192.168.200.4 * 110 * 1-5 18:00:00-23:59:59,00:00:00-08:00:00

```

- Запрещаем получение почты пользователю с IP .4 в нерабочее время по будням

```
allow * 192.168.200.4 * * * 1-5 09:00:00-18:00:00

```

- Разрешаем доступ в интернет пользователю с IP .4 исключительно с понедельника по пятницу с 9 часов утра до 6 вечера, но зато разрешены запросы на любые порты, то есть можно и с FTP-серверов качать, и HTTPS, к примеру.

```
allow * 192.168.0.2,192.168.0.3 * 80,443 * 1-7 00:00:00-23:59:59

```

- А здесь разрешаем только WEB-серфинг, зато круглосуточно и любой день недели

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

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

![Пример настройки Mozilla Firefox для работы через прокси](https://www.dmosk.ru/img/miniinstruktions/3proxy-ubuntu-02.jpg "Пример настройки 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-сервер вашего ящика", а не ваш адрес.

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

```
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

```

- Cлужбу admin можно так-же как и любую другую запускать с параметром **-p80** с указанием порта на котором необходимо запустить ваш сервис

Для доступа к интерфейсу пропишите в адресной строке браузера следующий адрес: 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](https://www.max-it.de/loesungen/opnsense-firewall/)

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

Поддерживается только 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

```

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

- Unifi Controller (os-unifi-maxit) / Люди, у которых уже установлен контроллер от gozoinks, должны придерживаться его, перенос не проверялся
- InfluxDB (os-influxdb-maxit)
- Grafana (os-grafana-maxit)
- OCServ (os-ocserv-maxit)
- Elasticsearch (os-elasticsearch-maxit)
- Kibana (os-kibana-maxit)
- AdGuardHome (os-adguardhome-maxit) / он работает на 3000 порту, к сожалению, как и ntopng и Grafana
- CARPcron HA autosync (os-carpcron-maxit)
- Speedtest (os-speedtest-community) by mihak09
- Traefik (os-traefik-maxit)
- Caddy (os-caddy-maxit)
- Zeek (os-zeek-maxit)

### Темы

- Solarized (os-theme-solarized-community) by mihak09
- Dracula (os-theme-dracula-community) by mihak09
- Homeassisstant (os-homeassisstant-maxit)
- Unbound Custom Options
- OPNarp (альтернатива ARPwatch)

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

Если у вас есть новые идеи для пакетов или плагинов, просто свяжитесь с автором Twitter @mimu\_muc или создайте новую проблему через [GitHub](https://github.com/mimugmail/opn-repo/issues)

### Лицензия

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