Шпора
- Mount
- WebRadio
- OpenHASP
- Могу ли я использовать образы дисков из QEMU, VMware или других платформ виртуализации в bhyve?
- freebsd мониторинг
- Настройка IPFW + NAT в FreeBSD 14
- MPD 5.7 настройка VPN-сервера в FreeBSD
- Установка VMware Workstation Player в Debian / Ubuntu
- Выбор режима UEFI или BIOS в VMware Workstation 17 Player
- Обновление FreeBSD 14.2 до FreeBSD 14.3
- Настройка VPN сервера WireGuard в FreeBSD
- Сборка и установка AmneziaWG на Debian из исходного кода
- AmneziaWG FreeBSD 14
- FreeBSD port of amneziawg-tools
- Как просматривать видео с камеры Tapo на ПК/NAS/NVR при помощи протоколов RTSP/ONVIF
- Получение сертификата Let's Encrypt для HTTPS при помощи Certbot в FreeBSD 14.1
- windows 10 - vpn server штатными средствами.
- Zapret Настройка BSD-подобных систем
- FreeBSD 13.1: GPU passthrough with bhyve | Windows 10 ???
- Sendmail FreeBSD 14*
- Установите Home Assistant на FreeBSD внутри виртуальной машины bhyve
- Выполнение резервного копирования сервера
- Matrix.org
- Samba
- Шпаргалка по FreeBSD для администраторов Linux
- Apache httpd : SSL/TLS Setting
- Добавление диска и создание разделов во FreeBSD
- Soft for USB JTAG ARM Emulator v9 v11 v12 V13
- Webmin /tmp error
- Диск Windows монтируется только для чтения (РЕШЕНО)
- How to Install Apache, MySQL, PHP (FAMP Stack) on FreeBSD 14.0
- Ошибка Permission denied указывает на то, что процесс OpenDKIM
- Как установить Suricata на FreeBSD
- The Top 20 Nmap Commands You Must Know
- SpamAssassin for Sendmail on FreeBSD
- SendMail, Dovecot, SpamAssassin, RainLoop, Sieve, OpenDkim, SPF, DMARC on FreeBSD
Mount
Настраивал на днях арендованный сервер без прямого доступа к консоли. Ещё и конфигурация была нестандартная, так что техподдержка вручную установила туда ОС и отдала мне с доступом по SSH. Нужно было настроить дополнительные диски и добавить их в fstab. Несмотря на то, что в современных ОС реально монтирует диски systemd, я по старинке предпочитаю добавлять новые точки монтирования в fstab.
В этом деле самое главное – не ошибиться и сразу после изменения файла проверить, что там всё в порядке. Иначе после перезагрузки можно получить проблемы. Без прямого доступа к консоли это может быть фатально.
Я обычно добавляю новые диски в систему следующим образом. Смотрю список дисков через fstab:
# fdisk -l | grep /dev/
Сразу видно диски без разметки. Добавлять разделы предпочитаю в cfdisk, а не напрямую в консоли через fstab. В TUI как-то нагляднее, меньше шансов ошибиться.
# cfdisk /dev/sdb
Создаю раздел, выбираю тип раздела, сохраняю. После этого можно создавать файловую систему.
# mkfs -t ext4 /dev/sdb1
Монтирую в систему:
# mkdir /mnt/disk1
# mount /dev/sdb1 /mnt/disk1
Теперь нам надо добавить эту точку монтирования в fstab. По имени диска категорически нельзя добавлять. Диски могут менять свои имена. Причём это стало актуально в какой-то момент с очередным обновлением железа. Когда я только начинал изучать Linux, спокойно монтировал по именам дисков и проблем не было. В какой-то момент они начались. И сейчас я сам часто наблюдаю, что диски, как и сетевые интерфейсы, могут изменить свои имена после перезагрузки. Если используете LVM, то можно добавлять точки монтирования по имени LV.
Смотрим UUID раздела:
# blkid | grep /dev/sdb1
Добавляем его в fstab отдельной строкой:
UUID=eaf5c153-08b7-4ea8-8037-e6baad4cac0d /mnt/disk1 ext4 errors=remount-ro 1 0
А теперь проверяем, всё ли мы правильно добавили.
# findmnt --verify --verbose
Findmnt проверил все монтирования. В моём случае я получил предупреждение на /media/cdrom0.
[W] unreachable source: /dev/sr0: No such file or directory
Судя по всему систему ставили с какого-то диска, локального или сетевого, не знаю, но он остался в fstab. Делать ему там больше нечего, можно закомментировать строку с ним.
Более кратко можно получить информацию только об ошибках:
# findmnt -x
☝️Отдельно обращаю внимание на такой момент. До перехода управления к systemd было критически важно оставлять в fstab в конце файла переход на новую строку. Сейчас даже если этого не сделать, то проблем не будет. Всё нормально загрузится. Насколько я понимаю, это тянется из далёкого прошлого и POSIX-совместимой практики, когда файлы конфигурации заканчивались переходом на новую строку. Я лично до сих пор на всякий случай везде этой практики придерживаюсь.
Ещё один способ проверить корректность записей в fstab – использовать mount. Можно не монтировать вручную новый диск, а сразу добавить его в fstab. Потом запустить:
# mount -a -v
Утилита смонтирует все записи из файла, где не указан параметр noauto. Если вы всё верно добавили, то ошибок не увидите и получите смонтированным новый диск.
Расскажу, что будет, если, к примеру, ошибётесь с диском в fstab или он просто перестанет быть видим в системе. Я лично с этим не раз сталкивался. А однажды это привело к дальней дороге. Добавили наживую новый диск в сервер, я его добавил с ошибкой в fstab и не проверил. Сервер аварийно перезагрузился через полгода из-за обесточивания серверной. Возникли какие-то проблемы с доступом туда, ещё и сервер по неизвестной на тот момент мне причине не стартанул. Приехал туда ножками и увидел примерно то же самое, что вы видите на втором скрине.
Сразу понял, в чём дело, зашёл в режим обслуживания и поправил fstab. Так что внимательно относитесь к его настройке. Этой проблемы можно избежать, если использовать nofail в параметрах монтирования. Но с ним могут быть нюансы. Иногда лучше не загрузиться, если с разделом проблемы.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#linux
WebRadio
| ESP32-3248S035C , ESP32-3248S035R Down LOAD:WebRadio_3248S035C_OpenTape.zip 3.5″ 480×320 ESP32-248S035C:Sketch uses 84% Down LOAD:2024.09.22 ( Sep 22.2024 ) WebRadio_S3_3248S035R.zip ESP32-3248S035R を改造。 ESP32-WROOM-32 を ESP32-S3-WROOM-1-N16R8 に交換。 CH340C UARTは 削除。 MAX98357A と iPad 6 Speaker 2pcsを装備し Stereo機能装備。 Library: with ESP32-audioI2S-maste_3.0.12p_Sep.16.2024 |
|
![]() |
![]() |
ESP32-3248S035R 改造: ESP32 S3 + MAX98357A 2pcs + iPad 6 Speaker 2pcs![]() |
|
OpenHASP
Могу ли я использовать образы дисков из QEMU, VMware или других платформ виртуализации в bhyve?
bhyve does not currently support reading foreign disk image formats directly, so one will have to convert existing VMDK, QCOW, QCOW2, and VDI disk images to a raw image using qemu-img. This can be accomplished by doing the following on a FreeBSD system:
в настоящее время bhyve не поддерживает прямое чтение внешних форматов образов дисков, поэтому вам придется преобразовать существующие образы дисков VMDK, QCOW, QCOW2 и VDI в необработанный образ с помощью qemu-img. Этого можно добиться, выполнив следующие действия в системе FreeBSD:
$ pkg install qemu-tools $ qemu-img convert -f vmdk -O raw vmware_image.vmdk bhyve_raw_image.raw
freebsd мониторинг
Инструкция, freebsd мониторинг.
Внесу свои пять копеек в инструкцию по мониторингу.
Моя работа в основном заключается в удаленном администрировании серверов под управлением системы freebsd.
Иногда полезно держать под рукой уже заготовленный шаблон команд по снятию данных от процессов.
Работа с дисковыми подсистемами.
На мой взгляд есть еще одна утилита gstat.
# gstat
Если мы хотим выводить информацию только по активным дискам, то нужно запустить gstat с ключом а:
# gstat -a
dT: 1.006s w: 1.000s
L(q) ops/s r/s kBps ms/r w/s kBps ms/w %busy Name
0 189 29 923 2.1 160 7285 3.1 14.6| ada0
0 12 10 445 10.9 2 64 0.2 9.7| ada2
0 189 29 923 2.1 160 7285 3.1 14.6| ada0s1
0 189 29 923 2.1 160 7285 3.1 14.6| ada0s1a
0 12 10 445 10.9 2 64 0.2 9.7| ada2p1
Этот вариант более подробный, выведит больше информации по нагрузки дисков.
# iostat -w1 -dx
Выставим период снятия информации 1 секунду, этим мы выведем информацию по дискам.
# iostat -w1 -d
Должно получится что то вроде этого.
# iostat -w3 -d
ada0 ada1 ada2 ada3
KB/t tps MB/s KB/t tps MB/s KB/t tps MB/s KB/t tps MB/s
44.09 26 1.12 33.38 4 0.12 31.75 31 0.96 113.76 5 0.53
32.96 26 0.82 0.00 0 0.00 31.10 21 0.63 128.00 0 0.04
37.31 105 3.81 0.00 0 0.00 26.00 7 0.19 128.00 0 0.04
45.71 2 0.10 0.00 0 0.00 31.88 110 3.41 40.67 2 0.08
Протестируем диск.
# diskinfo -t ada0
Список открытых файлов в системе.
# pstat -f
Так с дисками закончили, теперь перейдем к сетевой подсистеме.
# systat -ifstat 1
/0 /1 /2 /3 /4 /5 /6 /7 /8 /9 /10
Load Average |||||
Interface Traffic Peak Total
lo0 in 0.000 KB/s 0.050 KB/s 117.844 MB
out 0.000 KB/s 0.050 KB/s 117.844 MB
igb0 in 190.516 KB/s 311.421 KB/s 51.684 GB
out 1.897 MB/s 4.343 MB/s 485.240 GB
Сетевые активные соединения. Снимаем информацию каждые две секунды.
# systat -netstat 2
Соединения tcp. Снимаем информацию каждые 2 секунды.
# systat -tcp 2
В настоящее время сколько пришло пакетов.
# netstat -w 1 -h
input (Total) output
packets errs idrops bytes packets errs bytes colls
1.2K 0 0 232K 542 0 2.0M 0
1.3K 0 0 218K 565 0 1.8M 0
1.5K 0 0 323K 797 0 3.0M 0
2.0K 0 0 340K 961 0 3.5M 0
Выводим ошибки.
# netstat -i
Таблицу маршрутизации.
# netstat -nr
Хватает ли системе mbuf.
# netstat -m
Но больше всего я предпочитаю снимать сетевую активность этой утилитой мониторинг сети с помощью nload.
О ней я позже напишу.
осталось процессор и оперативная память.
Общая системная статистика.
# systat -vmstat 2
Прерывание на процессоре.
# vmstat -i
Сколкьо используется свопа.
# systat -swap 1
Этим можно увидеть нагрузку на процессор и диски.
# systat -iostat 1
Просмотр буферов системы.
# vmstat -z
Смотрим кто перезагружал сервер.
# last
Выявляем траглодитного процесса.
# top -m io -o total
Скажу еще пару слов о хорошей утилите top.
a - Подробный паказ процессов. n 10 - Смотрим 10-ть самых больших процессов в системе. P - Выводим просмотр по ядерно, будит показана нагрузка в процентах на каждое ядро. S - Выводим на показ системные процессы. Утилита top очень обширна в ключах для вытягивания статистики системы. О top я расскажу чуть позже.
Дополнительный материал по статьи Средство проверки сети.
Вот такая маленький черновик freebsd мониторинг системы.
https://www.fryaha.ru/freebsd-monitoring-system/
Настройка IPFW + NAT в FreeBSD 14
Сервер FreeBSD будет выступать в качестве маршрутизатор (роутера) локальной сети, для этого будет использоватся Firewall IPFW и модуль маршрутизации NAT. Необходимо настроить раздачу интернета во внутреннею сеть и открыть порты сервисов которые работают на сервере. Одна сетевая карта сервера смотрит в интернет, вторая в локальную сеть. На сервера FreeBSD работает веб-сервер.
1. Архитектура маршрутизатора сети
Настроить можно как угодно и что угодно. Архитектура, которая используется в примере идентична по возможностям для большинства домашних роутеров.
Сервер FreeBSD имеет два сетевых интерфейса. К одной сетевой карте подключен кабель интернет провайдера с внешним IP адресом, к другой подключен кабель до коммутатора внутренний сети. Компьютеры внутренней сеть должно иметь доступ в интернет.

На сервере работает веб-сервер и другие сервисы, для это необходимо открыть порты доступа. Также надо настроить возможность проброса портов с внешнего IP адреса на компьютеры локальной сети, для торрент-клиентов, сетевых игр и так далее…
2. Включение IPFW + NAT
Открываем файл /etc/rc.conf
nano /etc/rc.conf
Добавляем строки
gateway_enable="YES" # Использовать сервер FreeBSD в качестве шлюза
firewall_enable="YES" # Включить IPFW
firewall_nat_enable="YES" # Включить NAT
firewall_script="/etc/ipfw.rules" # Файл с правилами IPFW + NAT
Добавляем строку если необходимо логировать какие-то правила. Запись событий будет происходить в файл /var/log/security журнала безопасности.
firewall_logging="YES"
В результате фрагмент файла rc.conf с параметрами сетевых карт и включённым маршрутизатором должен выглядеть следующим образом

Дополнительно можно добавить загрузку модулей ядра IPFW + NAT непосредственно в момент загрузки системы.
Открываем файл /boot/loader.conf
nano /boot/loader.conf
Добавляем строки
ipfw_load="YES"
ipfw_nat_load="YES"
libalias_load="YES"
При загрузке FreeBSD сразу будут загружатся: ipfw – модуля ядра IPFW, ipfw_nat – модуль базовых функций NAT, libalias – модуль полных функций NAT.
По умолчанию в IPFW весь трафик запрещен, поэтому при его запуске или после перезагрузки, без настройки файла правил, будет невозможно подключится через SSH.
Настраиваем файл правил IPFW до его запуска или временно изменяем поведение IPFW на “разрешить все по умолчанию”.
Для этого в файл /boot/loader.conf добавляем строку
net.inet.ip.fw.default_to_accept="1"
Теперь по умолчанию последнее правило IPFW будет разрешать любой трафик на всех сетевых картах. После завершения настройки рекомендую убрать добавленную строку.
IPFW + NAT может быть включен непосредственно в ядре FreeBSD. Для этого включаем в ядро необходимые модули
options IPFIREWALL # Включить IPFW
options IPFIREWALL_VERBOSE # Включить возможность логирования трафика
options IPFIREWALL_VERBOSE_LIMIT=5 # Количество одинаковых пакетов в одну запись лога
#options IPFIREWALL_DEFAULT_TO_ACCEPT # По умолчанию пропускать все, за исключением запрещенного правилами
options IPFIREWALL_NAT # Включить базовые возможности NAT
options LIBALIAS # Включить полные возможности NAT
#options IPFIREWALL_NAT64 # Включить поддержку NAT64
#options IPFIREWALL_NPTV6 # Включить поддержку IPv6 NPT
#options IPFIREWALL_PMOD # Поддержку модулей модификации протоколов
#options IPDIVERT # Включить NAT через natd(8)
Читать как собрать ядро FreeBSD: Конфигурация и сборка ядра FreeBSD 14
3. Синтаксис правил IPFW + NAT
Правила IPFW имеют примерно следующий синтаксис:
add <номер правила> [allow/deny] [ip/tcp/udp/…] from [any/me/<IP-адрес>] <порт> to [any/me/<IP-адрес>] <порт> {Опции}
Работу правила лучше объяснить на примере, например открываем 80 порт для веб-сервера
add 00400 allow tcp from any to me 80 in via em0 setup keep-state
Добавляется правило с номером 00400 (необязательный параметр) которое разрешает TCP пакеты с любого IP адреса до IP адреса сервера с 80 портом входящие через сетевую карту em0 и устанавливаются опции setup и keep-state. Опция setup сопоставляет TCP-пакеты, у которых установлен бит SYN, но отсутствует бит ACK, keep-state создает динамическое правило двунаправленного трафика.
Для работы маршрутизации и проброса портов, необходимо создавать экземпляр NAT, он имеет следующий синтаксис:
nat <номер> config [ip <IP-адрес> / if <сетевая карта>] {Опции}
Например, создаем экземпляр NAT с номером 1, через сетевой интерфейс em0 осуществляется выход в интернет, пробрасываем TCP порт 5530 с внешнего IP на компьютер внутренний сети с адресом 192.168.0.5 на том же порту
nat 1 config if em0 same_ports unreg_only deny_in reset redirect_port tcp 192.168.0.5:5530 5530
Доступные опции для nat:
- same_ports – следит за тем, чтобы псевдонимы портов и локальные номера портов были сопоставлены одинаково;
- unreg_only – обрабатывать только частный адресные пространства (192.168.0.0, 10.0.0.0, …);
- deny_in – запретить любое входящие соединение из внешнего мира;
- reset – сбрасывать и обновлять таблицу маршрутизации, если изменится внешний IP;
- redirect_port – перенаправление порта;
- redirect_addr – перенаправление IP-адреса.
4. Конфигурация IPFW + NAT
Создаем файл конфигурации /etc/ipfw.rules
nano /etc/ipfw.rules
Чем меньше правил, тем выше производительность IPFW. Объединяй по возможности несколько правил в одно.
Файл конфигурации IPFW + NAT будет выглядеть примерно так:
#!/bin/sh
# Очищаем список правил IPFW
ipfw -q -f flush
# Команда добавления правила, -q — режим без вывода сообщений
cmd="ipfw -q add"
# Сетевые карты заносим в переменные
net="em0" # сетевая карта интернета
lan="em1" # сетевая карта локальной сети
# Разрешить любой трафик внутри loopback интерфейса
$cmd 00010 allow all from any to any via lo0
# Запретить любой трафик извне до локальных адресов
$cmd 00011 deny ip from any to 127.0.0.0/8
$cmd 00012 deny ip from 127.0.0.0/8 to any
# Разрешить любые пакеты внутри локальной сети
$cmd 00050 allow ip from any to any via $lan
# Разрешить доступ к SSH серверу по 22 порту
$cmd 00510 allow tcp from any to me 22 in via $net
# Разрешить доступ к веб-серверу по 80 и 443 портам (HTTP/HTTPS)
$cmd 00520 allow tcp from any to me 80,443 in via $net
# Настройка маршрутизации IPFW + NAT
# Создаем экземпляр NAT с номером 1 и перенаправляем TCP 5530 порт на компьютер локальной сети с адресом 192.168.0.5
ipfw -q nat 1 config if $net same_ports unreg_only deny_in reset redirect_port tcp 192.168.0.5:5530 5530
# Разрешить проходить TCP и UDP пакетам, ping через NAT на сетевую карту интернета
$cmd nat 1 tcp from any to any via ${net}
$cmd nat 1 udp from any to any via ${net}
$cmd nat 1 icmp from any to any via ${net}
В таком варианте все исходящие пакеты с сервера и локальный сети проходят через NAT и создается двунаправленное правило для входящих пакетов. Входящие пакеты из интернета запрещены параметром deny_in в экземпляре NAT. Для открытия порта веб-серверу и SSH созданы правила, которые разрешают только входящие пакеты, а для исходящих пакетов будет использоватся правило NAT. В такой конфигурации firewall работает без динамических правил создаваемых опцией keep-state.
Вносим изменения и сохраняем файл с правила IPFW + NAT и можно приступать к запуску IPFW.
5. Запуск и перезапуск IPFW + NAT
Будь внимателен. Если есть ошибка или неточность в правилах, можно потерять доступ по SSH.
Запускаем службу IPFW
service ipfw start
Когда будут внесены какие-то изменения в файл с правилами межсетевого экрана и маршрутизации, необходимо перезапустить IPFW.
Перезапускаем службу IPFW
service ipfw restart
6. Команды IPFW + NAT
Вывести статистику по работе правил IPFW
ipfw -a -d -t list
- -a — количество совпавших пакетов и переданных байт;
- -d — вывести динамические правила;
- -t — время когда сработало правило последний раз;
- -e — динамические правила с истекшим сроком действия.
Удалить правило с указанным номером, например 00500
ipfw delete 00500
Вывести список экземпляром NAT и их параметры
ipfw nat show config
MPD 5.7 настройка VPN-сервера в FreeBSD
Настраиваем MPD5 в качестве VPN-сервера для подключений Windows-клиентов к офисной сети по протоколу PPTP.
MPD5 также может использоваться в качестве VPN-клиента для доступа к удаленной сети, или подключения к интернет провайдеру.
Для объединения нескольких сетей через интернет обратите внимание на OpenVPN. Ключевые отличия OpenVPN: туннель по UDP или TCP протоколу, TLS-шифрование, возможность задать клиенту маршруты к обслуживаемым сетям.
Содержание
- Установка MPD5
- Настройка MPD5
- Включение маршрутизации
- Настройка брандмауэра
- Настройка логов MPD5
- Запуск MPD5
- Возможные проблемы
- Анализ логов MPD5
- Ссылки
Установка MPD5
Устанавливаем пакет:
pkg install mpd5
Для установки из коллекции портов, обновляем коллекцию:
portsnap fetch && portsnap update || portsnap extract
Затем, устанавливаем порт:
cd /usr/ports/net/mpd5 make install clean
Настройка MPD5
Переходим в папку с файлами конфигурации:
cd /usr/local/etc/mpd5
В папке имеются следующие файлы:
- mpd.conf.sample - шаблон файла конфигурации,
- mpd.script.sample - скрипты для модемов,
- mpd.secret.sample - пример списка пользователей и паролей.
Копируем файл конфигурации из шаблона:
cp mpd.conf.sample mpd.conf
Открываем в редакторе:
ee mpd.conf
Идентификаторы секций в файле конфигурации задаются с начала строки и заканчиваются двоеточием. Значения параметров в начале строки обязательно отделяются табуляцией, пробелы также допустимы.
Удаляем все секции кроме startup, default и pptp_server. Для удаления строк в ee используем Ctrl+K. Также конфиг можно создать копипастом приведенного ниже листинга.
Задаем параметры. Строки, требующие корректировки, выделены жирным шрифтом:
#Секция startup загружается при запуске MPD5
startup:
#Протоколировать IP-адреса, с которых выполняются подключения
log +PHYS2
#Параметры http и telnet доступа для мониторинга и оперативного управления.
#Задать логин, пароль и роль администратора
set user пользователь пароль admin
#Задать пользователя, доступны роли operator и user, по умолчанию подразумевается user
#set user foo1 bar1
#Открыть локальный telnet доступ, порт 5005
set console self 127.0.0.1 5005
set console open
#Открыть веб-админку на всех интерфейсах, порт 5006
set web self 0.0.0.0 5006
set web open
#Если в команде запуска MPD не задана конфигурация, обрабатывается секция default.
default:
#Загрузить секцию pptp_server
load pptp_server
pptp_server:
#Пул динамических IP-адресов, начальный и конечный адрес
set ippool add pool1 192.168.1.50 192.168.1.99
#Создать динамический пучок (bundle) с именем B.
#Сетевые интерфейсы будут создаваться динамически при подключении клиента
create bundle template B
#Если IP-адрес клиента принадлежит локальной подсети, присвоить ему MAC-адрес
set iface enable proxy-arp
#Отключать клиента при отсутствии трафика в течение заданного количества секунд
#set iface idle 1800
#Корректировать размер пакета TCP-соединений через туннель,
#в случае если он превышает заданный MTU (TCP Maximum Segment Size Fix)
set iface enable tcpmssfix
#Разрешить сжатие заголовков TCP
set ipcp yes vjcomp
#IP-адрес для сервера и клиентов
#Адрес сервера: 192.168.1.1
#Для клиентов используем пул: "pool1", объявленный ранее
set ipcp ranges 192.168.1.1/32 ippool pool1
#Задать DNS-серверы для клиентов
set ipcp dns 192.168.1.3 192.168.2.3
#Задать WINS-серверы для клиентов
#set ipcp nbns 192.168.1.4
#Использовать шифрование Microsoft
#Протокол сжатия Microsoft в базовой поставке не поддерживается, требуется пересборка ядра со сторонним модулем.
set bundle enable compression
set ccp yes mppc
#Разрешить 40-битное и 128-битное шифрование Microsoft
#set mppc yes e40
set mppc yes e128
#Разрешить безстатусный (stateless) режим шифрования.
#Повышает устойчивость к потерям, ценой повышенной загрузки на процессор.
set mppc yes stateless
#Создать динамическую PPTP линию
create link template L pptp
#Связать с пучком B
set link action bundle B
#Использовать фрагментацию, если размер пакета превышает MTU
set link enable multilink
#Разрешить сжатие некоторых полей в заголовке, экономит от 1 до 3 байт на пакет
set link yes acfcomp protocomp
#Использовать CHAP авторизацию, протоколы: Microsoft CHAP v2, Microsoft CHAP, CHAP MD5.
set link no pap chap eap
set link enable chap
#Отправлять LCP эхо запрос каждые 10 секунд, если ответа не последует в течение 60 секунд, считать соединение разорванным.
#Не работает вплоть до версии 5.5, LCP-пинг отправляется раз в минуту
#set link keep-alive 10 60
#Максимальный размер пакета
#Стандарт для VPN - 1400
#Если VPN-соединение разрывается при передаче большого объема данных, следует уменьшить значение параметров, а также убедиться что работает Multilink
set link mtu 1402
set link mru 1400
#Принимать PPTP подключения на всех интерфейсах
set pptp self 0.0.0.0
set link enable incoming
Задаем список пользователей нашего VPN-сервера в файле mpd.secret:
ee mpd.secret
Задаем имена пользователей, пароли, при необходимости, присваиваем фиксированные IP-адреса. Имя пользователя и пароль чувствительны к регистру.
#login password ip user1 pass1 192.168.0.193 user2 pass2
Ограничиваем доступ к файлу:
chmod 600 mpd.secret
Включение маршрутизации
Проверяем, включена ли маршрутизация, командой:
sysctl net.inet.ip.forwarding
Если в результате видим: "net.inet.ip.forwarding: 1", значит маршрутизация включена, переходим к следующему разделу.
Если видим: "net.inet.ip.forwarding: 0", значит в /etc/rc.conf необходимо добавить параметр: gateway_enable="YES":
printf '\ngateway_enable=\"YES\"\n' >>/etc/rc.conf
Перезагружаем систему:
reboot
Проверяем, включена ли маршрутизация:
sysctl net.inet.ip.forwarding
В результате получаем:
net.inet.ip.forwarding: 1
Настройка брандмауэра
Для приема PPTP-подключений необходимо открыть входящие TCP-соединения на порт 1723 и разрешить GRE-трафик.
Для IPFW правила будут примерно следующие:
allow tcp from any to me dst-port 1723 setup keep-state allow gre from any to me allow gre from me to any
Подключенным клиентам также необходимо открыть доступ к локальной сети. В простейшем варианте, для пула 192.168.1.50 - 192.168.1.99, открываем полный доступ для всех локальных подключений, независимо от интерфейсов:
allow all from 192.168.1.0/24 to 192.168.1.0/24
Настройка логов MPD5
Для записи логов MPD5 использует syslog. Идентификатор источника сообщений задается ключом командной строки "--syslog-ident", значение по умолчанию - "mpd".
Редактируем syslog.conf:
ee /etc/syslog.conf
Добавляем следующие строки в конец файла:
!mpd *.* /var/log/mpd.log !*
Таким образом, все сообщения от источника "mpd" будут направлены в mpd.log.
Задаем параметры ротации логов:
ee /etc/newsyslog.conf
Ежедневная ротация в полночь с сохранением 7-ми логов в сжатом формате:
/var/log/mpd.log 600 7 * @T00 JC
Альтернативный вариант, с ежемесячной ротацией и хранением логов за последние три месяца:
/var/log/mpd.log 600 3 * $M1D0 JC
Подробнее о файле конфигурации читаем в справке: man newsyslog.conf.
Создаем лог-файл:
touch /var/log/mpd.log
Перезагружаем конфигурацию syslog:
service syslogd reload
Запуск MPD5
Разрешаем запуск MPD, добавляем в /etc/rc.conf параметр: mpd_enable="YES":
printf '\nmpd_enable=\"YES\"\n' >>/etc/rc.conf
Запускаем службу:
service mpd5 start
Проверяем, запущена ли служба и параметры запуска:
ps -ax | grep mpd5
В результате получаем:
1274 - Ss 0:00.00 /usr/local/sbin/mpd5 -p /var/run/mpd5.pid -b
Проверяем, слушается ли порт:
netstat -an | grep 1723
Результат должен быть следующим:
tcp4 0 0 *.1723 *.* LISTEN
Проверяем сообщения в лог-файле:
cat /var/log/mpd.log
В случае успешного старта видим следующий текст:
Multi-link PPP daemon for FreeBSD
process 1274 started, version 5.7 (root@10i386-default-job-10 21:06 12-Jun-2014)
CONSOLE: listening on 127.0.0.1 5005
web: listening on 0.0.0.0 5006
PPTP: waiting for connection on 0.0.0.0 1723
Заходим браузером в веб-админку: http:/адрес.сервера:5006, проверяем параметры соединений.
Создаем подключение в Windows, либо настраиваем на удаленной стороне MPD-клиент и пробуем подключиться. При настройке клиентского подключения в Windows, чтобы предотвратить туннелирование всего интернет трафика в удаленную сеть, в дополнительных настройках протокола TCP/IP, необходимо отключить флажок "Использовать основной шлюз в удаленной сети". В этом случае будет туннелироваться только трафик удаленной подсети в соответствии с ее классом.
В случае проблем используем tcpdump.
Мониторим физический канал:
tcpdump -v -ni интерфейс tcp port 1723 or proto gre
Мониторим туннель:
tcpdump -ni ng0
Возможные проблемы
Ошибка: "Can't create socket node: No such file or directory. Netgraph initialization failed", может возникнуть после установки новой версии системы. Проблема возникает из-за линковки программы со старыми системными библиотеками. В этом случае необходимо переустановить или пересобрать MPD.
Анализ логов MPD5
Чтобы быть в курсе как используется наш VPN-сервер, организуем ежедневную отправку на почту отчета по сессиям. Для получения административных почтовых уведомлений по протоколу POP3 потребуется установить Dovecot или Qpopper.
Готового решения на все случаи жизни мне найти не удалось. Рассмотрим примеры скриптов, которые можно взять за основу для построения своего анализатора.
Простейший отчет по сессиям
Сканируем лог за прошедший день командой grep, выбираем сообщения о подключении, отключении клиентов и имена пользователей. Ротация логов должна быть ежедневной.
Результат работы выдает следующий:
Jun 14 18:10:20 bsd-10 mpd: pptp0: attached to connection with 92.68.55.2 2539 Jun 14 18:10:23 bsd-10 mpd: [L-1] MESG: MSRASV5.20 Jun 14 18:10:23 bsd-10 mpd: [L-1] MESG: MSRAS-0-DESKTOP Jun 14 18:10:23 bsd-10 mpd: [L-1] Name: "user1" Jun 14 18:15:19 bsd-10 mpd: pptp0-0: call cleared by peer Jun 14 18:15:19 bsd-10 mpd: pptp0-0: killing channel
Добавим в /usr/local/etc/periodic/daily скрипт с именем 800.mpd:
ee /usr/local/etc/periodic/daily/800.mpd
Со следующим содержимым:
#!/bin/sh echo echo PPTP connections bzgrep -E '(mpd: pptp)|(MESG:)|(Name)' /var/log/mpd.log.0.bz2
Задаем права доступа:
chmod 755 /usr/local/etc/periodic/daily/800.mpd
Mpdstat
Единственный готовый скрипт, который мне удалось накопать на просторах интернета.
Сайт проекта: http://code.google.com/p/mpdstat/.
Perl-скрипт интегрируется в periodic, выдает следующий результат:
user1
duration: 0d 00:04:56 link: [L-1]
from: Jun 14 18:10:23 to: Jun 14 18:15:19
Active Session Report
User Report
user1: total: 0d 03:53:41 5times
Устанавливаем Perl:
pkg install perl5
Создаем папку для загрузки в пользовательском профиле:
mkdir -p ~/src
Загружаем Mpdstat:
svnlite checkout http://mpdstat.googlecode.com/svn/trunk/ ~/src/mpdstat
Переходим в папку с программой:
cd ~/src/mpdstat
Выполняем установку:
make install
В случае ошибки установки, переименовываем файл 900.mpdstatus в 900.mpdstat и запускаем установку повторно:
mv 900.mpdstatus 900.mpdstat make install
Открываем /etc/periodic.conf, если файл отсутствует в вашей системе, создаем его:
ee /etc/periodic.conf
Разрешаем исполнения скрипта и задаем путь к лог файлам:
daily_status_security_mpdstatus_enable="YES" daily_status_security_logdir="/var/log"
Выполняем тестовый запуск:
periodic security
Скрипт ищет лог за прошедший день, если он не найден, обрабатывает mpd.log.
Парсер на PHP
Я использую свой парсер на PHP, генерирующий следующий вывод:
L1> Jun 14 18:10:20 92.68.55.2 00:04:59 user1 static.kpn.net MSRASV5.20 L1> Jun 14 18:15:51 92.68.55.2 00:04:01 user1 static.kpn.net MSRASV5.20 L1> Jun 14 18:20:12 92.68.55.2 01:47:45 user1 static.kpn.net MSRASV5.20 L1> Jun 14 21:53:35 92.68.55.2 01:56:10 user1 static.kpn.net MSRASV5.20 L1> Jun 14 23:50:37 92.68.55.2 00:00:55 user1 static.kpn.net MSRASV5.20
Скрипт отображает IP-адреса, с которых устанавливаются соединения, и выполняет реверсные DNS-запросы. Параметр "log +PHYS2" должен быть включен в mpd.conf.
Устанавливаем PHP:
pkg install php5 php5-bz2
Создаем папку программы в профиле пользователя и переходим в нее:
mkdir /root/Programs cd /root/Programs
Загружаем архив:
fetch http://itadept.ru//files/freebsd-mpd5-server/MpdLogParser-0.1.tar.bz2
Распаковываем:
tar -xf MpdLogParser-0.1.tar.bz2
Переходим в папку с программой:
cd MpdLogParser
Создаем файл конфигурации:
cp MpdLogParser_Config.php.sample MpdLogParser_Config.php
Редактируем конфиг:
ee MpdLogParser_Config.php
Задаем параметры:
/* Часовой пояс из списка: http://php.net/manual/ru/timezones.php */ date_default_timezone_set("Europe/Moscow"); /* Путь к лог-файлу */ define('LOG_PATH',"/var/log/mpd.log.0.bz2"); /* IP-адреса, исключаемые из списка */ $IgnoreIP=array( // "1.2.3.4", // "5.6.7.8", );
Выполняем пробный запуск, лог-файл, заданный в конфиге (mpd.log.0.bz2) должен существовать, автопоиск не предусмотрен:
./MpdLogParser.php
Добавим в /usr/local/etc/periodic/daily скрипт с именем 800.mpd:
ee /usr/local/etc/periodic/daily/800.mpd
Со следующим содержимым:
#!/bin/sh echo echo PPTP connections /usr/local/bin/php /root/Programs/MpdLogParser/MpdLogParser.php
Задаем права доступа:
chmod 755 /usr/local/etc/periodic/daily/800.mpd
Выполняем тестовый запуск:
periodic daily
Вывод команды будет отправлен на почту пользователя root.
Настройка завершена.
Установка VMware Workstation Player в Debian / Ubuntu
На текущей момент самые производительные гипервизоры c большим количеством возможностей выпускает компания VMware. Использование виртуальной машины VMware Workstation Player в Linux удобно тем что в ней есть поддержка DirectX 11+. Это позволяет играть в гостевой системе Windows в производительные игры и использовать приложения для 3D.
После покупки VMware компанией Broadcom, теперь продукты VMware Fusion и Workstation стали бесплатные. Я в статье подправил ссылки, отчасти статья еще актуальная, но надо будет переписать или написать полностью новую статью.
1. Установить VMware Workstation Player
Установка производится от root пользователя или с привилегиями root через sudo
su -
1.1. Загрузка VMware Player
Скачиваем с официального сайта VMware последнею версию VMware Workstation Player. Для загрузки необходима регистрировать на сайте Broadcom (очень редко приходят письма на email).

Ссылка на репозиторий где можно скачать без создания учетной записи: https://softwareupdate.vmware.com/cds/vmw-desktop/ws/ (с 02.05.2025 не работает, оставил ссылку вдруг заработает.)
1.2. Установка необходимых пакетов
VMware Workstation Player во время установки собирает необходимые модули ядра Linux для нормальной работы виртуальной машины. Для сборки модулей ядра в Debian и Ubuntu необходимо чтобы в системы были установлены build-essential и linux-headers-*** пакеты. Чтобы не указывать версию ядра системы используем команду uname -r в команде на установку.
Устанавливаем необходимые пакеты
apt install build-essential linux-headers-$(uname -r)

Для Ubuntu 22.04 LTS дополнительно еще устанавливаем GCC 12 версии, так как пакет build-essential в Ubuntu содержит 11 версию.
apt install gcc-12
Дожидаемся окончание установки.
1.3. Установка VMware Player
Переходим в каталог куда скачали файл установки VMware Workstation 17 Player (в моем случае это каталог Downloads в домашней директории)
cd /home/user/Downloads/
Смотрим название скаченного файла
ls | grep VMware-Player
На момент написания статьи файл установки последней версии имеет имя VMware-Player-Full-17.5.0-22583795.x86_64.bundle
Выдаем файлу установки VMware-Player права на выполнение
chmod +x VMware-Player-Full-17.5.0-22583795.x86_64.bundle
Устанавливаем VMware Player
./VMware-Player-Full-17.5.0-22583795.x86_64.bundle

1.4. Запуск VMware Player
Открываем меню со списком установленных приложений и запускаем VMware Player
Если во время запуска VMware Player будет предложено установить модули ядра, значит они не смогли собратся во время установке. Если их установка завершится ошибкой “Unable to install all modules. See log for details.”, то читай следующий раздел статьи.

Читаем лицензионно соглашение и соглашаемся если оно устраивает ⇒ Выбираем проверять на наличии новых версий ⇒ Выбираем использовать бесплатную некоммерческую версию ⇒ Нажимаем Finish.
VMware Workstation Player запущена, можно создавать виртуальный машины.

2. Модули ядра vmmon и vmnet
Данный раздел статьи актуален только в том случае если VMware не смогла собрать свои модули ядра для Linux ядра.
VMware Player всегда собирает и устанавливает два своих модуля ядра vmmon и vmnet для своей работы. Сборка модулей проходит без проблем на стабильных версиях дистрибутивов Linux, так как они используют не самые последние версии ядре Linux.
При запуске VMware Player выводится окно с предложением собрать и загрузить модули ядра

При нажатии Install, сборка модулей ядра завершается ошибкой Unable to install all modules. See log for details. (Exit code 1)

Для решения этой проблемы существует проект на GitHub (github.com/mkubecek/vmware-host-modules) с исправленными модулями для сборки на последних ядрах Linux.
Существует два варианта сборки и установки модулей ядра:
- Замена оригинальных файлов VMware на модифицирование и последующая сборка средствами VMware
- Полностью ручная сборка модулей ядра и их установка в систему.
Способы сборки и установки будет показыватся на примере версии VMware Workstation Player 17.5.0, которая является последний на момент написания статьи.
2.1. Сборка модулей ядра средствами VMware
Данный метод предпочтительный, так как когда обновится ядра LInux, модули под новое ядро будет собраны и установлены средствами VMware при её запуске.
Скачиваем модифицированные модули для установленной версии VMware Workstation Player
wget https://github.com/mkubecek/vmware-host-modules/archive/workstation-17.5.0.tar.gz
Вместо 17.5.0 указываем установлению в системе версию VMware Workstation Player.
Извлекаем архив
tar -xzf workstation-17.5.0.tar.gz
Переходим в извлеченный каталог
cd vmware-host-modules-workstation-17.5.0
Упаковываем в архивы каталоги vmmon-only и vmnet-only
tar -cf vmmon.tar vmmon-only && tar -cf vmnet.tar vmnet-only
Копируем архивы в каталог VMware
cp vmmon.tar vmnet.tar /usr/lib/vmware/modules/source/
Запускаем сборку модулей ядра через утилиту vmware-modconfig
vmware-modconfig --console --install-all
Запускаем VMware Player и проверяем.
Теперь когда будет обновлятся ядро Linux на более новую версию при запуске VMware Player будет происходить сборка и установка модулей ядра.

2.2. Ручная сборка и установка модулей ядра
При этом методе при каждом обновление ядра Linux необходимо будет вручную повторять данный пункт.
Скачиваем модифицированные модули для установленной версии VMware Workstation Player
wget https://github.com/mkubecek/vmware-host-modules/archive/workstation-17.5.0.tar.gz
Вместо 17.5.0 указываем установлению версию VMware Workstation Player.
Извлекаем архив
tar -xzf workstation-17.5.0.tar.gz
переходим в извлеченный каталог
cd vmware-host-modules-workstation-17.5.0
Собираем и устанавливаем модули в ядро Linux
make && make install
Запускаем VMware Player и проверяем.
3. Удалить VMware Workstation Player
Когда необходимо переустановить, заменить версии или полностью удалить VMware, то возникает вопрос: как удалить VMware Workstation Player в Debian или Ubuntu? В списке установленных пакетов VMware Workstation Player нет и её необходимо удалять через утилиту vmware-installer.
Выводим список установленных продуктов VMware
vmware-installer -l

Удаляем VMware Player, vmware-player - имя удаляемого продукта.
vmware-installer -u vmware-player
Сразу будет задан вопрос “All configuration information is about to be removed. Do you wish to keep your configuration files?”, он означает хотим ли сохранить конфигурационные файлы? К конфигурационным файлам относятся настройки VMware и информация о лицензии, но не сами созданные виртуальные машины.

Если был установлен только один продукт, то утилита vmware-installer будет также удалена.
Выбор режима UEFI или BIOS в VMware Workstation 17 Player
По умолчанию виртуальная машина в VMware создается с режимом загрузки BIOS, если не выбирать Windows 10 или Windows 11. В бесплатной версии VMware Workstation Player в меню нет переключателя выбора режима загрузки (BIOS или UEFI) как в версии VMware Workstation Pro. В статье кратко будет показано как включить UEFI или BIOS режим загрузки в VMware Workstation 17 Player.
1. Создаем виртуальную машину
Создаем виртуальную машину, но не запускаем её. Можно использовать уже созданную с операционной системой, но тогда ОС не сможет загрузится из-за смены режима загрузки.

2. Редактируем файл виртуальной машины
Заходим в папку куда создали виртуальную машину и открывает файл с расширением “.vmx” (в моем случае это “Debian 12.vmx” файл) с именем созданной виртуальной машины в текстовом редакторе.

Находим строку firmware в открытом файле и изменяем её значение если необходимо. Если строки firmware нет, то VMware работает в режиме BIOS.
Добавляем следующею строку для включения режима UEFI
firmware = "efi"
Если нужно использовать режим BIOS изменяем значение на bios или полностью удаляем строку.
firmware = "bios"
3. Сохраняем файл и запускаем
Сохраняем файл виртуальной машины и запускаем её для проверки.
Если есть ошибка на некорректный параметр firmware при запуске, то это означает что в файле два параметра. Необходимо оставить только один параметр.

Виртуальная машина VMware запустилась в режиме UEFI.
Обновление FreeBSD 14.2 до FreeBSD 14.3
10 июня 2025 года вышла FreeBSD 14.3, и я решил обновиться с FreeBSD 14.2. Обновление в пределах одной ветки FreeBSD проходит проще и быстрее, поскольку нет необходимости переустанавливать приложения и сервисы. Начинаем процесс обновления до FreeBSD 14.3.
Если у тебя FreeBSD 13, то производи обновление как описано в статье: Обновление FreeBSD 13.2 до FreeBSD 14. Только внеси измерение в команду запуска обновления, чтобы получилось: freebsd-update upgrade -r 14.3-RELEASE
1. Обновление установленных приложений
Так как обновление FreeBSD происходит внутри одной ветки FreeBSD 14, то можно обновить все сервисы, библиотеки и приложения заранее.
Обновляем приложения через пакеты
pkg upgrade
Или обновляем через порты
portmaster -a
Статьи с подробным описанием процесса обновления всех приложений через порты или пакеты в FreeBSD.
2. Запуск обновления до FreeBSD 14.3
До запуска процесса обновления можно сменить текстовый редактор по умолчанию (vi) на другой. Например, сменяем на ee.
setenv EDITOR ee
Во время обновления, если понадобится ручное редактирование файла, будет вызыватся текстовый редактор ee.
Во время обновления может что-то пойти не так и будет утерян доступ к серверу через SSH. Например, если сервер использует не стандартное ядро, то после обновления будет GENERIC ядро. Если FreeBSD без модификаций, то все должно пройти безошибочно.
Запускаем процесс обновления до версии FreeBSD 14.3
freebsd-update upgrade -r 14.3-RELEASE
Установщик спросит разумно что будут установлены компоненты kernel/generic world/base, а компоненты debug и lib32 не будет установлены, отвечаем yes

Дожидаемся окончания процесса загрузки обновления.
Во время обновления автоматически могут не обновится конфигурационные файлы и их необходимо будет обновить вручную. Но такое маловероятно произойдет при обновлении внутри одной ветки и с файлами конфигурации по стандарту.
Установщик показывает какие изменения будут внесены в файле /etc/ssh/sshd_config (замена строки #VersionAddendum которая содержит версию FreeBSD) и если все корректно отвечаем yes.

Далее будет показан список файлов которые будут добавлены, изменены и удалены во время обновления. Для того чтобы их пролистать нажимаем Q на клавиатуре, и после списка будет выведено сообщение To install the downloaded upgrades, run ‘freebsd-update [options] install’. (Чтобы установить загруженные обновления, выполните команду "freebsd-update [options] install".).
3. Установка обновления FreeBSD 14.3
Устанавливаем обновление FreeBSD 14.3
freebsd-update install
Процесс установки обновлений запущен, по завершению программа обновлений сообщит Please reboot and run 'freebsd-update [options] install' again to finish installing updates. (Пожалуйста, перезагрузитесь и запустите команду "freebsd-update [options] install" снова, чтобы завершить установку обновлений.).
![Обновление до версии FreeBSD 14.3. Написана команда “freebsd-update install“. Выведено сообщение “Please reboot and run 'freebsd-update [options] install' again to finish installing updates.“.](https://notby.net/images/06/upgrade-to-freebsd-14-3-freebsd-update-install-please-reboot.webp)
Перезагружаем сервер
shutdown -r now
Запускаем команду для завершения установки обновления
freebsd-update install

Обновление до версии FreeBSD 14.3 успешно произведено.
uname -v
FreeBSD 14.3-RELEASE releng/14.3-n271432-8c9ce319fef7 GENERIC
Проверяем что все программы и сервисы работают корректно, ошибок после установки обновлений не появилось.
4. Установка исправлений безопасности
Сразу после обновления FreeBSD до последней версии, нет смысла проверять новые исправления безопасности, так как во время процесса обновления системы были установлены все последнее исправления безопасности.
Спустя какое-то время периодически необходимо проверять и установлять исправления безопасности FreeBSD. Проверку наличия обновлений можно настроить по расписанию через crontab.
Запускаем установку исправлений безопасности FreeBSD 14.3
freebsd-update fetch install
Дожидаемся окончания процесса установки исправлений безопасности.
Если во время обновления были затронуты файлы ядра FreeBSD, то необходимо будет перезагрузить сервер.
Настройка VPN сервера WireGuard в FreeBSD
VPN надёжно шифрует трафик, оберегая данные в публичных Wi-Fi, при сомнительных провайдерах или когда хочется больше анонимности и безопасности в сети. Сервер для VPN может быть куплен у провайдера VDS или можно использовать домашний сервер с внешним IP адресом. В статье разберём WireGuard — лёгкий, шустрый, открытый и безопасный VPN-протокол.
1. Установка WireGuard в FreeBSD
В FreeBSD уже давно WireGuard встроен в ядро и уже присутствует утилита wg, но для более легкой настройки удобнее использовать wg-quick.
Устанавливаем wireguard-tools через пакеты
pkg install wireguard-tools

Или устанавливаем wireguard-tools из портов
cd /usr/ports/net/wireguard-tools/ && make install clean
2. Генерация ключей для сервера и клиента WireGuard
Для шифрования соединения необходимо сгенерировать приватный и публичный ключ для VPN сервера и клиента WireGuard. В официальном руководстве WireGuard показан пример, где ключи генерируются в каталог /etc/wireguard/ каждый в отдельный файл. Эти файлы нужны только, для того чтобы перенести из них значения ключей в файлы конфигурации VPN сервера и клиента.
2.1. Генерация ключей сервера
Я накидал консольную команду которая выведет пару ключей на экран терминала и их можно будет скопировать в блокнот или использовать другое окно терминала. Для генерации приватного ключа используется команда wg genkey, для генерации публичного ключа используется команда wg pubkey и в качестве параметра для нее передается приватный ключ через временную переменную WGKEY.
Генерируем приватный и публичный ключ сервера:
WGKEY=$(wg genkey); echo "Server Private Key: $WGKEY"; echo $WGKEY | echo "Server Public Key: $(wg pubkey)"
Значение Server Private Key необходимо будет вставить в файл конфигурации сервера, а значение Server Public Key в файл конфигурации клиента.

Генерировать ключи можно на любом компьютере где уставлен WireGuard, необязательно на сервере, где будет работать VPN сервер.
2.2. Генерация ключей клиента
Консольная команда генерации ключей аналогичен предыдущей, но с добавлением генерации Pre-Shared Key через команду wg genpsk и заменой слова Server на Client
Генерируем приватный и публичный ключ клиента:
WGKEY=$(wg genkey); echo "Client Private Key: $WGKEY"; echo $WGKEY | echo "Client Public Key: $(wg pubkey)"; echo "Client Pre-Shared Key: $(wg genpsk)"
Значения Client Private Key и Client Pre-Shared Key необходимо будет вставить в файл конфигурации клиента, а значение Client Public Key в файл конфигурации сервера.

Для каждого отдельного пользователя/устройства необходимо генерировать свои ключи.
3. Получение имени сетевой карты
Перед настройкой конфигурации сервера необходимо знать имя сетевой карты которая смотрит в интернет.
Выводим список всех сетевых интерфейсов и находим имя нужной сетевой карты
ifconfig
Или можно получить имя сетевой карты, которая использует шлюз по умолчанию командой
route -n get default | grep 'interface:' | awk '{print $2}'
em0
В моем случае команда вывела имя em0 сетевого интерфейса, который получает интернет. Почти во всех случаях команда выведет имя нужной сетевой карты.
4. Настройка и конфигурация WireGuard сервера (wg0.conf)
Создаем файл конфигурации wg0.conf для VPN сервера WireGuard в каталоге /usr/local/etc/wireguard/
nano /usr/local/etc/wireguard/wg0.conf
Описание основных параметров конфигурационного файла wg0.conf (строки для работы в сетях IPv6 закомментированы)
# Файл конфигурации VPN сервера WireGuard
#
# Раздел "Interface" относится к настройкам сервера
[Interface]
# Приватный ключ сервера из значения "Server Private Key"
PrivateKey = gMtlDa6fcFLfKBRQiBJIaGzvVu9C0tGZrsQRg1DJMHU=
# IP адрес сервера и маска внутренней сети VPN
Address = 192.168.10.1/24
#Address = fd20:20:20::1/64
# Порт сервера
ListenPort = 51820
# Разделы "Peer" относится к настройкам клиентов
[Peer]
# Публичный ключ клиента из значения "Clinet Puplic Key"
PublicKey = MW5v76GNuyMXLyMmH6nDqQ98XdHNbdWluGB42J8SU3Y=
# Ключ PSK из значения "Clinet Pre-Shared Key"
PresharedKey = G1WVZwGj+bDzggvqx9jBTL6NH4dhlW5rCW0PCFHY2oY=
# IP адрес клиента (указание маски 32 обязательно для IPv4)
AllowedIPs = 192.168.10.2/32
#AllowedIPs = fd20:20:20::2/128
# Настройка для второго устройства
#[Peer]
#PublicKey = "Clinet Puplic Key"
#PresharedKey = "Clinet Pre-Shared Key"
#AllowedIPs = 192.168.10.3/32
Компактный файл конфигурации сервера выглядит так:
[Interface]
PrivateKey = gMtlDa6fcFLfKBRQiBJIaGzvVu9C0tGZrsQRg1DJMHU=
Address = 192.168.10.1/24
ListenPort = 51820
[Peer]
PublicKey = MW5v76GNuyMXLyMmH6nDqQ98XdHNbdWluGB42J8SU3Y=
PresharedKey = G1WVZwGj+bDzggvqx9jBTL6NH4dhlW5rCW0PCFHY2oY=
AllowedIPs = 192.168.10.2/32
Основные изменения которые необходимо внести в файл конфигурации:
- параметр PrivateKey необходимо изменить на свой приватный ключ сервера из “Server Private Key”;
- вместо ens33 необходимо указать имя своей сетевой карты;
- параметр PublicKey необходимо изменить на свой публичный ключ клиента из “Client Private Key”;
- параметр PresharedKey необходимо изменить на свой сгенерированный PSK ключ из “Client Pre-Shared Key”.
Вносим необходимые измерения и сохраняем файл.
5. Автозагрузка и запуск VPN сервера WireGuard
Добавляем в автозагрузку, где wg0 — имя файла конфигурации без указания расширения .conf
sysrc wireguard_enable="YES" && sysrc wireguard_interfaces="wg0"

Или вручную открываем файл /etc/rc.conf
nano /etc/rc.conf
и добавляем строки:
wireguard_enable="YES"
wireguard_interfaces="wg0"
Запускаем VPN сервера WireGuard
wg-quick up wg0

Для остановки используем команду
wg-quick down wg0
6. Создание файла конфигурации WireGuard клиента
Создаем файл конфигурации WireGuard клиента wg0-client.conf в каталоге /usr/local/etc/wireguard/
nano /usr/local/etc/wireguard/wg0-client.conf
Файл конфигурации клиента создается на сервере для удобства, чтобы была возможность в случае чего скопировать его в WireGuard клиент или передать через QR-код. Необязательно создавать данный файл на сервере, его можно сразу создать в WireGuard клиенте на устройстве пользователя.
Описание основных параметров конфигурационного файла WireGuard клиента
# Файл конфигурации VPN клиента WireGuard
#
# Раздел "Interface" относится к настройкам клиента
[Interface]
# Приватный ключ клиента из значения "Client Private Key"
PrivateKey = QKlR2932N1k5K4OvQ82DqQQnfJa/kpr3NIHtj+loTk4=
# IP адрес клиента и маска внутренней сети VPN
Address = 192.168.10.2/24
# Публичные DNS сервера или если на сервера VPN запущен DNS,
# то указываем IP адрес WireGuard сервера внутри VPN сети
DNS = 1.1.1.1, 1.0.0.1, 2606:4700:4700::1111, 2606:4700:4700::1001
#DNS = 192.168.10.1
# Раздел "Peer" относится к настройкам подключения к серверу
[Peer]
# Публичный ключ сервера из значения "Server Puplic Key"
PublicKey = Kyhl31NZO9hXhORc3hkpNMWFOF69ZCzlcQ4P70mh4xU=
# Ключ PSK из значения "Clinet Pre-Shared Key"
PresharedKey = G1WVZwGj+bDzggvqx9jBTL6NH4dhlW5rCW0PCFHY2oY=
# Публичный IP адрес сервера и порт, который был указан в файле wg0.conf
Endpoint = 80.95.110.25:51820
# До каких IP адресов пропускать трафик через VPN
# Весь трафик пускать через WireGuard
AllowedIPs = 0.0.0.0/0, ::/0
Используй всегда компактный файл, так как он необходим для генерации QR-кода и не везде поддерживается кириллица.
Компактный файл конфигурации клиента выглядит так:
[Interface]
PrivateKey = QKlR2932N1k5K4OvQ82DqQQnfJa/kpr3NIHtj+loTk4=
Address = 192.168.10.2/24
DNS = 1.1.1.1, 1.0.0.1, 2606:4700:4700::1111, 2606:4700:4700::1001
[Peer]
PublicKey = Kyhl31NZO9hXhORc3hkpNMWFOF69ZCzlcQ4P70mh4xU=
PresharedKey = G1WVZwGj+bDzggvqx9jBTL6NH4dhlW5rCW0PCFHY2oY=
Endpoint = 80.95.110.25:51820
AllowedIPs = 0.0.0.0/0, ::/0
Основные изменения которые необходимо внести в файл конфигурации:
- параметр PrivateKey необходимо изменить на свой приватный ключ клиента из “Client Private Key”;
- параметр PublicKey необходимо изменить на свой публичный ключ сервера из “Server Private Key”;
- параметр PresharedKey необходимо изменить на свой сгенерированный PSK ключ из “Client Pre-Shared Key”;
- в параметре Endpoint необходимо указать IP адрес и порт своего WireGuard клиента.
Вносим необходимые измерения и сохраняем файл.
7. Генерация QR-кода WireGuard туннеля
С телефона очень удобно получать файл конфигурации через сканирование QR-кода, но для этого файл wg0-client.conf необходимо преобразовать в QR-код. Утилита qrencode может создавать QR-коды и выводить их в консоль.
Устанавливаем утилиту qrencode [libqrencode]
pkg install libqrencode
Генерируем QR-код в терминале
qrencode -t ANSIUTF8 -r /usr/local/etc/wireguard/wg0-client.conf
где /etc/wireguard/wg0-client.conf — путь до файла конфигурации клиента.

8. Настройка файрвола и маршрутизации в FreeBSD
Чтобы была возможность раздавать интернет внутри VPN сети, необходимо настроить маршрутизацию пакетов через один из трех доступных файрволов (IPFW, PF, IPF) в FreeBSD.
Если сервер является удаленным и без возможности получения доступа через дистанционную клавиатуру и монитор, то при настройке файрвола нужно быть очень внимательным. Так как если будет ошибка в настройке может получится так, что будет невозможно подключится через SSH.
Я использую в качестве файрвола IPFW, поэтому покажу минимальные необходимые настройки на основе него, но также покажу еще пример настройки PF.
8.1. Настройка IPFW для WireGuard
Включаем IP-форвардинг
sysctl net.inet.ip.forwarding=1
Открываем файл /etc/rc.conf
nano /etc/rc.conf
Добавляем строки
gateway_enable="YES" # Включить шлюз (сделает net.inet.ip.forwarding=1)
firewall_enable="YES" # Включить IPFW
firewall_nat_enable="YES" # Включить NAT
firewall_script="/etc/ipfw.rules" # Файл с правилами IPFW
Строку gateway_enable="YES" можно не добавлять, а вместо этого добавить строку net.inet.ip.forwarding=1 в файл /etc/sysctl.conf
Открываем или создаем файл конфигурации /etc/ipfw.rules
nano /etc/ipfw.rules
Файл конфигурации IPFW + NAT для WireGuard VPN-сервера будет выглядеть примерно так:
#!/bin/sh
# Очищаем список правил IPFW
ipfw -q -f flush
# Команда добавления правила, -q — режим без вывода сообщений
cmd="ipfw -q add"
# Сетевые интерфейсы заносим в переменные
inet_if="em0" # сетевая карта интернета
wg_if="wg0" # интерфейс WireGuard (если wg0.conf, то указывать wg0)
# Разрешить локальный трафик
$cmd allow all from any to any via lo0
# Разрешить любые пакеты внутри сети WireGuard
$cmd allow ip from any to any via $wg_if
# Разрешить доступ к SSH серверу по 22 порту
$cmd allow tcp from any to me 22 in via $inet_if
# Разрешить доступ к VPN-серверу по протоколу UDP на 51820 порт
$cmd allow udp from any to me 51820 in via $inet_if
# Настройка маршрутизации для WireGuard
ipfw -q nat 1 config if $inet_if same_ports unreg_only deny_in reset
# Разрешить проходить любым пакетам через маршрутизацию
$cmd nat 1 all from any to any via $inet_if
Этих настроек будет достаточно для раздачи интернета внутрь VPN сети и будет возможность подключится к WireGuard и SSH из интернета. Весь исходящий трафик с сервера в интернет будет идти через правило маршрутизации.
Вносим изменения и сохраняем файл с правилами IPFW.
Будь внимателен. Если есть ошибка или неточность в правилах, можно потерять доступ по SSH.
Запускаем службу IPFW
service ipfw start
Можно переходить к проверке VPN-сервера WireGuard.
Более подробно о настройке IPFW читай: Настройка файрвола IPFW в FreeBSD и Настройка IPFW + NAT в FreeBSD
8.2. Настройка PF для WireGuard
Включаем IP-форвардинг
sysctl net.inet.ip.forwarding=1
Открываем файл /etc/sysctl.conf
nano /etc/sysctl.conf
добавляем строку net.inet.ip.forwarding=1 для постоянного включения IP-форвардинга
net.inet.ip.forwarding=1
Сохраняем файл и закрываем.
Открываем файл /etc/rc.conf
nano /etc/rc.conf
Добавляем строки
pf_enable="YES" # Включить PF
pf_rules="/etc/pf.conf" # Файл с правилами PF
Открываем или создаем файл конфигурации /etc/pf.conf
nano /etc/pf.conf
Файл конфигурации PF + NAT для WireGuard VPN-сервера будет выглядеть примерно так:
# Определение интерфейсов и параметров
inet_if="em0" # сетевая карта интернета
wg_if="wg0" # интерфейс WireGuard (если wg0.conf, то указывать wg0)
wg_net = "192.168.10.0/24" # Внутренняя сеть WireGuard (которая указана в wg0.conf)
# Пропускать локальный трафик
set skip on lo0
# Включение NAT для трафика из сети WireGuard
nat on $inet_if from $wg_net to any -> ($inet_if)
# Разрешить любые пакеты внутри сети WireGuard
pass on $wg_if all
# Разрешить доступ к SSH серверу по 22 порту
pass in on $inet_if proto tcp from any to ($inet_if) port 22
# Разрешить доступ к VPN-серверу по протоколу UDP на 51820 порт
pass in on $inet_if proto udp from any to ($inet_if) port 51820
# Разрешить весь исходящий трафик
pass out all
Этих настроек будет достаточно для раздачи интернета внутрь VPN сети и будет возможность подключится к WireGuard и SSH из интернета.
Вносим изменения и сохраняем файл с правилами PF.
Будь внимателен. Если есть ошибка или неточность в правилах, можно потерять доступ по SSH.
Запускаем службу PF
service pf start
Можно переходить к проверке VPN-сервера WireGuard.
9. Подключение к серверу WireGuard
Теперь необходимо подключится к VPN сервера WireGuard и проверить его работоспособность с различных устройств. Если что-то не будет работать, необходимо внимательно проверить настройки и корректность внесения ключей.
9.1. Подключение из Windows к VPN серверу WireGuard
Запускаем PowerShell и копируем файл wg0-client.conf с сервера через утилиту scp в любое место на компьютере, например на рабочий стол
scp root@80.95.110.25:/etc/wireguard/wg0-client.conf 'C:\Users\User\Desktop\'
Вместо root@80.95.110.25 указываем свои данные для доступа по SSH, вместо User указываем свое имя пользователя Windows.

Скачиваем с официального сайта wireguard-installer.exe и запускаем установщик. Произойдет установка WireGuard и он автоматически запустится.
Нажимаем на кнопку Импорт туннелей из файла и выбираем файл, скачанный ранее.

Подключаемся к WireGuard серверу нажав кнопку Подключить и пробуем куда-нибудь зайти.

Как можно видеть, трафик принимается и передается, VPN WireGuard успешно работает.
Если интернет не работает, то проверяем что пакеты доходят до IP адреса сервера внутри VPN сети и до IP адреса в интернете
ping 192.168.10.1; ping 1.1.1.1
где 192.168.10.1 — IP адрес WireGuard сервера указанный в файле wg0.conf в параметре Address, а IP адрес 1.1.1.1 — публичный DNS сервер.
9.2. Подключение из Linux к VPN серверу WireGuard
Устанавливаем WireGuard
apt install wireguard
Копируем файл wg0-client.conf с сервера в каталог /etc/wireguard/ через scp
scp root@80.95.110.25:/etc/wireguard/wg0-client.conf /etc/wireguard/
Подключаемся к WireGuard серверу
wg-quick up wg0-client
где wg0-client — имя файла конфигурации без указания расширения .conf
Проверяем что пакеты доходят до IP адреса сервера внутри VPN сети и до IP адреса в интернете
ping 192.168.10.1 -c 3; ping 1.1.1.1 -c 3
где 192.168.10.1 — IP адрес WireGuard сервера указанный в файле wg0.conf в параметре Address, а IP адрес 1.1.1.1 — публичный DNS сервер.

Как можно видеть, пинг до VPN сервера WireGuard и публичного DNS 1.1.1.1 успешен, можно пользоватся VPN WireGuard.
Чтобы выключить VPN, используем команду
wg-quick down wg0-client
Если необходимо, чтобы VPN подключался при запуске компьютера, то добавляем в автозагрузку автоматическое подключение к серверу WireGuard
systemctl enable wg-quick@wg0-client
Чтобы убрать из автозагрузки автоматическое подключение WireGuard, используем команду
systemctl disable wg-quick@wg0-client
9.3. Подключение с телефона Android к VPN серверу WireGuard
Устанавливаем приложение WireGuard из Google Play.
Запускаем приложение, нажимаем на + в нижней правой части экрана, выбираем из списка Сканировать QR-код и сканируем QR-код из консоли. Можно загрузить файл wg0-client.conf на телефон, выбрать из списка Импорт из файла или архива и указать данный файл.

Подключаемся к WireGuard серверу и пробуем куда-нибудь зайти.

Как можно видеть, в статистике трафик принимается и передается, VPN WireGuard успешно работает.
Сборка и установка AmneziaWG на Debian из исходного кода
AmneziaWG состоит из двух частей: модуля ядра Linux, утилит awg и awg-quick для управления туннелями. В официальном репозитории Debian отсутствует AmneziaWG. Для установки можно использовать сторонний репозиторий ppa, но я покажу в статье полностью ручной процесс сборки. Это даст контроль и безопасность, ведь неизвестно, собран ли в репозитории пакет из исходного кода с github'а или нет.
В статье принято следующее обозначение: если перед командой находится символ $, её можно выполнять от имени обычного пользователя; если перед командой находится символ #, её необходимо выполнять от имени пользователя root или с использованием sudo.
<- выполнять от обычного пользователя
<- выполнять от root-пользователя или с его привилегиями через sudo
1. Подготовка к сборке и установке AmneziaWG
1.1. Установка необходимых утилит
Устанавливаем утилиту git для клонирования репозиториев с github, компилятор gcc и сборщик make
apt install git make gcc
1.2. Установка заголовков ядра
Для сборки модуля необходимы заголовки ядра Linux установленной системы
apt install linux-headers-$(uname -r)
Чтобы заголовки ядра автоматически загружались при обновлении ядра, можно установить мета-пакет с указанием архитектуры компьютера
apt install linux-headers-amd64
2. Модуль ядра AmneziaWG
2.1. Загрузка исходного кода модуля ядра AmneziaWG
Создаем для удобства каталог git в домашней директории пользователя и переходим в него
mkdir -p ~/git && cd ~/git
Клонируем репозиторий amneziawg-linux-kernel-module
git clone https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git

2.2. Сборка и установка модуля ядра через DKMS
Заходим под root-пользователем или выполняем команды через sudo
su -
2.2.1. Установка DKMS
Dynamic Kernel Module Support (DKMS) используется для того чтобы при обновлении ядра Linux до новой версии, происходила автоматическая сборка дополнительных моделей ядра из исходных кодов.
Устанавливаем DKMS
apt install dkms
Дожидаемся окончания установки.
2.2.2. Подготовка исходного кода для DKMS
Создаем каталог amneziawg-1.0.0 в каталоге /usr/src/
mkdir -p /usr/src/amneziawg-1.0.0/
Переходим в каталог клонированного репозитория amneziawg-linux-kernel-module
cd amneziawg-linux-kernel-module
Копируем содержимое каталога src в каталог /usr/src/amneziawg-1.0.0/ который ранее создали
cp -r src/* /usr/src/amneziawg-1.0.0/
Копируем скрипты загрузки исходных кодов ядра Linux для модуля AmneziaWG в каталог /usr/src/amneziawg-1.0.0/
install -m 755 kernel-tree-scripts/*-sources.sh /usr/src/amneziawg-1.0.0/
Копирование через утилиту install позволяет сразу установить необходимые права для выполнения скриптов.

2.2.3. Сборка и установка модуля ядра
Добавляем модуль ядра amneziawg в DKMS
dkms add -m amneziawg -v 1.0.0
Собираем модуль ядра amneziawg через DKMS
dkms build -m amneziawg -v 1.0.0
Устанавливаем модуль ядра amneziawg через DKMS
dkms install -m amneziawg -v 1.0.0

Модуль ядра amneziawg теперь будет автоматически собиратся при каждом обновлении ядра Linux.
Через встроенный скрипт он будет предварительно скачивать исходный код ядра Linux, а после сборки удалит скачанные и временные файлы.
2.3. Сборка и установка модуля ядра вручную
2.3.1. Загрузка исходного кода ядра Linux
Для сборки модуля ядра AmneziaWG необходим исходный код ядра Linux установленной системы.
Загружаем исходный код ядра Linux.
apt install linux-source
linux-source — это мета-пакет который включает исходный код ядра Linux текущей системы.
Исходный код будет загружен в каталог /usr/src/ в формате tar.xz архива.
Переходим в каталог /usr/src/
cd /usr/src/
Находим имя архива с исходным кодом ядра (оно будет иметь имя в зависимости от версии ядра установленной системы)
ls | grep linux-source
Извлекаем содержимое архива (в моем случае это linux-source-6.1.tar.xz)
tar -xJf linux-source-6.1.tar.xz
2.3.2. Сборка модуля ядра
Переходим в каталог клонированного репозитория amneziawg-linux-kernel-module
cd amneziawg-linux-kernel-module
Переходим в каталог src
cd src
Добавляем символьную ссылку на исходный код ядра Linux установленной системы
ln -s /usr/src/linux-source-<версия ядра> kernel
Вместо <версия ядра> необходимо указать версию ядра Linux установленной системы.
Например, в моем случае это версия 6.1 и команда будет выглядеть следующим образом:
ln -s /usr/src/linux-source-6.1 kernel
Собираем модуль ядра amneziawg
make
Дожидаемся окончания сборки, если все успешно будет выведено true.
2.3.3. Установка модуля ядра
Устанавливаем модуль ядра amneziawg
make install
Загружаем модуль ядра amneziawg
modprobe amneziawg
Проверяем что модуль amneziawg загружен
lsmod | grep amneziawg
3. Утилиты awg и awg-quick для управления AmneziaWG
Для управления собранным модулем ядра AmneziaWG необходимы утилиты с той же модификацией протокола WireGuard, что и модуль ядра.
Утилиты имеют имена awg, awg-quick и они по командам, способом управления аналогичны утилитам wg, wg-quick из WireGuard.
3.1. Загрузка исходного кода утилит AmneziaWG
Создаем для удобства каталог git в домашней директории пользователя и переходим в него
mkdir -p ~/git && cd ~/git
Клонируем репозиторий amneziawg-tools
git clone https://github.com/amnezia-vpn/amneziawg-tools.git

3.2. Сборка утилит awg и awg-quick
Переходим в каталог клонированного репозитория amneziawg-tools
cd amneziawg-tools
Переходим в каталог src
cd src
Запускаем процесс сборки утилит awg и awg-quick
make

Дожидаемся окончания сборки.
3.3. Установка утилит awg и awg-quick
Заходим под root-пользователем или выполняем команды через sudo
su -
Устанавливаем утилиты awg и awg-quick
make install

- в каталог /usr/bin/ будут скопированы утилиты awg и awg-quick;
- в каталог /usr/share/bash-completion/completions/ будут скопированы скрипты для bash-окружения;
- в каталог /usr/lib/systemd/system/ будут скопированы файлы для работы AmneziaWG в качестве службы systemd.
4. Конфигурация AmneziaWG и перенос файлов WireGuard
В AmneziaWG каталог с конфигурационными файлами находится по пути /etc/amnezia/amneziawg/ и утилита awg-quick будет искать там файлы для создания туннеля.
Если необходимо скопировать конфигурационные файлы WireGuard в AmneziaWG используем следующею команду
cp /etc/wireguard/*.conf /etc/amnezia/amneziawg/
Переходим в каталог конфигурации AmneziaWG
cd /etc/amnezia/amneziawg/
Создадим, например, файл конфигурации с именем awg0-client.conf или откроем любой из перенесенных файлов конфигураций
nano awg0-client.conf
Настройка, конфигурация и управление AmneziaWG происходит аналогично Wireguard. Можно использовать статью Настройка VPN сервера WireGuard в Linux (Debian/Ubuntu), только вместо команды wg использовать awg, a вместо wg-quick использовать awg-quick.
5. Удаление AmneziaWG
Если возникнет необходимость удалить AmneziaWG, нужно удалить модуль ядра и утилиты с их файлами.
Удаляем модуль ядра amneziawg через DKMS
dkms remove -m amneziawg -v 1.0.0
Удаляем каталог /usr/src/amneziawg-1.0.0/
rm -rf /usr/src/amneziawg-1.0.0/
Утилиты awg и awg-quick устанавливались простым копированием, поэтому удаляем их с их файлами по списку
rm -v /usr/bin/awg /usr/share/man/man8/awg.8 /usr/share/bash-completion/completions/awg /usr/bin/awg-quick /usr/share/man/man8/awg-quick.8 /usr/share/bash-completion/completions/awg-quick /usr/lib/systemd/system/awg-quick.target /usr/lib/systemd/system/awg-quick@.service
AmneziaWG FreeBSD 14
https://github.com/vgrebenschikov/amneziawg-tools
FreeBSD port of amneziawg-tools
Installation
Download and build port as:
# git clone https://github.com/vgrebenschikov/amneziawg-tools # cd amneziawg-tools # make install
It will install:
$ pkg list amneziawg-tools /usr/local/bin/awg /usr/local/bin/awg-quick /usr/local/etc/rc.d/wireguard-amnezia /usr/local/share/bash-completion/completions/awg /usr/local/share/bash-completion/completions/awg-quick /usr/local/share/licenses/amneziawg-tools-1.0.20241018_2/GPLv2 /usr/local/share/licenses/amneziawg-tools-1.0.20241018_2/LICENSE /usr/local/share/licenses/amneziawg-tools-1.0.20241018_2/catalog.mk /usr/local/share/man/man8/awg-quick.8.gz /usr/local/share/man/man8/awg.8.gz
Using Kernel AmneziaWG module
Install net/wireguard-amnezia-kmod
Unload original if_wg as and load updated from /boot/modules/if_wg.ko
# kldunload if_wg # kldload /boot/modules/if_wg.ko
To make it automatically load from /boot/modules - add to /boot/loader.conf:
if_wg_name="/boot/modules/if_wg.ko" if_wg_load="YES"
Configuration
Generally - same way as you will configure normal net/wireguard-tools:
# cd /usr/local/etc/wireguard # cat > wg0.conf [Interface] PrivateKey = ...our.private.key.here... ListenPort = 12345 Address = 192.168.1.1/24 Description = Test Wireguard Jc = 7 Jmin = 150 Jmax = 1000 S1 = 117 S2 = 321 H1 = 2008066467 H2 = 2351746464 H3 = 3053333659 H4 = 1789444460 [Peer] PublicKey = ...peer.public.key.here... AllowedIPs = 192.168.1.2/32 ^D
Then start:
# awg-quick up wg0 [#] ifconfig wg create name wg0 description Test Wireguard [#] awg setconf wg0 /dev/stdin [#] ifconfig wg0 inet 192.168.1.1/24 alias [#] ifconfig wg0 mtu 1420 [#] ifconfig wg0 up [#] route -q -n add -inet 192.168.11.0/24 -interface wg0 [+] Backgrounding route monitor # awg show interface: wg0 public key: CI... private key: (hidden) listening port: 12345 jc: 7 jmin: 150 jmax: 1000 s1: 117 s2: 321 h1: 2008066467 h2: 2351746464 h3: 3053333659 h4: 1789444460 peer: kue... allowed ips: 192.168.1.2/32
To setup autostart (wireguard-amnezia rc.d script will load module):
# sysrc wireguard_amnezia_enable=YES wireguard_amnezia_interfaces="wg0"
Amnezia Wireguard config options
Jc
Number of junk packets before handshake.
1–128 (recomended 3–10)
Jmin
Minimum size of junk packets.
Jmin: < Jmax (recomended ~ 50)
Jmax
Maximum size of junk packets.
Jmax: ≤ 1280 (recomended ~ 1000)
S1
Size of handshake initiation packet prepend junk. Should be the same on both ends.
0–1280 (recomended 15–150), S1 != S2
S2
Size of handshake response packet prepend junk. Should be the same on both ends.
0–1280 (recomended 15–150), S1 != S2
H1-H4
Custom identifiers for initiation/response/cookie/data packets. Should be the same on both ends.
The unique value in range of 5 - 4,294,967,295 (0x5 - 0xFFFFFFFF), H1 != H2 != H3 != H4
Additional config options
Description
[Interface]
...
Description = Some Text
Will setup interface description visible in ifconfig and SNMP.
UserLand
Enforce to use amnezia-go instead of kernel driver, you can use port net/amnezia-wireguard-go to install it.
[Interface]
...
UserLand = true
...
Routes
List of routes for the peer to be installed into FIB - that option provides a way to have AllowedIPs list wider then routes installed. Empty list is allowed.
That is useful if routing protocol will work over the link. But remember that internal wireguard routing will happen according to AllowedIPs anyway.
...
[Peer]
PublicKey = ...peer.public.key.here...
AllowedIPs = 0.0.0.0/0
Routes = 192.168.1.2/32
Как просматривать видео с камеры Tapo на ПК/NAS/NVR при помощи протоколов RTSP/ONVIF
Камеры Tapo имеют поддержку протоколов ONVIF и RTSP, позволяя им работать с видеорегистраторами и NAS устройствами сторонних производителей, на которых так же реализована поддержка протоколов RTSP/ONVIF. Ниже представлен представлены шаги настройки камеры для просмотра видео с камеры Tapo при помощи сторонних приложений, таких как VLC Player и iSpy.
Примечания:
1. Имя пользователя и пароль, необходимые для использования RTSP/ONVIF это ни что иное, как данные учетной записи камеры, которую Вы можете создать в приложении Tapo. Если Вы не создавали учетную запись, то можете воспользоваться инструкциями, представленными в первом шаге данной инструкции;
2. IP-адрес присваивается камере автоматически Вашим Wi-Fi роутером, к которому Вы её подключали. Узнать его можно в списке клиентов DHCP Вашего роутера или в приложении Tapo (для этого необходимо попасть в настройки самой камеры и перейти в раздел “Информация об устройстве”, где будет указан IP-адрес, полученный камерой).
3. Если Вы хотите просматривать RTSP-поток камеры Tapo удалённо, Вам будет необходимо открыть порт 554 на Вашем роутере, то есть настроить перенаправление (“проброс”) порта.
4. Вы можете использовать протокол ONVIF с использованием имени пользователя и пароля для управления Вашей камерой Tapo. Пример настройки ONVIF представлен во втором шаге данной инструкции.
5. Для камеры Tapo C310, разрешение потока stream1 соответствует качеству, заданному в настройках камеры.
Если Вы хотите просматривать видео с разрешением 3МП при использовании RTSP, необходимо изменить качество видео на “Лучшее качество” в мобильном приложении Tapo и использовать следующий адрес: rtsp://[IP адрес]/stream1
6. Если в камере используется карта памяти microSD и подключена подписка Tapo Care, настроить RTSP не удастся. Вам будет необходимо отключить карту памяти microSD или подписку Tapo Care для получения доступа к RTSP-потоку камеры.
7. Если Вы обнаружили, что при просмотре видео с камеры через ONVIF/RTSP отсутствует звук, пожалуйста, попробуйте изменить чувствительность микрофона камеры в мобильном приложении.
8. Перед началом настройки, убедитесь, что устройство, с которого планируется осуществлять просмотр видео с камеры Tapo, находится в той же локальной сети, что и сама камера или что Ваш роутер доступен в сети Интернет (требуется наличие “белого” (публичного) IP-адреса, предоставляемого интернет-провайдером Вашему роутеру. Более подробная информация представлена в конце статьи).
Шаг 1. Создайте учетную запись камеры в приложении Tapo:
1. Во вкладке “Дом” нажмите на Вашу камеру для входа в её интерфейс (Вы также можете перейти во вкладку “Камеры” и нажать на кнопку “Управление” на необходимой камере для входа в её интерфейс).
2. В интерфейсе камеры перейдите в её настройки, нажав на соответствующую иконку справа сверху.

3. Перейдите в раздел “Дополнительные настройки” > “Учетная запись камеры” для создания учетной записи (имя пользователя/пароль). С её помощью осуществляется управление камерой при использовании сторонних сервисов.
Здесь Вы увидите информацию о данной функции (“Об учетной записи камеры” и “Прежде чем начать”). Пожалуйста, ознакомьтесь с информацией, после чего нажмите “Понятно, согласен”. После этого Вы сможете создать учетную запись вашей камеры, заполнив соответствующие поля.
Примечание: Имя пользователя и пароль должны содержать от 6 до 32 символов.



Шаг 2: Просмотр камеры через iSpy (пример с использованием ONVIF)
1. Запустите iSpy на Вашем ПК.
2. Нажмите “Add” в левом верхнем углу экрана и выберите “ONVIF Camera”.
3. Введите имя пользователя (Username) и пароль (Password), которые Вы указывали при создании учетной записи камеры, выберите адрес сети (Network Address) и нажмите “Next”. Вы можете также изменить дополнительные параметры при необходимости.
4. Выберите разрешение видео и нажмите “OK”.
5. При необходимости настройте параметры камеры, включая микрофон, голосовую связь, обнаружение движения, оповещения, запись, изображения, расписания и хранение. Данные параметры можно будет изменить позднее. Нажмите “Finish” для завершения добавления камеры в iSpy.
6. После добавления камеры Tapo в iSpy Вы сможете просматривать и управлять камерой. Вам доступны просмотр в реальном времени, настройки обнаружения движения, проверка записи при обнаружении движения, установка записи по расписанию, видеозапись и многое другое.
Шаг 3: просмотр камеры Tapo через VLC Player (пример с использованием RTSP)
1. Запустите VLC Media Player на Вашем ПК.
2. Во вкладке “Медиа” выберите “Открыть URL…”
3. Введите URL-адрес RTSP-потока камеры Tapo.
4. Нажмите “Воспроизвести”.
URL-адреса RTSP-потока камер Tapo имеют следующий вид:
— Поток в высоком качестве: rtsp://[IP-адрес камеры]/stream1
— Поток в низком качестве: rtsp://[IP-адрес камеры]/stream2
В некоторых случаях также требуется указать порт камеры. По умолчанию, для RTSP используется порт 554 и в таком случае URL-адрес будет иметь следующий вид:
— Поток в высоком качестве: rtsp://[IP-адрес камеры]:554/stream1
— Поток в низком качестве: rtsp://[IP-адрес камеры]:554/stream2
Если Вы хотите предоставить доступ к трансляции с Вашей камеры другому лицу, которое находится во внешней сети, изучите информацию, приведенную ниже.
Чтобы трансляцию можно было просматривать из внешней сети, ссылка на нее должна содержать белый (“публичный”) IP-адрес. Это услуга, которую необходимо подключить у Вашего провайдера. Обычно она оказывается за дополнительную абонентскую плату.
Проверить, предоставлен ли Вам белый IP-адрес, достаточно легко. Нужно зайти в настройки роутера и посмотреть, какой IP-адрес приходит на интерфейс WAN. Если Вы используете роутер марки TP-Link, то эту информацию можно увидеть на странице “Дополнительные настройки” – “Сеть” – “Интернет” или “Сеть” – “WAN” (в зависимости от типа интерфейса Вашего роутера). Если Вы используете роутер другой марки, пожалуйста, свяжитесь с поддержкой производителя Вашего роутера, чтобы узнать эту информацию.
Адрес, который Вы увидите там, НЕ должен принадлежать ни одному из следующих диапазонов:
- 10.0.0.0 — 10.255.255.255 (маска подсети 255.0.0.0 или /8);
- 100.64.0.0 — 100.127.255.255 (маска подсети 255.192.0.0 или /10);
- 172.16.0.0 — 172.31.255.255 (маска подсети: 255.240.0.0 или /12);
- 192.168.0.0 — 192.168.255.255 (маска подсети: 255.255.0.0 или /16).
Также нужно настроить проброс порта на этом роутере. Чтобы узнать, как это сделать, обратитесь к этой статье: https://www.tp-link.com/ru/support/faq/1379/
Внимание: Обычно для камеры выполняется проброс порта 554 для потока RTSP. Для потока ONVIF нужно пробросить порт 2020.
Далее, в ссылке на RTSP-поток должен быть указан адрес на WAN-порту роутера, который мы нашли ранее, и указанный при пробросе внешний порт в формате: rtsp://[IP-адрес]:[Внешний порт]/stream1 или rtsp://[IP-адрес]:[Внешний порт]/stream2
К сожалению, просмотр трансляции не будет доступен через браузер, однако для этой цели можно использовать программу iSpy или VLC Player.
Получение сертификата Let's Encrypt для HTTPS при помощи Certbot в FreeBSD 14.1
Сайт по незащищенному протоколу HTTP ? Любой сайт должен работать через HTTPS, а для этого нужен сертификат которому доверяют веб-браузеры. Существует сервис Let's Encrypt который выдает бесплатно сертификаты для сайта сроком на 3 месяца, а после можно бесплатно их перевыпустить. Для управления и автоматического обновления сертификатов существует утилита Certbot. В статье будет рассмотрена работа Certbot в FreeBSD и настройка nginx для работы с HTTPS протоколом.
1. Установка Certbot
Устанавливаем через пакеты
pkg install py311-certbot
Или устанавливаем из портов
cd /usr/ports/security/py-certbot/ && make install clean
После установки было выведено сообщение: что можно установить плагины для автоматической настройки Apache или Nginx, как включить автоматическое обновление сертификатов.

В статье будет показан процесс ручной настройки и добавление сертификатов в веб-сервер nginx и включение автоматического обновления сертификатов Let's Encrypt.
2. Создание аккаунта Let's Encrypt
Создаем аккаунт командой:
certbot register
Указываем свой email адрес
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): tommywirser@notby.net
Соглашаемся с договором по использованию Let's Encrypt
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.3-September-21-2022.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Отказываемся от передачи своего email адреса и получения новостей и рекламы
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Аккаунт успешно создан.
3. Получение сертификата для сайта
Для получения сертификата используем команду:
certbot certonly -d notby.net
где notby.net — доменное имя сайта для которого необходимо выпустить сертификат Let's Encrypt.
Будет преложено два варианта как проверить собственность доменного имени сайта:
- запустить встроенный веб-сервер certbot (не походит, так как уже есть рабочий веб-сервер);
- использовать рабочий веб-сервер, например nginx.
Выбираем 2 вариант
Далее необходимо указать путь до каталога сайта. В каталоге сайте будет создан каталог .well-known/acme-challenge/ с файлами для проверки домена.
Указываем каталог сайта

Нажимаем Enter и дожидаемся завершение процесса получения сертификата.

Сертификат Let's Encrypt успешно выдан сроком на 3 месяца.
Аналогично происходит получение сертификатов для других сайтов, если это необходимо. Можно получить сертификаты для неограненного количества сайтов.
Если во время получения сертификата произошла ошибка, возможны следующие причины:
- Для утилиты certbot недостаточно прав на создание каталога проверки домена внутри каталога сайта;
- Невозможно получить доступ по URL адресу http://<домен>/.well-known/acme-challenge/.
Проверяем что каталог сайта имеет права как минимум 5 (r-x) для пользователя веб-сервера или любых пользователей.
ls -lh /usr/local/www/
drwxr-x--- 2 www www 1.0K Feb 21 12:33 notby.net
Добавляем в конфигурацию nginx в раздел настроек сайта следующие строки:
location /.well-known {
root /usr/local/www/notby.net/; # Каталог сайта.
}
4. Настройка nginx для работы с HTTPS
Настраиваем nginx на обслуживания сайта через HTTPS по 443 порту с указанием путей сертификатов Let's Encrypt и перенаправление всего трафика с HTTP на HTTPS.
Открываем конфигурационный файл настроек для сайта или nginx.conf, вносим измерения в раздел настроек сайта
# Вместо домена notby.net указывай свой домен сайта.
# Блок server для домена notby.net по 80 порту (HTTP).
server {
listen 80; # Порт сервера.
server_name notby.net; # Домен сайта.
# Настройка location для получения Let's Encrypt сертификата через HTTP, можно перенести в раздел HTTPS.
# Каталог .well-known будет создан certbot'ом на время получения сертификата Let's Encrypt.
location /.well-known {
root /usr/local/www/notby.net/;
}
#Перенаправление всего трафика с http на https.
location / {
return 301 https://$host$request_uri;
}
}
# Блок server для домена notby.net по 443 порту (HTTPS).
server {
listen 443 ssl; # 443 порт, поддержка SSL.
http2 on; # Использовать HTTP/2.
server_name notby.net; # Домен сайта.
# Пути к списку сертификатов, на моменте выдачи сертификата они были указаны.
ssl_certificate /usr/local/etc/letsencrypt/live/notby.net/fullchain.pem;
ssl_certificate_key /usr/local/etc/letsencrypt/live/notby.net/privkey.pem;
# Сертификат для параметра ssl_stapling
ssl_trusted_certificate /usr/local/etc/letsencrypt/live/notby.net/chain.pem;
ssl_protocols TLSv1.3; # Разрешенные протоколы (только TLS 1.3).
ssl_prefer_server_ciphers off; # Использовать клиентские шифры.
# OCSP stapling, для ssl_stapling обязательный ssl_trusted_certificate параметр.
ssl_stapling on;
ssl_stapling_verify on;
# Настройки location оставляем как было раньше или меняем если что-то нужно поменять. -:)
location / {
root /usr/local/www/notby.net/; # Каталог сайта.
index index.html index.php; # Файлы в качестве индекса.
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME /usr/local/www/notby.net/$fastcgi_script_name;
include fastcgi_params;
}
}
Сохраняем файл и перезапускаем веб-сервер nginx
service nginx restart
5. Проверка HTTPS и перенаправление с HTTP
Открываем в веб-браузере свой сайт по протоколу http://<адрес сайта>/, должно произойти автоматическое перенаправление на https://<адрес сайта>/
Нажимаем значок рядом с адресом сайта и видим что сайт работает по защищенному соединению с сертификатом Let's Encrypt.

Теперь все пользователя будет автоматически перенаправлятся на HTTPS протокол, даже не заметив каких-то измерений.
Поисковые системы также со временем изменят протокол сайта или можно зайти в панель управления сайтами в поисковой системе и указать что сайт переехал на HTTPS.
6. Проверка обновлений сертификатов
После настройки веб-сервера запускаем проверку получения нового сертификата
certbot renew --dry-run
Параметр --dry-run указывает что будет происходить симуляция получения нового сертификата.

Тестовое получение сертификата успешно пройдено.
7. Автоматическое обновление сертификатов
Утилиту Certbot необходимо добавить в файл /etc/periodic.conf (периодическое выполнение заданий), чтобы она автоматически перевыпустила сертификаты сайтов, срок действия которых заканчивается.
Открываем в текстовом редакторе файл /etc/periodic.conf или создаем его
nano /etc/periodic.conf
Добавляем строку
weekly_certbot_enable="YES"

Сохраняем файл. Теперь раз в неделю будет происходить проверка сертификатов сайтов и если сертификату остается меньше двух недель, он будет обновлен автоматически.
8. Изменение email адреса аккаунта
Если в дальнейшим потребуется изменить email адрес аккаунта Let's Encrypt, используем команду:
certbot update_account --email new@email.com
где new@email.com — новый email адрес.
Будет предложено подписатся на новости и немного рекламы, отвечаем N если неинтересно.

Email адрес успешно обновлен.
windows 10 - vpn server штатными средствами.
Zapret Настройка BSD-подобных систем
Поддерживаемые версии
FreeBSD 11.x+ , OpenBSD 6.x+, частично MacOS Sierra +
Caution
На более старых может собираться, может не собираться, может работать или не работать. На FreeBSD 10 собирается и работает dvtws. С tpws есть проблемы из-за слишком старой версии компилятора clang. Вероятно, будет работать, если обновить компилятор. Возможна прикрутка к последним версиям pfsense без веб интерфейса в ручном режиме через консоль.
Особенности BSD систем
Отсутствие nfqueue
В BSD нет nfqueue. Похожий механизм - divert sockets. Из каталога nfq/ под BSD собирается dvtws вместо nfqws. Он разделяет с nfqws большую часть кода и почти совпадает по параметрам командной строки.
Типы Firewall
FreeBSD содержит 3 фаервола : IPFilter, ipfw и Packet Filter (PF в дальнейшем). OpenBSD содержит только PF.
Сборка
Под FreeBSD tpws и dvtws собираются через make.
Под OpenBSD:
make bsd
Под MacOS:
make mac
FreeBSD make распознает BSDmakefile, OpenBSD и MacOS - нет. Поэтому там используется отдельный target в Makefile. Сборка всех исходников:
make -C /opt/zapret
Divert сокеты
Divert сокет это внутренний тип сокета ядра BSD. Он не привязывается ни к какому сетевому адресу, не участвует в обмене данными через сеть и идентифицируется по номеру порта 1..65535. Аналогия с номером очереди NFQUEUE. На divert сокеты заворачивается трафик посредством правил ipfw или PF. Если в фаерволе есть правило divert, но на divert порту никто не слушает, то пакеты дропаются. Это поведение аналогично правилам NFQUEUE без параметра --queue-bypass. На FreeBSD divert сокеты могут быть только ipv4, хотя на них принимаются и ipv4, и ipv6 фреймы. На OpenBSD divert сокеты создаются отдельно для ipv4 и ipv6 и работают только с одной версией ip каждый. На MacOS похоже, что divert сокеты из ядра вырезаны. См подробнее раздел про MacOS. Отсылка в divert сокет работает аналогично отсылке через raw socket на linux. Передается полностью IP фрейм, начиная с ip загловка. Эти особенности учитываются в dvtws.
Lookup Tables
Скрипты ipset/*.sh при наличии ipfw работают с ipfw lookup tables. Это прямой аналог ipset. lookup tables не разделены на v4 и v6. Они могут содержать v4 и v6 адреса и подсети одновременно. Если ipfw отсутствует, то действие зависит от переменной LISTS_RELOAD в config. Если она задана, то выполняется команда из LISTS_RELOAD. В противном случае не делается ничего. Если LISTS_RELOAD=-, то заполнение таблиц отключается даже при наличии ipfw.
Загрузка ip таблиц из файла
PF может загружать ip таблицы из файла. Чтобы использовать эту возможность следует отключить сжатие gzip для листов через параметр файла config: GZIP_LISTS=0.
Отсутствие splice
BSD не содержит системного вызова splice. tpws работает через переброску данных в user mode в оба конца. Это медленнее, но не критически. Управление асинхронными сокетами в tpws основано на linux-specific механизме epoll. В BSD для его эмуляции используется epoll-shim - прослойка для эмуляции epoll на базе kqueue.
mdig и ip2net
mdig и ip2net полностью работоспособны в BSD. В них нет ничего системо-зависимого.
FreeBSD
Подгрузка ipdivert
Divert сокеты требуют специального модуля ядра - ipdivert.
- Поместите следующие строки в
/boot/loader.conf(создать, если отсутствует):
ipdivert_load="YES"
net.inet.ip.fw.default_to_accept=1
/etc/rc.conf:
firewall_enable="YES"
firewall_script="/etc/rc.firewall.my"
/etc/rc.firewall.my:
$ ipfw -q -f flush
Авто-восстановление правил ipfw и работа в фоне
В /etc/rc.firewall.my можно дописывать правила ipfw, чтобы они восстанавливались после перезагрузки. Оттуда же можно запускать и демоны zapret, добавив в параметры --daemon. Например так:
$ pkill ^dvtws$ $ /opt/zapret/nfq/dvtws --port=989 --daemon --dpi-desync=multisplit --dpi-desync-split-pos=2
Для перезапуска фаервола и демонов достаточно будет сделать:
$ /etc/rc.d/ipfw restart
tpws в прозрачном режиме
Краткая инструкция по запуску tpws в прозрачном режиме.
Note
Предполагается, что интерфейс LAN называется em1, WAN - em0.
Весь трафик
$ ipfw delete 100 $ ipfw add 100 fwd 127.0.0.1,988 tcp from me to any 80,443 proto ip4 xmit em0 not uid daemon $ ipfw add 100 fwd ::1,988 tcp from me to any 80,443 proto ip6 xmit em0 not uid daemon $ ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1 $ ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1 $ /opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
Трафик только на таблицу zapret, за исключением таблицы nozapret
$ ipfw delete 100 $ ipfw add 100 allow tcp from me to table\(nozapret\) 80,443 $ ipfw add 100 fwd 127.0.0.1,988 tcp from me to table\(zapret\) 80,443 proto ip4 xmit em0 not uid daemon $ ipfw add 100 fwd ::1,988 tcp from me to table\(zapret\) 80,443 proto ip6 xmit em0 not uid daemon $ ipfw add 100 allow tcp from any to table\(nozapret\) 80,443 recv em1 $ ipfw add 100 fwd 127.0.0.1,988 tcp from any to any 80,443 proto ip4 recv em1 $ ipfw add 100 fwd ::1,988 tcp from any to any 80,443 proto ip6 recv em1 $ /opt/zapret/tpws/tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
Note
Таблицы zapret, nozapret, ipban создаются скриптами из ipset по аналогии с Linux. Обновление скриптов можно забить в cron под root:
$ crontab -e
<...>
0 12 */2 * * /opt/zapret/ipset/get_config.sh
Caution
При использовании ipfw tpws не требует повышенных привилегий для реализации прозрачного режима. Однако, без рута невозможен bind на порты < 1024 и смена UID/GID. Без смены UID будет рекурсия, поэтому правила ipfw нужно создавать с учетом UID, под которым работает tpws. Переадресация на порты >= 1024 может создать угрозу перехвата трафика непривилегированным процессом, если вдруг tpws не запущен.
Запуск dvtws
Весь трафик
$ ipfw delete 100 $ ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0 # required for autottl mode only $ ipfw add 100 divert 989 tcp from any 80,443 to any tcpflags syn,ack in not diverted recv em0 $ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
Трафик только на таблицу zapret, за исключением таблицы nozapret
$ ipfw delete 100 $ ipfw add 100 allow tcp from me to table\(nozapret\) 80,443 $ ipfw add 100 divert 989 tcp from any to table\(zapret\) 80,443 out not diverted not sockarg xmit em0 # required for autottl mode only $ ipfw add 100 divert 989 tcp from table\(zapret\) 80,443 to any tcpflags syn,ack in not diverted not sockarg recv em0 $ /opt/zapret/nfq/dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
PF в FreeBSD
Настройка аналогична OpenBSD, но есть важные нюансы.
-
В FreeBSD поддержка PF в
tpwsотключена по умолчанию. Чтобы ее включить, нужно использовать параметр--enable-pf. -
Нельзя сделать ipv6 rdr на
::1. Нужно делать на link-local адрес входящего интерфейса. Смотрите черезifconfigадресfe80:...и добавляете в правило. -
Синтаксис
pf.confнемного отличается. Более новая версия PF. -
Лимит на количество элементов таблиц задается так:
$ sysctl net.pf.request_maxcount=2000000
-
Сломан divert-to. Он работает, но не работает механизм предотвращения зацикливаний. Кто-то уже написал патч, но в
14-RELEASEпроблема все еще есть. Следовательно, на данный момент работаdvtwsчерез PF невозможна./etc/pf.conf:rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::31c:29ff:dee2:1c4d port 988 rdr pass on em1 inet proto tcp to port {80,443} -> 127.0.0.1 port 988$ /opt/zapret/tpws/tpws --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force
Note
В PF не выходит делать rdr-to с той же системы, где работает proxy. Вариант с route-to не сохраняет мета информацию. Адрес назначения теряется. Поэтому этот вариант годится для squid, берущего адрес из протокола прикладного уровня, но не годится для tpws, полагающегося на метаданные ОС. Поддержка rdr-to реализована через /dev/pf, поэтому прозрачный режим требует root.
pfsense
Описание
pfsense основан на FreeBSD и использует фаервол PF, имеющий проблемы с divert. К счастью, модули ipfw и ipdivert присутствуют в поставке последних версий pfsense. Их можно подгрузить через kldload.
В некоторых более старых версиях pfsense требуется изменить порядок фаерволов через sysctl, сделав ipfw первым. В более новых эти параметры sysctl отсутствуют, но система работает как надо и без них. В некоторых случаях фаервол PF может ограничивать возможности dvtws, в частности в области фрагментации ip.
Присутствуют по умолчанию правила scrub для реассемблинга фрагментов.
Бинарики из binaries/freebsd-x64 собраны под FreeBSD 11. Они должны работать и на последующих версиях FreeBSD, включая pfsense. Можно пользоваться install_bin.sh.
Автозапуск
Пример скрипта автозапуска лежит в init.d/pfsense. Его следует поместить в /usr/local/etc/rc.d и отредактировать на предмет правил ipfw и запуска демонов. Есть встроенный редактор edit как более приемлемая альтернатива vi.
Note
Поскольку git отсутствует, копировать файлы удобнее всего через ssh. curl присутствует по умолчанию. Можно скопировать zip с файлами zapret и распаковать в /opt, как это делается на других системах. Тогда dvtws нужно запускать как /opt/zapret/nfq/dvtws. Либо скопировать только dvtws в /usr/local/sbin. Как вам больше нравится.
Note
Скрипты ipset работают, крон есть. Можно сделать автообновление листов.
Note
Если вас напрягает бедность имеющегося репозитория, можно включить репозиторий от FreeBSD, который по умолчанию выключен.
Поменяйте no на yes в /usr/local/etc/pkg/repos/FreeBSD.conf
Можно установить весь привычный софт, включая git, чтобы напрямую скачивать zapret с github.
/usr/local/etc/rc.d/zapret.sh (chmod 755):
#!/bin/sh kldload ipfw kldload ipdivert # for older pfsense versions. newer do not have these sysctls sysctl net.inet.ip.pfil.outbound=ipfw,pf sysctl net.inet.ip.pfil.inbound=ipfw,pf sysctl net.inet6.ip6.pfil.outbound=ipfw,pf sysctl net.inet6.ip6.pfil.inbound=ipfw,pf ipfw delete 100 ipfw add 100 divert 989 tcp from any to any 80,443 out not diverted xmit em0 pkill ^dvtws$ dvtws --daemon --port 989 --dpi-desync=multisplit --dpi-desync-split-pos=2 # required for newer pfsense versions (2.6.0 tested) to return ipfw to functional state pfctl -d ; pfctl -e
Проблемы tpws
Что касается tpws, то видимо имеется некоторый конфликт двух фаерволов, и правила fwd в ipfw не работают. Работает перенаправление средствами PF как описано в разделе по FreeBSD. В PF можно изменять правила только целыми блоками - якорями (anchors). Нельзя просто так добавить или удалить что-то. Но чтобы какой-то anchor был обработан, на него должна быть ссылка из основного набора правил. Его трогать нельзя, иначе порушится весь фаервол. Поэтому придется править код скриптов pfsense.
- Поправьте
/etc/inc/filter.incследующим образом:
<...>
/* MOD */
$natrules .= "# ZAPRET redirection\n";
$natrules .= "rdr-anchor \"zapret\"\n";
$natrules .= "# TFTP proxy\n";
$natrules .= "rdr-anchor \"tftp-proxy/*\"\n";
<...>
- Напишите файл с содержимым anchor-а (например,
/etc/zapret.anchor):
rdr pass on em1 inet proto tcp to port {80,443} -> 127.0.0.1 port 988
rdr pass on em1 inet6 proto tcp to port {80,443} -> fe80::20c:29ff:5ae3:4821 port 988
fe80::20c:29ff:5ae3:4821 замените на ваш link local адрес LAN интерфейса, либо уберите строчку, если ipv6 не нужен.
- Добавьте в автозапуск
/usr/local/etc/rc.d/zapret.sh:
$ pfctl -a zapret -f /etc/zapret.anchor $ pkill ^tpws$ $ tpws --daemon --port=988 --enable-pf --bind-addr=127.0.0.1 --bind-iface6=em1 --bind-linklocal=force --split-pos=2
- После перезагрузки проверьте, что правила создались:
$ pfctl -s nat no nat proto carp all nat-anchor "natearly/*" all nat-anchor "natrules/*" all <...> no rdr proto carp all rdr-anchor "zapret" all rdr-anchor "tftp-proxy/*" all rdr-anchor "miniupnpd" all $ pfctl -s nat -a zapret rdr pass on em1 inet proto tcp from any to any port = http -> 127.0.0.1 port 988 rdr pass on em1 inet proto tcp from any to any port = https -> 127.0.0.1 port 988 rdr pass on em1 inet6 proto tcp from any to any port = http -> fe80::20c:29ff:5ae3:4821 port 988 rdr pass on em1 inet6 proto tcp from any to any port = https -> fe80::20c:29ff:5ae3:4821 port 988
Note
Так же есть более элегантный способ запуска tpws через @reboot в cron и правило перенаправления в UI. Это позволит не редактировать код pfsense.
OpenBSD
tpws bind на ipv4
В tpws bind по умолчанию только на ipv6. Для bind на ipv4 нужно указать --bind-addr=0.0.0.0. Используйте --bind-addr=0.0.0.0 --bind-addr=:: для достижения того же результата, как в других ОС по умолчанию. Но лучше все же так не делать, а сажать на определенные внутренние адреса или интерфейсы.
tpws для проходящего трафика (старая схема не работает в новых версиях)
В этом варианте tpws обращается явно к редиректору pf и пытается от него получить оригинальный адрес назначения. Как показывает практика, это не работает на новых версиях OpenBSD. Возвращается ошибка ioctl. Последняя проверенная версия, где это работает, - 6.8 . Между 6.8 и 7.4 разработчики сломали этот механизм.
/etc/pf.conf:
pass in quick on em1 inet proto tcp to port {80,443} rdr-to 127.0.0.1 port 988
pass in quick on em1 inet6 proto tcp to port {80,443} rdr-to ::1 port 988
$ pfctl -f /etc/pf.conf $ tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1 --enable-pf
Note
В PF не выходит делать rdr-to с той же системы, где работает proxy. Вариант с route-to не сохраняет мета информацию. Адрес назначения теряется. Поэтому этот вариант годится для squid, берущего адрес из протокола прикладного уровня, но не годится для tpws, полагающегося на метаданные ОС. Поддержка rdr-to реализована через /dev/pf, поэтому прозрачный режим требует root.
tpws для проходящего трафика (новые системы)
В новых версиях предлагается использовать divert-to вместо rdr-to. Минимально проверенная версия, где это работает, 7.4. Может работать или не работать на более старых - исследование не проводилось.
/etc/pf.conf:
pass on em1 inet proto tcp to port {80,443} divert-to 127.0.0.1 port 989
pass on em1 inet6 proto tcp to port {80,443} divert-to ::1 port 989
tpws должен иметь бинд на точно такой адрес, который указан в правилах pf. 0.0.0.0 или :: не работает.
$ pfctl -f /etc/pf.conf $ tpws --port=988 --user=daemon --bind-addr=::1 --bind-addr=127.0.0.1
Note
Так же не понятно как делать divert с самой системы, где работает tpws.
Запуск dvtws
Весь трафик
/etc/pf.conf:
pass in quick on em0 proto tcp from port {80,443} flags SA/SA divert-packet port 989 no state
pass in quick on em0 proto tcp from port {80,443} no state
pass out quick on em0 proto tcp to port {80,443} divert-packet port 989 no state
$ pfctl -f /etc/pf.conf $ ./dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
Трафик только на таблицу zapret, за исключением таблицы nozapret
/etc/pf.conf:
set limit table-entries 2000000
table <zapret> file "/opt/zapret/ipset/zapret-ip.txt"
table <zapret-user> file "/opt/zapret/ipset/zapret-ip-user.txt"
table <nozapret> file "/opt/zapret/ipset/zapret-ip-exclude.txt"
pass out quick on em0 inet proto tcp to <nozapret> port {80,443}
pass in quick on em0 inet proto tcp from <zapret> port {80,443} flags SA/SA divert-packet port 989 no state
pass in quick on em0 inet proto tcp from <zapret> port {80,443} no state
pass out quick on em0 inet proto tcp to <zapret> port {80,443} divert-packet port 989 no state
pass in quick on em0 inet proto tcp from <zapret-user> port {80,443} flags SA/SA divert-packet port 989 no state
pass in quick on em0 inet proto tcp from <zapret-user> port {80,443} no state
pass out quick on em0 inet proto tcp to <zapret-user> port {80,443} divert-packet port 989 no state
table <zapret6> file "/opt/zapret/ipset/zapret-ip6.txt"
table <zapret6-user> file "/opt/zapret/ipset/zapret-ip-user6.txt"
table <nozapret6> file "/opt/zapret/ipset/zapret-ip-exclude6.txt"
pass out quick on em0 inet6 proto tcp to <nozapret6> port {80,443}
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} flags SA/SA divert-packet port 989 no state
pass in quick on em0 inet6 proto tcp from <zapret6> port {80,443} no state
pass out quick on em0 inet6 proto tcp to <zapret6> port {80,443} divert-packet port 989 no state
pass in quick on em0 inet6 proto tcp from <zapret6-user> port {80,443} flags SA/SA divert-packet port 989 no state
pass in quick on em0 inet6 proto tcp from <zapret6-user> port {80,443} no state
pass out quick on em0 inet6 proto tcp to <zapret6-user> port {80,443} divert-packet port 989 no state
$ pfctl -f /etc/pf.conf $ ./dvtws --port=989 --dpi-desync=multisplit --dpi-desync-split-pos=2
Проблемы с badsum
OpenBSD принудительно пересчитывает tcp checksum после divert, поэтому скорее всего dpi-desync-fooling=badsum у вас не заработает. При использовании этого параметра dvtws предупредит о возможной проблеме.
Особенность отправки fake пакетов
В OpenBSD dvtws все фейки отсылает через divert socket, поскольку эта возможность через raw sockets заблокирована. Видимо PF автоматически предотвращает повторный заворот diverted фреймов, поэтому проблемы зацикливания нет.
divert-packet автоматически вносит обратное правило для перенаправления. Трюк с no state и in правилом позволяет обойти эту проблему, чтобы напрасно не гнать массивный трафик через dvtws.
Перезагрузка PF таблиц
Скрипты из ipset не перезагружают таблицы в PF по умолчанию.
Чтобы они это делали, добавьте параметр в /opt/zapret/config:
LISTS_RELOAD="pfctl -f /etc/pf.conf"
Более новые версии pfctl понимают команду перезагрузить только таблицы. Но это не относится к OpenBSD. В новых FreeBSD есть.
$ pfctl -Tl -f /etc/pf.conf
Important
Не забудьте выключить сжатие gzip: GZIP_LISTS=0
Important
Если в вашей конфигурации какого-то файла листа нет, то его необходимо исключить из правил PF. Если вдруг листа нет, и он задан в pf.conf, будет ошибка перезагрузки фаервола.
Note
После настройки обновление листов можно поместить в cron:
$ crontab -e
<...>
0 12 */2 * * /opt/zapret/ipset/get_config.sh
https://forum.lissyara.su/freebsd-f8/obhod-dpi-na-shlyuze-t46842.html
FreeBSD 13.1: GPU passthrough with bhyve | Windows 10 ???
https://rutube.ru/video/37bc4749554c4f88a1873d02e1500090/?ysclid=mgqoo0p8q2243477801
Sendmail FreeBSD 14*
/etc/mail # make all
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 xxx.xxx.net.mc > xxx.xxx.net.cf
/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/ /usr/share/sendmail/cf/m4/cf.m4 xxx.xxx.net.submit.mc > xxx.xxx.net.submit.cf
/usr/sbin/sendmail -bi -OAliasFile=/etc/mail/aliases
sendmail: no recipients
*** Error code 66
Stop.
make: stopped in /etc/mail
/etc/mail #
To continue using Sendmail:
Установите Home Assistant на FreeBSD внутри виртуальной машины bhyve
Для этого на FreeBSD 13.1-p1 vm vm-bhyve 1.5.0 в качестве менеджера виртуальных машин bhyve и qemu-tools 7.0.0_1 требуется преобразовать образ из qcow2 в raw, как я полагаю.
Требования
Требуемые pkgs
- вм-бхиве
- qemu-инструменты
Для этого вам нужно настроить vm-bhyve, о чём я не буду рассказывать.
Шаблон операционной системы Centos8
Создайте файл с именем centos8.conf. Поместите этот файл в папку vm_dir в разделе «.templates».
loader="uefi"
cpu=1
memory=512M
network0_type="virtio-net"
network0_switch="public"
disk0_name="disk0"
disk0_dev="sparse-zvol"
disk0_type="virtio-blk"
Установка
При запуске vm img url образ будет загружен, распакован и помещён в нужную папку. Папка vm_dir определена в /etc/rc.conf в подкаталоге ".img". На тот момент последней версией образа была 8.4. Однако после установки мне сразу же предложили обновиться до версии ОС 8.5.
Загрузить изображение
vm img https://github.com/home-assistant/operating-system/releases/download/8.4/haos_ova-8.4.qcow2.xz
Создание виртуальной машины
Теперь мы создаём виртуальную машину с помощью команды vm create. Параметр -t centos8 определяет шаблон, созданный ранее. Параметр -c 2 указывает, сколько ядер вы хотите назначить виртуальной машине. Параметр -m 8G указывает объём оперативной памяти, 4 ГБ должно быть достаточно. Ознакомьтесь с требованиями на веб-странице Home Assistant. Параметр -s 100G указывает объём дискового пространства, которое вы хотите назначить виртуальной машине. Когда я впервые настраивал это, я выделил только 50 ГБ, чего должно быть более чем достаточно. Однако я использую разреженный ZFS, так как он не будет использовать все 100 ГБ сразу, поэтому я могу выделить больше.
vm create -t centos8 -c 2 -m 8G -s 100G -i haos_ova-8.4.qcow2 haos
Боковое примечание
По какой-то причине при первом запуске этой команды иногда возникает ошибка «Диск занят».
qemu-img: /dev/zvol/tank/bhyve/haos/disk0: error while creating output image: Protocol driver 'host_device' does not support image creation, and opening the image failed: Could not open '/dev/zvol/tank/bhyve/haos/disk0': Device busy
/usr/local/sbin/vm: ERROR: failed to write img file with qemu-img
Если удалить виртуальную машину и создать её заново, она появится.
vm destroy haos
Затем снова выполните команду vm create, и она создаст виртуальную машину. Если проблема не исчезнет, вы можете изменить шаблон, чтобы он использовал образы дисков, а не zfs. С образами дисков такой ошибки никогда не возникало. Также можно указать открытый ключ для аутентификации с помощью -C -k your_key.pub. Но на текущей странице руководства нет информации об этом. И я не уверен, как это работает. По крайней мере, я не могу найти это на странице руководства. С помощью флага -n вы можете задать статический IP-адрес. Кроме того, я смог найти в исходном коде vm-core на GitHub.
Example netconfig param: "ip=10.0.0.2/24;gateway=10.0.0.1;nameservers=1.1.1.1,8.8.8.8"
Я бы хотел, чтобы у вас была возможность задать параметры для выбора сетевого коммутатора, который вы хотите использовать. Но, похоже, такой возможности нет.
Завершение
Проверьте конфигурацию
Завершите настройку, выполнив команду vm configure. В частности, проверьте, подключена ли виртуальная машина к нужному коммутатору виртуальных машин
vm configure haos
Запуск виртуальной машины
Запустите машину, выполнив команду vm start
vm start haos
Контролируйте запуск, запустив консоль виртуальной машины
vm console haos
https://github.com/stiana/tcbsd-haos-installer
https://forums.truenas.com/t/installing-haos-home-assistant-os-in-a-vm/108
wget https://github.com/home-assistant/operating-system/releases/download/16.2/haos_ova-16.2.qcow2.xz
unxz -v haos_ova-16.2.qcow2.xz
qemu-img convert -p -O raw haos_ova-16.2.qcow2 ha_.img
Выполнение резервного копирования сервера
Выполнение резервного копирования сервера
Выполним резервную копию сервера и сжатие файла образа.
Если Вы работаете на удаленной машине, которую нужно клонировать, указываем LocalIP — где будет храниться образ системы:
$ dd if=/dev/sda | gzip -1 - | ssh user@LocalIP dd of=image.gz
Если Вы работаете на локальной машине, указываем RemoteIP — системы, которую нужно клонировать:
$ ssh user@RemoteIP "dd if=/dev/sda | gzip -1 -" | dd of=image.gz
Клонирование системы с помощью dd
Итак, что же еще можно сделать с помощью dd? Если Вы хотите клонировать систему с одного диска на другой, указываем RemoteIP — системы, которую нужно клонировать:
ssh root@RemoteIP "sudo dd if=/dev/vda bs=16M | gzip -1" | gunzip | pv -W | dd of=/dev/vda bs=16M
Или можно клонировать систему в образ, образ не сжатый:
ssh root@srv1.hhbb.me "dd if=/dev/vda bs=16M | gzip -1" | gunzip | pv -W | dd of=system-image-raw.img bs=16M
Восстанавливаем образ системы, указываем RemoteIP — системы, которую нужно восстановить:
ssh root@RemoteIP "gunzip -c image.gz" | pv -W | sudo dd of=/dev/vda bs=16M
Выводы
Спасибо за уделенное время на прочтение статьи. Теперь Вы больше знаете о том, как осуществить различные полезные операции с помощью команды dd.
Matrix.org
Matrix.org
http://matrix.org
"Matrix is an open standard for interoperable, decentralised, real-time communication over IP. It can be used to power Instant Messaging, VoIP/WebRTC signalling, Internet of Things communication - or anywhere you need a standard HTTP API for publishing and subscribing to data whilst tracking the conversation history."
Synapse
net/py-matrix-synapse
https://github.com/matrix-org/synapse
Riot.im (Mobile Client)
https://riot.im
My Thoughts
Matrix.org is brilliant! I work for a small IT company. We like to keep things in house so we chose to host our own communication services via XMPP (OpenFire) for internal chat and mobile messaging as well as IRC (UnrealIRCd + ZNC) just to have it. When I stumbled across Matrix.org I was excited to try this new project. Synapse is still in heavy beta however, after using it I'm even more excited for whats to come.
I've written this tutorial for those of you who want to give a Matrix.org HomeServer a try.
Lets Begin!
Assuming you have a clean installation of FreeBSD 11 (14)
Switch to root user or use sudosu root
Update FreeBSDfreebsd-update fetch install
Install Ports Treeportsnap fetch extract
Install ports-mgmt/portmaster
# cd /usr/ports/ports-mgmt/portmaster
# make install clean
I use portmaster due to the number of dependencies, however you could just jump to the next step and use "make install clean"
Install net/py-matrix-synapse
# cd /usr/ports/net/py-matrix-synapse
# portmaster
Do note, you can also do an install via pkg install py27-matrix-synapse with Synth pkg install synth for keeping packages current... However, that's another tutorial.
Create directory for Synapse files. This can be done under your own account or you can create a synapse user. This is fine because Synapse does not require root/wheel permissions to run.mkdir ~/.synapse
I created 3 scripts for the next three steps.
# Enable services
sysrc synapse_enable="YES"
# Obtain SSL Certificate certbot certonly --standalone -d matrix.example.com (14)
Script #1: synapse_config.sh
This will be used to configure synapse before starting the service.
#!/bin/sh
# Synapse: Config Synapse
cd ~/.synapse
python2.7 -m synapse.app.homeserver \
--server-name ip-mail.ru \ # *MyDomain.com* can be any internal or external domain
--config-path /usr/local/etc/matrix-synapse/homeserver.yaml \
--generate-config \
--report-stats=no
For further details on this script, please visit Synapse on GitHub. For this tutorial, all you'll need to adjust is the domain. Save the script then run it to configure synapse. Which we'll do at this time.
# ~/synapse_config.sh
A config file has been generated in 'homeserver.yaml' for server name 'MyDomain.com' with corresponding SSL keys and self-signed certificates. Please review this file and customize it to your needs.
If this server name is incorrect, you will need to regenerate the SSL certificates
Script #2: synapse_start.sh
This script will be used to start Synapse. It will also be added to cron so it'll run at boot.
#!/bin/sh
# Synapse: Start Synapse
cd ~/.synapse
synctl start
Lets start Synapse then add this script to cron
# ~/synapse_start.sh
2017-02-21 22:06:39,476 - twisted - 131 - INFO - - SynapseSite starting on 8008
2017-02-21 22:06:39,477 - twisted - 131 - INFO - - Starting factory <synapse.http.site.SynapseSite instance at 0x80f17b680>
2017-02-21 22:06:39,477 - synapse.app.homeserver - 202 - INFO - - Synapse now listening on port 8008
started synapse.app.homeserver('homeserver.yaml')
The configuration should take a few seconds. Once done, you should see something similar to the text above.
Lets add this script to the cronjobs. Not as root.
# crontab -e
@reboot ~/synapse_start.sh
Script #3: synapse_add_user.sh
This script will be used to add users to the Synapse database.
#!/bin/sh
# Synapse: Add User
cd ~/.synapse
register_new_matrix_user -c /usr/local/etc/matrix-synapse/homeserver.yaml https://localhost:8008
Lets run this script...
# ~/code/scripts/synapse_add_user.sh
New user localpart [tzuntzai]: tzuntzai
Password:
Confirm password:
Make admin [no]: yes
If everything goes well, you can point your browser to https://localhost:8008 and you’ll be presented with a login screen.
Use the account you just created to log into your Matrix.org Home Server and enjoy! Cheers!
~ Alex
https://eurafri.com/projects/tutorials/tutorial-en-00009/
Samba
Создаём пользователя в Unix и добавляем его в samba, smbpasswd -a <Имя пользователя>
Шпаргалка по FreeBSD для администраторов Linux
Информация Об оборудовании
| Задача | FreeBSD | Linux |
|---|---|---|
| Список PCI устройств | pciconf -lv |
lspci -v |
| Список USB устройств | usbconfig |
lsusb |
| Показывать информацию о процессоре | sysctl hw.model или dmesg \| grep CPU |
cat /proc/cpuinfo или lscpu |
| Показать информацию о памяти | sysctl hw.physmem или top |
free -h или cat /proc/meminfo |
| Показывать модули ядра | kldstat |
lsmod |
| Загрузить модуль ядра | kldload module_name |
modprobe module_name |
| Выгрузить модуль ядра | kldunload module_name |
modprobe -r module_name |
Управление дисками и хранилищем
| Задача | FreeBSD | Linux |
|---|---|---|
| Перечислите все диски | geom disk list |
lsblk или fdisk -l |
| Показывать разделы диска | gpart show |
fdisk -l или parted -l |
| Показывать использование диска | df -h |
df -h |
| Показывать смонтированные файловые системы | mount |
mount или findmnt |
| Проверка файловой системы | fsck |
fsck |
| Показать данные SMART | smartctl -a /dev/ada0 |
smartctl -a /dev/sda |
| Список пулов ZFS | zpool list |
zpool list (если установлен ZFS) |
| Показать наборы данных ZFS | zfs list |
zfs list (если установлен ZFS) |
Сетевые команды
| Задача | FreeBSD | Linux |
|---|---|---|
| Показывать сетевые интерфейсы | ifconfig |
ip addr или ifconfig |
| Настройка интерфейса | ifconfig em0 inet 192.168.1.10 |
ip addr add 192.168.1.10/24 dev eth0 |
| Показать таблицу маршрутизации | netstat -rn |
ip route или route -n |
| Добавить статический маршрут | route add default 192.168.1.1 |
ip route add default via 192.168.1.1 |
| Показать таблицу ARP | arp -a |
arp -a или ip neigh |
| Очистить запись ARP | arp -d hostname |
arp -d hostname или ip neigh del |
| Показывать сетевую статистику | netstat -s |
netstat -s или ss -s |
| Показывать порты прослушивания | sockstat -l или netstat -an |
ss -tuln или netstat -tuln |
| Показать все открытые порты/подключения | sockstat |
ss -tuan или netstat -tuan |
| Захват пакетов | tcpdump -i em0 |
tcpdump -i eth0 |
Управление процессами
| Задача | FreeBSD | Linux |
|---|---|---|
| Перечислите все процессы | ps aux |
ps aux |
| Дерево процессов | pstree |
pstree или ps axjf |
| Просмотр процесса в режиме реального времени | top |
top или htop |
| Процесс уничтожения | kill PID |
kill PID |
| Показывать открытые файлы по процессам | fstat |
lsof |
| Показать процесс, использующий порт | sockstat -p 80 |
lsof -i :80 или ss -tulpn \| grep :80 |
Управление пакетами
| Задача | FreeBSD | Linux (в зависимости от дистрибутива) |
|---|---|---|
| Установочный пакет | pkg install package_name |
apt install / yum install / dnf install |
| Удалить пакет | pkg delete package_name |
apt remove / yum remove / dnf remove |
| Обновить список пакетов | pkg update |
apt update / yum check-update |
| Пакеты обновления | pkg upgrade |
apt upgrade / yum upgrade / dnf upgrade |
| Поиск пакетов | pkg search keyword |
apt search / yum search / dnf search |
| Показать информацию о пакете | pkg info package_name |
apt show / yum info / dnf info |
| Список установленных пакетов | pkg info |
dpkg -l / rpm -qa |
Системные службы
| Задача | FreeBSD | Linux (systemd) |
|---|---|---|
| Начать обслуживание | service servicename start |
systemctl start servicename |
| Остановить обслуживание | service servicename stop |
systemctl stop servicename |
| Перезапустить службу | service servicename restart |
systemctl restart servicename |
| Состояние обслуживания | service servicename status |
systemctl status servicename |
| Включить при загрузке | sysrc servicename_enable="YES" |
systemctl enable servicename |
| Отключить при загрузке | sysrc servicename_enable="NO" |
systemctl disable servicename |
| Перечислите все услуги | service -e |
systemctl list-units --type=service |
Брандмауэр
| Задача | FreeBSD (pf/ipfw) | Linux (iptables/nftables) |
|---|---|---|
| Правила показа (pf) | pfctl -sr |
iptables -L -n -v |
| Показать правила (ipfw) | ipfw list |
nft list ruleset |
| Включить брандмауэр (pf) | pfctl -e |
systemctl start firewalld |
| Отключить брандмауэр (pf) | pfctl -d |
systemctl stop firewalld |
| Правила перезарядки (pf) | pfctl -f /etc/pf.conf |
iptables-restore < /etc/iptables/rules.v4 |
Системная информация
| Задача | FreeBSD | Linux |
|---|---|---|
| Время безотказной работы системы | uptime |
uptime |
| Версия ядра | uname -a или freebsd-version |
uname -a |
| Показать все переменные sysctl | sysctl -a |
sysctl -a |
| Показывать системные сообщения | dmesg |
dmesg или journalctl -k |
| Показывать системные журналы | tail /var/log/messages |
journalctl или tail /var/log/syslog |
Управление пользователями
| Задача | FreeBSD | Linux |
|---|---|---|
| Добавить пользователя | adduser или pw useradd username |
useradd username или adduser username |
| Удалить пользователя | rmuser или pw userdel username |
userdel username |
| Изменить пользователя | pw usermod username |
usermod username |
| Сменить пароль | passwd username |
passwd username |
| Показывать вошедших в систему пользователей | who или w |
who или w |
Файловые системы
| Задача | FreeBSD | Linux |
|---|---|---|
| Монтировать файловую систему | mount /dev/ada0p2 /mnt |
mount /dev/sda2 /mnt |
| Размонтировать файловую систему | umount /mnt |
umount /mnt |
| Создайте файловую систему UFS | newfs /dev/ada0p2 |
Н/Д (UFS не распространено) |
| Создание файловой системы ext4 | N/A | mkfs.ext4 /dev/sda2 |
| Проверьте место на диске | du -sh /path |
du -sh /path |
ZFS Команды (одинаковые для FreeBSD и Linux с ZFS)
Операции с пулом
| Задача | Команда | Пример |
|---|---|---|
| Перечислите все пулы | zpool list |
zpool list |
| Показать состояние пула | zpool status |
zpool status tank |
| Показать историю пула | zpool history |
zpool history tank |
| Показать статистику ввода-вывода | zpool iostat |
zpool iostat -v 2 (каждые 2 секунды) |
| Создайте простой пул | zpool create |
zpool create tank /dev/ada1 |
| Создание зеркального пула | zpool create |
zpool create tank mirror /dev/ada1 /dev/ada2 |
| Создайте пул RAIDZ | zpool create |
zpool create tank raidz /dev/ada1 /dev/ada2 /dev/ada3 |
| Добавление диска в пул | zpool add |
zpool add tank /dev/ada4 |
| Замените диск в пуле | zpool replace |
zpool replace tank /dev/ada1 /dev/ada4 |
| Удаление устройства из пула | zpool remove |
zpool remove tank /dev/ada4 |
| Скраб-пул (проверка целостности) | zpool scrub |
zpool scrub tank |
| Перестаньте скрести | zpool scrub -s |
zpool scrub -s tank |
| Устранение ошибок пула | zpool clear |
zpool clear tank |
| Экспортный пул | zpool export |
zpool export tank |
| Пул импорта | zpool import |
zpool import tank |
| Список импортируемых пулов | zpool import |
zpool import (без названия пула) |
| Пул обновлений | zpool upgrade |
zpool upgrade tank |
| Установить свойство пула | zpool set |
zpool set autoreplace=on tank |
| Получить свойства пула | zpool get |
zpool get all tank |
Операции с набором данных (файловой системой)
| Задача | Команда | Пример |
|---|---|---|
| Перечислите все наборы данных | zfs list |
zfs list |
| Список с конкретными свойствами | zfs list |
zfs list -o name,used,avail,mountpoint |
| Список моментальных снимков | zfs list -t snapshot |
zfs list -t snapshot |
| Создание набора данных | zfs create |
zfs create tank/home/user |
| Уничтожить набор данных | zfs destroy |
zfs destroy tank/old_data |
| Уничтожить набор данных и дочерние элементы | zfs destroy -r |
zfs destroy -r tank/old_data |
| Установить свойство набора данных | zfs set |
zfs set compression=lz4 tank/home |
| Получение свойств набора данных | zfs get |
zfs get all tank/home |
| Установить квоту | zfs set quota= |
zfs set quota=10G tank/home/user |
| Установленное резервирование | zfs set reservation= |
zfs set reservation=5G tank/database |
| Набор данных для монтирования | zfs mount |
zfs mount tank/home |
| Размонтировать набор данных | zfs unmount |
zfs unmount tank/home |
| Показать подключённые файловые системы ZFS | zfs mount |
zfs mount (без аргументов) |
Операции Моментального снимка
| Задача | Команда | Пример |
|---|---|---|
| Создать моментальный снимок | zfs snapshot |
zfs snapshot tank/home@backup-2024 |
| Создание рекурсивного моментального снимка | zfs snapshot -r |
zfs snapshot -r tank/home@daily-2024 |
| Список моментальных снимков | zfs list -t snapshot |
zfs list -t snapshot -r tank/home |
| Откат к моментальному снимку | zfs rollback |
zfs rollback tank/home@backup-2024 |
| Уничтожить моментальный снимок | zfs destroy |
zfs destroy tank/home@old-backup |
| Переименовать моментальный снимок | zfs rename |
zfs rename tank/home@old tank/home@archived |
| Клонировать моментальный снимок | zfs clone |
zfs clone tank/home@backup tank/home_clone |
| Показать использование диска моментального снимка | zfs list -o space |
zfs list -r -o space tank |
Отправка/получение (репликация)
| Задача | Команда | Пример |
|---|---|---|
| Отправить снимок | zfs send |
zfs send tank/home@backup > /backup/home.zfs |
| Отправлять инкрементные | zfs send -i |
zfs send -i @snap1 tank/home@snap2 > incremental.zfs |
| Получить моментальный снимок | zfs receive |
zfs receive tank/home_restore < /backup/home.zfs |
| Отправить по SSH | zfs send \| ssh |
zfs send tank/home@backup \| ssh user@host zfs receive tank/backup |
| Приемное устройство для сухого прогона | zfs receive -n |
zfs receive -n tank/test < backup.zfs |
| Отправлять с прогрессом | zfs send -v |
zfs send -v tank/home@backup > backup.zfs |
Общие настройки свойств
| Задача | Команда | Пример |
|---|---|---|
| Включить сжатие | zfs set compression= |
zfs set compression=lz4 tank/data |
| Включить дедупликацию | zfs set dedup= |
zfs set dedup=on tank/backup |
| Установите размер записи | zfs set recordsize= |
zfs set recordsize=1M tank/media |
| Включить шифрование | zfs create -o encryption= |
zfs create -o encryption=on -o keyformat=passphrase tank/secure |
| Установите время доступа | zfs set atime= |
zfs set atime=off tank/database |
| Настройка режима синхронизации | zfs set sync= |
zfs set sync=disabled tank/temp |
| Включить нечувствительность к регистру | zfs set casesensitivity= |
zfs create -o casesensitivity=insensitive tank/windows |
Мониторинг и техническое обслуживание
| Задача | Команда | Пример |
|---|---|---|
| Показать статистику ввода-вывода | zpool iostat |
zpool iostat -v tank 2 |
| Показать статистику ARC (FreeBSD) | sysctl kstat.zfs.misc.arcstats |
sysctl kstat.zfs.misc.arcstats.size |
| Показать статистику ARC (Linux) | arc_summary |
arc_summary или cat /proc/spl/kstat/zfs/arcstats |
| Проверьте состояние бассейна | zpool status -x |
zpool status -x (показывает только проблемы) |
| Показывать мероприятия в бассейне | zpool events |
zpool events -v |
| Расчетное время очистки | zpool status |
zpool status (во время скрабирования) |
| Показать степень сжатия | zfs get compressratio |
zfs get compressratio tank/data |
| Показывать использование пространства по типу | zfs list -o space |
zfs list -r -o space tank |
Полезные однострочники
# Find largest datasets
zfs list -o name,used -s used
# Show all snapshots sorted by creation
zfs list -t snapshot -o name,creation -s creation
# Calculate total snapshot space
zfs list -t snapshot -o used -p | awk '{sum+=$1} END {print sum/1024/1024/1024 " GB"}'
# Show datasets with compression disabled
zfs get -r compression tank | grep -v "lz4\|gzip\|zle"
# Monitor pool I/O in real-time
zpool iostat -v 1
# Show properties that differ from defaults
zfs get all tank | grep -v default
# Quick backup to remote system
zfs snapshot tank/important@$(date +%Y%m%d) && \
zfs send tank/important@$(date +%Y%m%d) | ssh backup-server zfs receive tank/backup-2024
Быстрые Советы
- Именование устройств: в FreeBSD используются другие соглашения об именовании (ada0 для SATA, da0 для SCSI/USB), чем в Linux (sda, sdb и т. д.).
- Сетевые интерфейсы: в FreeBSD интерфейсы называются по драйверу (em0, re0, bge0), в то время как в Linux традиционно используются eth0, eth1 (сейчас часто используются предсказуемые имена, такие как enp0s3)
- Файлы конфигурации: в FreeBSD многие конфигурации сосредоточены в
/etc/rc.conf, в то время как в Linux они распределены по разным файлам - Страницы руководства: в обоих случаях используется
man command, но страницы руководства FreeBSD зачастую более подробные - Порты и пакеты: в FreeBSD есть и порты (исходный код), и пакеты (бинарные файлы), в то время как в Linux обычно используется один менеджер пакетов для каждого дистрибутива
- ZFS: ZFS в Linux (ZoL) изначально поддерживается FreeBSD, но достигла паритета функций. Команды идентичны, но загрузка модулей ядра различается (
kldload zfsв FreeBSD иmodprobe zfsв Linux)
Apache httpd : SSL/TLS Setting
|
Configure SSL/TLS setting to use secure encrypt HTTPS connection. |
|
| [1] | |
| [2] | Enable SSL/TLS settings. |
|
root@www:~ #
vi /usr/local/etc/apache24/httpd.conf
# line 92 : uncomment
LoadModule socache_shmcb_module libexec/apache24/mod_socache_shmcb.so # line 148 : uncomment
LoadModule ssl_module libexec/apache24/mod_ssl.so # line 526 : uncomment
Include etc/apache24/extra/httpd-ssl.conf root@www:~ #
vi /usr/local/etc/apache24/extra/httpd-ssl.conf
# line 125, 126 : change to your server name and admin email
DocumentRoot "/usr/local/www/apache24/data" ServerName www.srv.world:443
ServerAdmin root@srv.world
ErrorLog "/var/log/httpd-error.log" TransferLog "/var/log/httpd-access.log" # line 144 : change to the certificate you got in [1]
SSLCertificateFile "/usr/local/etc/letsencrypt/live/www.srv.world/cert.pem"
# line 154 : change to the certificate you got in [1]
SSLCertificateKeyFile "/usr/local/etc/letsencrypt/live/www.srv.world/privkey.pem"
# line 165 : uncomment and change to the certificate you got in [1]
SSLCertificateChainFile "/usr/local/etc/letsencrypt/live/www.srv.world/chain.pem"
service apache24 reload
|
| [3] | If you'd like to set HTTP connection to redirect to HTTPS (Always on SSL/TLS), Set RewriteRule to each Host settings. For example, if you set Virtual Hostings like the link here, Add RewriteRule like follows. Or It's possible to set RewriteRule in [.htaccess] not in [httpd.conf]. |
|
root@www:~ #
vi /usr/local/etc/apache24/httpd.conf
# line 181 : uncomment
LoadModule rewrite_module libexec/apache24/mod_rewrite.so root@www:~ #
vi /usr/local/etc/apache24/Includes/vhost.conf
<VirtualHost *:80>
DocumentRoot /usr/local/www/apache24/data
ServerName www.srv.world
# add RewriteRule
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
root@www:~ #
service apache24 reload
|
| [4] | Verify to access to the test page from any client computer with Web browser via HTTPS. |
Добавление диска и создание разделов во FreeBSD
В этом руководстве будет рассмотрен процесс монтирования новых дисков и разделов на виртуальные серверы под управлением операционной системы FreeBSD.
Разметка диска
Примечание: все действия в данном руководстве должны выполняться в привилегированном режиме.
Необходимо посмотреть какие диски доступны для монтирования:
geom disk list
В нашем примере доступны диски: cd0 - CDROM, da0 - жесткий диск на котором установлена система, и дополнительный жесткий диск da1.
Примечание: если добавленный диск недоступен, то перезагрузите сервер.
В нашем примере мы будем монтировать устройство da1, полный путь к которому /dev/da1.
Теперь с помощью команды gpart разобьем диск на разделы с разметкой GPT:
gpart create -s gpt /dev/da1da1 created
Примечание: GPT - GUID Partition Table, формат таблицы разделов, использует систему адресации логических блоков (LBA).
Проверяем получившиеся разделы:
gpart show da1=> 34 20971453 da1 GPT (10G) 34 20971453 -free- (10G)
Теперь диск имеет разметку GPT.
Пример 1
Создадим первый раздел:
gpart add -t freebsd-ufs -s 1G /dev/da1da1p1 added
Второй раздел создадим без указания начального LBA и без указания размера — таким образом он будет создан на всем свободном пространстве:
gpart add -t freebsd-ufs /dev/da1da1p2 added
Проверяем получившиеся разделы:
gpart show da1
=> 34 20971453 da1 GPT (10G)
34 2097152 1 freebsd-ufs (1.0G)
2097186 18874301 2 freebsd-ufs (9.0G)
Для создания файловой системы на разделах диска выполните следующие команды:
newfs -U /dev/da1p1newfs -U /dev/da1p2Параметр -U указывает использование механизма Soft Update, который увеличивает скорость создания и удаления файлов путём использования кэширования.

Монтирование
Необходимо создать точку монтирования для каждого раздела:
mkdir /mnt/data1mkdir /mnt/data2Изменим режим доступа к разделам:
chmod -R 660 /mnt/data1chmod -R 660 /mnt/data2Далее необходимо добавить новые разделы в файл /etc/fstab для того, чтобы при перезапуске сервера разделы монтировались автоматически. Откройте с помощью текстового редактора, например nano, данный файл:
nano /etc/fstabДобавьте следующие строки:
/dev/da1p1 /mnt/data1 ufs rw 0 0
/dev/da1p2 /mnt/data2 ufs rw 0 0
С помощью команды mount примонтируем все разделы согласно файлу /etc/fstab:
mount -aПример 2 (добавление swap-раздела)
Для начала создадим раздел для swap:
gpart add -t freebsd-swap -s 1G /dev/da1da1p1 added
Второй раздел создадим без указания начального LBA и без указания размера — таким образом он будет создан на всем свободном пространстве:
gpart add -t freebsd-ufs /dev/da1da1p2 added
Проверяем получившиеся разделы:
gpart show da1
=> 34 20971453 da1 GPT (10G)
34 2097152 1 freebsd-swap (1.0G)
2097186 18874301 2 freebsd-ufs (9.0G)
Создание файловой системы
Раздел типа swap форматировать не нужно.
Для создания файловой системы на втором разделе диска выполните следующую команду:
newfs -U /dev/da1p2Параметр -U указывает использование механизма Soft Update, который увеличивает скорость создания и удаления файлов путём использования кэширования.

Монтирование
Необходимо создать точку монтирования для каждого раздела, кроме swap:
mkdir /mnt/dataИзмените режим доступа к разделам:
chmod -R 660 /mnt/dataДалее нужно добавить новые разделы в файл /etc/fstab для того чтобы при перезапуске сервера разделы монтировались автоматически. Откройте с помощью текстового редактора, например nano, данный файл:
nano /etc/fstabДобавьте следующие строки:
/dev/da1p1 none swap sw 0 0
/dev/da1p2 /mnt/data ufs rw 0 0
С помощью команды mount примонтируем все разделы согласно файлу /etc/fstab:
mount -aПроверим:
mount/dev/da1p2 on /mnt/data (ufs, local, soft-updates)
Далее с помощью команды swapon примонтируем swap-раздел:
swapon /dev/da1p1Проверим с помощью команды swapinfo:
swapinfoDevice 1K-blockes Used Avail Capacity /dev/da0p2 2097152 0 2097152 0% /dev/da1p1 1028576 0 1028576 0% Total 3145728 0 3145728 0%
Soft for USB JTAG ARM Emulator v9 v11 v12 V13
https://jlinkzone.com/soft-for-usb-jtag-arm-emulator-v9-v11-v12/?spm=a2g2w.chat.0.0.4a974aa64yqKBv
Please download the soft here :
Windows 64-bit Installer download link:
//JLink_Windows_V924a_x86_64 (2026-03-05)
// JLink_Windows_V892_x86_64 // JLink_Windows_V874_x86_64 //JLink_Windows_V796d_x86_64 // JLink_Windows_V856a_x86_64//
Windows 32-bit Installer download link:
//JLink_Windows_V896_i386 32-bit
MacOS 64-bit Installer download link: JLink_MacOSX_V796d_x86_64
Webmin /tmp error
Это сообщение об ошибке появляется потому, что в FreeBSD 14 по умолчанию используется tmpfs для раздела /tmp (временное хранилище в оперативной памяти). Размер этого раздела по умолчанию или ограничен нулем из-за настроек монтирования, либо просто отображается некорректно .
Вот как это можно исправить, перенастроив Webmin на использование другой папки, расположенной на основном диске.
Шаг 1: Создайте новую директорию для временных файлов
Подключитесь к серверу через SSH и выполните команду для создания папки. Например, создадим её в /var/tmp (этот каталог в FreeBSD не монтируется в RAM и подходит для таких целей):
sudo mkdir -p /var/tmp/.webmin
Важно: Убедитесь, что у этой папки правильные права доступа, чтобы веб-сервер Webmin мог в неё писать:
sudo chmod 1777 /var/tmp/.webmin
(Права 1777 означают «sticky-бит» — владелец может удалить только свои файлы, как в обычном /tmp).
Шаг 2: Смените путь в настройках Webmin
Теперь нужно указать Webmin использовать новую папку вместо стандартной.
-
Войдите в веб-интерфейс Webmin.
-
Перейдите в раздел Webmin → Webmin Configuration (Конфигурация Webmin).
-
Нажмите на иконку Advanced Options (Расширенные опции) .
-
Найдите поле Temporary files directory (Директория временных файлов).
-
Замените значение по умолчанию
Default (/tmp/.webmin)или просто путь, который там указан, на:/var/tmp/.webmin -
Нажмите кнопку Save (Сохранить).
Что произошло?
После этой смены:
-
Webmin перестанет пытаться использовать
/tmp(который лежит в оперативной памяти или смонтирован с ограничениями). -
Все временные файлы и резервные копии, которые он создает, теперь будут храниться в
/var/tmp/.webminна вашем основном диске, где достаточно места .
Дополнительные рекомендации
-
Очистка старых файлов: Webmin умеет автоматически чистить свою временную папку. Вы можете настроить "максимальный возраст временных файлов" (Maximum age of temporary files) там же, в расширенных опциях. Если вы используете нестандартную папку, убедитесь, что опция Clear temp files in non-standard directory? (Очищать временные файлы в нестандартной директории?) установлена в
Yes, чтобы мусор не накапливался годами . -
Перезагрузка: Перезагружать Webmin после изменения этой настройки не требуется, изменения применяются сразу. Но если вы решите удалить старую папку (
/tmp/.webmin), Webmin нужно предварительно остановить, чтобы не возникло конфликта открытых файлов .
Если после этого ошибка в интерфейсе осталась, просто обновите страницу — предупреждение должно исчезнуть.
Диск Windows монтируется только для чтения (РЕШЕНО)
В настоящее время Windows использует файловую систему NTFS. Linux поддерживает эту файловую систему для чтения, записи, создания, форматирования и выполнения других операций.
Тем не менее, иногда при попытке смонтировать диск Windows может возникнуть одна из двух ситуаций:
- диск монтируется, но только для чтения. Специальное указание опция монтирования с правами записи не помогает
- диск вовсе не монтируется из-за ошибки
К примеру, при попытке смонтировать диск:
|
1
|
sudo mount /dev/sdb4 /mnt/disk_e |
может возникнуть ошибка, что диск доступен только для чтения:
|
1
2
3
4
5
|
The disk contains an unclean file system (0, 0).Metadata kept in Windows cache, refused to mount.Falling back to read-only mount because the NTFS partition is in anunsafe state. Please resume and shutdown Windows fully (no hibernationor fast restarting.) |
А это пример ошибки, когда диск не смонтирован вовсе:
|
1
2
3
4
5
6
|
The disk contains an unclean file system (0, 0).Metadata kept in Windows cache, refused to mount.Failed to mount '/dev/sdb1': Операция не позволенаThe NTFS partition is in an unsafe state. Please resume and shutdownWindows fully (no hibernation or fast restarting), or mount the volumeread-only with the 'ro' mount option. |
Для решения этой проблемы нужно начать с установки драйвера ntfs-3g. Во-первых, он в любом случае необходим для полноценного функционирования файловой системы NTFS в Linux. Во-вторых, в этот пакет включена утилита ntfsfix, которая может помочь решить проблемы с диском Windows.
Для установки в Debian, Linux Mint, Ubuntu, Kali Linux и их производные:
|
1
|
sudo apt install ntfs-3g |
Для установки в Arch Linux и производные:
|
1
|
sudo pacman -S ntfs-3g |
Затем вновь попробуйте смонтировать диск — вполне возможно, что в этом случае он будет доступен с правами записи.
Если вновь возникла проблема, то отмонтируйте диск и запустите команду вида:
|
1
|
sudo ntfsfix /ПУТЬ/ДО/ДИСКА |
Пример команды для проверки и исправления проблемы с диском /dev/sdb4:
|
1
|
sudo ntfsfix /dev/sdb4 |
Пример вывода:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Mounting volume... The disk contains an unclean file system (0, 0).Metadata kept in Windows cache, refused to mount.FAILEDAttempting to correct errors... Processing $MFT and $MFTMirr...Reading $MFT... OKReading $MFTMirr... OKComparing $MFTMirr to $MFT... OKProcessing of $MFT and $MFTMirr completed successfully.Setting required flags on partition... OKGoing to empty the journal ($LogFile)... OKChecking the alternate boot sector... OKNTFS volume version is 3.1.NTFS partition /dev/sdb4 was processed successfully. |
Команда выводит причину проблемы: диск содержит нечистую файловую систему. Метаданные, хранимые в кэше Windows, препятствуют монтированию.
Затем выполняется ряд операций, каждая из которых заканчивается статусом OK и наконец сообщение was processed successfully говорит о том, что всё прошло успешно.
После этого вновь попытайтесь смонтировать диск — всё должно быть нормально.
Решение ошибки «Windows is hibernated, refused to mount».
Выполнение рассмотренной команды
|
1
|
sudo ntfsfix /dev/sda4 |
может завершиться неудачей:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
Mounting volume… Windows is hibernated, refused to mount.FAILEDAttempting to correct errors…Processing $MFT and $MFTMirr…Reading $MFT… OKReading $MFTMirr… OKComparing $MFTMirr to $MFT… OKProcessing of $MFT and $MFTMirr completed successfully.Setting required flags on partition… OKGoing to empty the journal ($LogFile)… OKWindows is hibernated, refused to mount.Remount failed: Operation not permitted |
Обратите особое внимание на строку «Windows is hibernated, refused to mount» которая повторяется дважды. Она означает, что работа Windows завершилась гибернацией, такой диск не может быть смонтирован для записи. Если вы специально выключили компьютер таким образом, то перезагрузитесь и выключите без гибернация или быстрого запуска.
Но это может не помочь, поскольку последние версии Windows делают гибернацию автоматически, без ведома пользователя.
Гибернация Windows и быстрый перезапуск
На компьютерах, на которых возможна двойная загрузка в Windows или Linux, Windows должна быть полностью выключена перед загрузкой в Linux, в противном случае файловые системы NTFS на внутренних дисках могут остаться в несогласованном состоянии, а изменения, сделанные Linux, могут быть проигнорированы Windows.
Таким образом, Windows нельзя оставлять в режиме гибернации при запуске Linux, чтобы избежать несоответствий. Кроме того, необходимо отключить функцию быстрого перезапуска, доступную в последних системах Windows. Этого можно добиться, выполнив в качестве администратора команду Windows, которая отключает как гибернацию, так и быстрый перезапуск, а также удаляет файл hiberfile:
|
1
|
powercfg /h off |
Если вы не хотите отключать гибернацию, то для одноразового выключения компьютера Windows без гибернация выключите его командой:
|
1
|
shutdown /s /t 0 |
Удаление файла гибернации
Когда том NTFS находится в спящем режиме, монтирование для чтения и записи запрещается, и том принудительно монтируется только для чтения. Необходимо либо возобновить работу Windows и правильно её выключить, либо использовать опцию remove_hiberfile, которая удалит файл гибернации Windows. Обратите внимание, это означает, что сохранённый сеанс Windows будет полностью утерян, но сама Windows не пострадает. Напомним, что в файле гибернация хранится содержимое оперативной памяти на момент выключения. Кстати, именно поэтому размер файла гибернация равен размеру оперативной памяти компьютера. Используйте эту опцию под свою ответственность.
Пример команды с указанием опции remove_hiberfile:
|
1
|
sudo mount -t ntfs-3g -o remove_hiberfile /dev/sda2 /mnt/spide |
Спасибо, что поделились решением! Вы абсолютно правы — `ntfsfix` действительно может решить эту проблему во многих случаях.
## Ваше решение
```bash
ntfsfix /dev/da0s1
```
После этого можно монтировать как обычно:
```bash
mount /dev/da0s1 /data/ntfs
```
## Что делает `ntfsfix`
Утилита `ntfsfix` (из пакета `ntfs-3g`) исправляет некоторые распространённые проблемы NTFS:
1. **Сбрасывает "грязный" флаг** (`dirty` flag) — тот самый флаг, который Windows оставляет после гибернации или быстрого запуска
2. **Восстанавливает журнал** ($LogFile)
3. **Проверяет основные структуры** NTFS
## Важное предупреждение
`ntfsfix` **не является полноценной заменой** `chkdsk` из Windows. Он:
- ✅ Убирает блокировку и позволяет монтировать раздел в режиме чтения-записи
- ⚠️ **Не проверяет** и не восстанавливает содержимое файлов
- ⚠️ Может замаскировать проблемы с файловой системой
## Как установить
```bash
pkg install ntfs-3g
```
## Когда `ntfsfix` работает, а когда нет
| Ситуация | ntfsfix поможет |
|----------|----------------|
| Гибернация Windows | ✅ Да |
| Быстрый запуск Windows | ✅ Да |
| Корректно выключенная Windows | ❌ Не нужен |
| Повреждённая MFT (Master File Table) | ❌ Нет, нужен `chkdsk /f` |
| Ошибки файловой системы | ❌ Нет, нужен `chkdsk` |
## Безопасная альтернатива
Если нет уверенности в целостности файловой системы:
```bash
# Монтирование только для чтения (безопасно)
mount -t ntfs -o ro /dev/da0s1 /data/ntfs
# Или с ntfsfix (разблокирует, но рискованно)
ntfsfix /dev/da0s1 && mount /dev/da0s1 /data/ntfs
```
**Запомнили:** `ntfsfix` — быстрое решение для разблокировки NTFS-раздела после Windows. Спасибо за совет!
How to Install Apache, MySQL, PHP (FAMP Stack) on FreeBSD 14.0
Introduction
FreeBSD, Apache, MySQL, and PHP (FAMP stack) is a collection of open-source software applications that manage the runtime and development of dynamic web applications on a server. Apache works as a web server to delivers web application files while MySQL functions as the database backend, and PHP processes dynamic web application contents.
This article explains how to install the Apache, MySQL, and PHP (FAMP) stack on FreeBSD 14.0 and deliver dynamic web applications on your server.
Prerequisites
Before you begin:
-
Deploy a FreeBSD 14.0 instance on Vultr.
-
Create a new domain A record pointing to the instance IP address. For example,
app.example.com. -
Access the server using SSH.
-
Create a non-root user with sudo privileges and switch to the user.
Install Apache
Apache is available in the default repositories on FreeBSD 14.0 with the latest package information. Follow the steps below to install the latest Apache web server package and enable the application to run on your server.
-
Update the server packages catalog.
console$ sudo pkg update
-
Install Apache on your server.
console$ sudo pkg install -y apache24
-
Verify that Apache is installed on your server.
console$ apachectl -v
Output:
Server version: Apache/2.4.59 (FreeBSD) Server built: unknown -
Enable Apache to automatically start at boot.
console$ sudo service apache24 enable
-
Start the Apache web server.
console$ sudo service apache24 start
-
View the Apache service status and verify that the web server is running.
console$ sudo service apache24 status
Output:
apache24 is running as pid 2536. -
Access your server IP address using a web browser such as Chrome and verify that the default Apache virtual host web page displays.
http://SERVER-IP
Install MySQL
MySQL is available in the default FreeBSD 14.0 repositories with multiple versions. Follow the steps below to install the latest MySQL database server version and enable it to run on your server.
-
Search all MySQL versions available in the default FreeBSD repositories.
console$ sudo pkg search mysql
Output:
... mysql80-client-8.0.35 Multithreaded SQL database (client) mysql80-server-8.0.35_1 Multithreaded SQL database (server) mysql81-client-8.1.0 Multithreaded SQL database (client) mysql81-server-8.1.0 Multithreaded SQL database (server) ... -
Install the latest MySQL server and client packages.
console$ sudo pkg install mysql81-server mysql81-client
-
View the installed MySQL version on your server.
console$ mysql --version
Output:
mysql Ver 8.1.0 for FreeBSD14.0 on amd64 (Source distribution) -
Enable the MySQL server to automatically start at boot.
console$ sudo service mysql enable
Output:
mysql enabled in /etc/rc.conf -
Start the MySQL database server.
console$ sudo service mysql-server start
-
View the MySQL server status and verify that it's running.
console$ sudo service mysql-server status
Output:
mysql is running as pid 3266. -
Start the MySQL secure installation script.
console$ sudo mysql_secure_installation
- Enter Y when prompted to enable the VALIDATE PASSWORD component and set strict password policies on the database server.
VALIDATE PASSWORD COMPONENT can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD component? Press y|Y for Yes, any other key for No: Y- Enter your desired password strength level to enable on your server. For example, enter 2 to require strong passwords with mixed characters.
There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary file Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:- Enter a new strong password to assign the
rootdatabase user.
Please set the password for root here. New password:- Repeat the password and verify the estimated password strength.
Re-enter new password: Estimated strength of the password: 8- Enter Y when prompted to validate and continue with the new user password.
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) :- Enter Y and press Enter to remove anonymous database users on your server.
Remove anonymous users? (Press y|Y for Yes, any other key for No) :- Enter Y when prompted to disable remote access to your database server using the root user account.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) :- Enter Y when prompted to remove the test databases on your server.
`Remove test database and access to it? (Press y|Y for Yes, any other key for No) :- Enter Y and press Enter to reload the MySQL privilege tables and apply your configuration changes.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : -
Restart the MySQL database server to apply changes.
console$ sudo service mysql-server restart
Install PHP and Configure PHP-FPM
PHP is available in the default FreeBSD repositories and includes the PHP-FPM package that manages connection requests using pool configurations on your server. Follow the steps below to install the latest PHP version on your server.
-
Search all available PHP packages in the default FreeBSD repositories.
console$ pkg search php | egrep '^php[0-9]+-[0-9]'
Output:
php81-8.1.29 PHP Scripting Language (8.1.X branch) php82-8.2.18 PHP Scripting Language (8.2.X branch) php83-8.3.6 PHP Scripting Language (8.3.X branch) -
Install the latest PHP package. For example, PHP version
8.3.console$ sudo apt install php83
-
Install common PHP modules required to enable application functionalities.
console$ sudo pkg install -y php83-mysqli php83-curl php83-zip php83-gd php83-xml php83-mbstring
-
View the installed PHP version on your server..
console$ php -v
Output:
PHP 8.3.6 (cli) (built: Jun 20 2024 02:08:30) (NTS) Copyright (c) The PHP Group Zend Engine v4.3.6, Copyright (c) Zend Technologies -
View the installed PHP-FPM version on your server.
console$ php-fpm -v
Output:
PHP 8.3.6 (fpm-fcgi) (built: Jun 20 2024 02:08:43) Copyright (c) The PHP Group Zend Engine v4.3.6, Copyright (c) Zend Technologies -
Enable PHP-FPM to automatically start at boot.
console$ sudo service php-fpm enable
-
View the PHP-FPM service status and verify that it's running.
console$ sudo service php-fpm status
Output:
php_fpm is running as pid 2558.
Configure Apache with PHP-FPM
Apache uses the mod_proxy and mod_proxy_fcgi modules to process FastCGI requests and connect to the PHP-FPM service. Follow the steps below to enable the required Apache modules and forward all PHP application requests to the PHP-FPM service port 9000.
-
Open the default PHP-FPM pool configuration file using a text editor such as the Easy Editor (
ee).console$ sudo ee /usr/local/etc/php-fpm.d/www.conf
- Find the
userandgroupdirectives and verify that PHP-FPM runs with the web server user profilewww.
iniuser = www group = www
- Find the
listendirective and verify that PHP-FPM listens for connection requests on the localhost port9000.
inilisten = 127.0.0.1:9000
Save and close the file.
- Find the
-
Run the following command to enable the
mod_proxyandmod_proxy_fcgiApache modules on your server.console$ sudo sed -i '' -e 's/^#LoadModule proxy_module libexec\/apache24\/mod_proxy.so/LoadModule proxy_module libexec\/apache24\/mod_proxy.so/' -e 's/^#LoadModule proxy_fcgi_module libexec\/apache24\/mod_proxy_fcgi.so/LoadModule proxy_fcgi_module libexec\/apache24\/mod_proxy_fcgi.so/' /usr/local/etc/apache24/httpd.conf
The above command uncomments the following Apache configuration directives to enable the modules on your server.
apacheconfLoadModule proxy_module libexec/apache24/mod_proxy.so LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so
-
Open the main Apache configuration file.
console$ sudo ee /usr/local/etc/apache24/httpd.conf
-
Add the following configurations at the end of the file to forward all PHP file requests to the PHP-FPM port
9000.apacheconf<FilesMatch "\.php$"> SetHandler "proxy:fcgi://127.0.0.1:9000" </FilesMatch>Save and close the file.
-
Test the Apache configuration for errors.
console$ sudo apachectl configtest
Your output should look like the one below when the test is successful:
Performing sanity check on apache24 configuration: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message Syntax OK -
Restart PHP-FPM to apply changes.
console$ sudo service php-fpm restart
-
Restart Apache to apply the configuration changes.
console$ sudo service apache24 restart
Test the Installation
-
Log in to the MySQL database server using the
rootuser and password you set earlier.console$ mysql -u root -p
-
Create a new sample database
exampledb.sqlmysql> create database exampledb;
-
Create a new database user such as
dbadminwith a strong password.sqlmysql> create user 'dbadmin'@'localhost' IDENTIFIED BY 'strong@@password25Bb';
-
Grant the
dbadminuser full privileges to theexampledbdatabase.sqlmysql> GRANT ALL PRIVILEGES ON exampledb.* TO 'dbadmin'@'localhost';
-
Flush the MySQL privileges table to apply changes.
sqlmysql> FLUSH PRIVILEGES;
-
Switch to the sample database
exampledb.sqlmysql> use exampledb;
-
Create a new sample table
exampletablewith the following columns to store integer and string values.sqlmysql> CREATE TABLE exampletable (id INT AUTO_INCREMENT PRIMARY KEY, messages VARCHAR(255) NOT NULL);
The above SQL statement creates a new table with the columns:
idthat stores numeric data, andmessagesthat stores mixed characters. -
Insert sample data into the table. For example,
Greetings from Vultr.sqlmysql> INSERT INTO exampletable (messages) VALUES ('Greetings from Vultr'); -
Exit the MySQL database console.
sqlmysql> EXIT;
-
Create a new directory to store your web application files. For example,
app.example.comin the default Apache web root path.console$ sudo mkdir -p /usr/local/www/apache24/app.example.com
-
Create a new sample PHP application file in the directory. For example,
index.php.console$ sudo ee /usr/local/www/apache24/app.example.com/index.php
-
Add the following contents to the file.
php<?php $servername = "localhost"; $username = "dbadmin"; $password = "strong@@password25Bb"; $dbname = "exampledb"; // Connect to the MySQL database $conn = new mysqli($servername, $username, $password, $dbname); // Test the MySQL database connection if ($conn->connect_error) { die("Database Connection Failed." . $conn->connect_error); } // Fetch a string from exampletable $sql = "SELECT messages FROM exampletable"; $result = $conn->query($sql); if ($result->num_rows > 0) { $row = $result->fetch_assoc(); echo "<h1 align='center'> <br> <br>" . $row["messages"]. "</h1>"; } else { echo "<h1 align='center'> <br> No Data Found.</h1>"; } $conn->close(); ?>Save the file and exit the text editor.
The above PHP application connects to the MySQL database server and queries the
exampledbdatabase to output values in theexampledatacolumn within themessagestable. The application displays aGreetings from Vultrheading when successful orNo Data Foundwhen unsuccessful. -
Create a new Apache virtual host configuration file. For example,
app.example.com.conf.console$ sudo ee /usr/local/etc/apache24/Includes/app.example.com.conf
-
Add the following configurations to the file.
apacheconf<VirtualHost *:80> ServerAdmin webmaster@yourdomain.com DocumentRoot "/usr/local/www/apache24/app.example.com/" ServerName app.example.com <Directory "/usr/local/www/apache24/app.example.com/"> Options Indexes FollowSymLinks AllowOverride All Require all granted DirectoryIndex index.php index.html </Directory> ErrorLog "/var/log/app.example.com-error.log" </VirtualHost>Save the file and exit the text editor.
The above Apache configuration creates a new virtual host that listens for connections using the domain
app.example.comon the default HTTP port80. All PHP requests are forwarded to PHP-FPM on the host port9000applied in your main Apache configuration. -
Test the Apache configuration for errors.
console$ sudo apachectl configtest
Output:
Performing sanity check on apache24 configuration: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message Syntax OK -
Restart Apache to apply the new virtual host configuration.
console$ sudo service apache24 restart
-
Access your domain using a web browser and verify that you can access the PHP web application.
http://app.example.com
Secure the Server
-
Install the Certbot Let's Encrypt client for Apache.
console$ sudo pkg install py39-certbot-apache
-
Run the following commands to enable the Apache
mod_rewriteandmod_sslmodules to allow SSL configurations on your web server.console$ sudo sed -i '' 's/#LoadModule rewrite_module libexec\/apache24\/mod_rewrite.so/LoadModule rewrite_module libexec\/apache24\/mod_rewrite.so/' /usr/local/etc/apache24/httpd.conf $ sudo sed -i '' 's/#LoadModule ssl_module libexec\/apache24\/mod_ssl.so/LoadModule ssl_module libexec\/apache24\/mod_ssl.so/' /usr/local/etc/apache24/httpd.conf
The above commands uncomment and enable the following directives in the
/usr/local/etc/apache24/httpd.confApache configuration file:apacheconfLoadModule ssl_module libexec/apache24/mod_ssl.so LoadModule rewrite_module libexec/apache24/mod_rewrite.so
-
Generate a new SSL certificate for your domain. Replace
app.example.comwith your actual domain.console$ sudo certbot --apache -d app.example.com --agree-tos
-
Test the Certbot SSL certificate automatic renewal process.
console$ sudo certbot renew --dry-run
Output:
Account registered. Simulating renewal of an existing certificate for app.example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations, all simulated renewals succeeded: /usr/local/etc/letsencrypt/live/app.example.com/fullchain.pem (success) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Restart Apache to apply your SSL configuration changes.
console$ sudo service apache24 restart
-
Create a new Packet Filter (
pf) firewall configuration.console$ sudo ee /etc/pf.conf
-
Add the following configurations to the file. Replace
vtnet0with your public server interface name.iniext_interface = "vtnet0" # The external server interface pass quick on lo0 all # Allow all connections on the loopback interface # Filter rules block in all # Block incoming unpermitted traffic pass out all keep state # Allow outgoing traffic pass in on $ext_interface proto tcp from any to any port 22 keep state # Allow SSH pass in on $ext_interface proto tcp from any to any port 80 keep state # Allow HTTP pass in on $ext_interface proto tcp from any to any port 443 keep state # Allow HTTPS
Save the file and exit the text editor.
The above firewall configuration enables network connections to the SSH port
22, HTTP port80, and the HTTPS port443. In addition, the firewall blocks any other network connections to other ports on your server. -
Enable the firewall to automatically start at boot.
console$ sudo sysrc pf_enable="YES"
Output:
pf_enable: NO -> YES -
Load your firewall configuration.
console$ sudo pfctl -f /etc/pf.conf
-
Start the Packet Filter firewall.
console$ sudo pfctl -e
Output:
pf enabled -
View all firewall rules and verify that your SSH, HTTP, and HTTPS ports are available.
console$ sudo pfctl -sr
Output:
pass quick on lo0 all flags S/SA keep state block drop in all pass in on vtnet0 proto tcp from any to any port = ssh flags S/SA keep state pass in on vtnet0 proto tcp from any to any port = http flags S/SA keep state pass in on vtnet0 proto tcp from any to any port = https flags S/SA keep state pass out all flags S/SA keep state -
Access your domain using HTTPS to verify that your SSL certificate is valid and encrypted by the Apache web server.
https://app.example.com
Conclusion
You have successfully installed the Apache, MySQL, and PHP (FAMP) stack on your FreeBSD 14.0 server. All applications in the stack run collectively on the server to deliver dynamic web applications. You can configure the Apache web server and set up MySQL databases to securely deliver web applications or frameworks such as WordPress on your server.
Ошибка Permission denied указывает на то, что процесс OpenDKIM
Ошибка Permission denied указывает на то, что процесс OpenDKIM не может прочитать ваш приватный ключ, потому что файл принадлежит не тому пользователю.
На FreeBSD стандартным пользователем для OpenDKIM является mailnull, а не opendkim.
🛠️ Пошаговое решение
Вот три последовательных шага, которые гарантированно исправят проблему. Выполните их от root.
1️⃣ Правильный владелец файла и каталогов
Самый важный шаг — изменить владельца для всего, что касается DKIM, на пользователя и группу mailnull.
chown -R mailnull:mailnull /var/db/dkim
2️⃣ Безопасные права доступа
Вы уже делали эту часть ранее, но лучше повторить, чтобы исключить ошибку. Это даст OpenDKIM возможность читать ключ и заходить в каталог.
chmod 0600 /var/db/dkim/ip-mail.ru/myselector.private chmod 0750 /var/db/dkim chmod 0750 /var/db/dkim/ip-mail.ru
3️⃣ Перезапуск сервисов
Чтобы все изменения вступили в силу.
service milter-opendkim restart service sendmail restart # или service postfix restart, если он у вас
💡 Почему это важно
-
Пользователь по умолчанию: В отличие от многих других систем, где OpenDKIM часто запускается от собственного пользователя
opendkim, в портах FreeBSD по умолчанию используетсяmailnull. -
Безопасность: OpenDKIM намеренно требователен к правам доступа и откажется загружать ключ, если он доступен кому-то ещё, кроме владельца.
После выполнения этих шагов выполните команду tail -f /var/log/maillog и попробуйте отправить тестовое письмо. Ошибка Permission denied должна исчезнуть.
Если проблема сохранится, проверьте еще одну вещь: в некоторых версиях требуется также явно указать пользователя в настройках. Убедитесь, что в файле /etc/rc.conf есть следующие строки:
milteropendkim_uid="mailnull" milteropendkim_gid="mailnull"
Как установить Suricata на FreeBSD

Suricata — это бесплатная система обнаружения вторжений с открытым исходным кодом, или сокращённо IDS. Но она также может выступать в качестве системы предотвращения вторжений, или IPS. Она работает на основе эвристических алгоритмов, выявляющих закономерности в сетевом трафике. Если система настроена только на предупреждение о подозрительной активности, она называется IDS, а если она блокирует трафик из-за вредоносной активности, то IPS. Suricata обычно устанавливается в качестве плагина в pfSense — полноценный брандмауэр и сетевой дистрибутив корпоративного уровня с открытым исходным кодом на базе FreeBSD. Если вы используете FreeBSD в качестве настольной системы, вот руководство по тестированию pfSense в VirtualBox. Однако вы можете использовать Suricata как отдельное программное обеспечение для анализа сетевого трафика.
Если статьи на Adminbyaccident.com оказались для вас полезными, пожалуйста, подумайте о том, чтобы сделать пожертвование.
Воспользуйтесь этой ссылкой, чтобы получить кредит на 200 долларов в DigitalOcean и поддержать расходы на Adminbyaccident.com.
Получите 100 долларов в подарок от Vultr по этой ссылке и поддержите расходы на Adminbyaccident.com.
Обратите внимание, что Vultr поддерживает FreeBSD в рамках своего предложения по VPS.
Что касается требований к установке Suricata, то их немного. Вы можете использовать ее на том же сервере, на котором работает веб-сервер, но гораздо интереснее использовать ее вместе с брандмауэром, защищающим офис (локальная сеть) или даже компанию с несколькими филиалами (глобальная сеть). Если вы решите использовать ее для защиты глобальной сети, то вам практически обязательно понадобится сервер или устройство с двумя сетевыми интерфейсами. Конечно, если вы планируете защищать компанию среднего или крупного размера, то чем больше сетевых адаптеров, тем лучше, хотя вы также можете рассмотреть вариант с оборудованием Netgate, на котором уже установлен pfSense. Что бы вы ни использовали, обязательным условием является зеркальное отображение трафика на устройстве, на котором вы собираетесь использовать Suricata, если вы запускаете ее параллельно с другими устройствами. Обычно это означает, что нужно подключить кабель от коммутатора или брандмауэра к устройству Suricata и настроить зеркалирование портов. Если вы хотите использовать его на том же веб-сервере, что и раньше, то можете это сделать, но, скорее всего, вам больше подойдет HIDS (система обнаружения вторжений на уровне хоста).
Но зачем все это? Возможно, вам не нужна эта система обнаружения вторжений, но если у вас небольшой офис, то установка межсетевого экрана pfSense с пакетом Suricata (напомним, что pfSense полностью основан на FreeBSD) станет дополнительным уровнем безопасности. Опять же, для веб-сервера это не очень полезно, если только это не очень популярный веб-сервер и от него не зависит компания из 15 человек. В таком случае это программное обеспечение поможет защитить сеть, для чего оно и предназначено. Вопрос в том, как отображаются оповещения Suricata. Такое программное обеспечение обычно используется в средних и крупных организациях (опять же, в небольших компаниях можно использовать pfSense или нанять кого-то, кто сделает всю работу за вас). Обычно оповещения записываются в системный журнал и пересылаются в SIEM, специализированное программное обеспечение для анализа инцидентов. SIEM с открытым исходным кодом — это OSSIM. Но поверх Suricata можно установить стек ELK, который добавит графические возможности и позволит легко работать с оповещениями без необходимости установки SIEM. Об этом мы расскажем в одной из статей в этом году.
Для демонстрации мы используем виртуальную машину DigitalOcean, но вы можете использовать любой VPS по своему выбору или просто физическое оборудование. Учитывайте размер устройства или виртуальной машины, которые вы планируете использовать в производственной среде, поскольку Suricata может потреблять довольно много ресурсов, особенно в загруженных сетях.
Сначала мы поищем пакет. Если у вас установлены последние версии пакетов из репозитория FreeBSD, то, скорее всего, вы найдете только Suricata 5. Однако если вы используете ежеквартальные обновления, то найдете Suricata версий 4.1.6 и 5. Выбирайте на свой вкус, но я обычно устанавливаю последнюю версию.
[albert@VPN ~]$ pkg search suricata
suricata-5.0.1 High Performance Network IDS, IPS and Security Monitoring engine
suricata5-5.0.0.r1_2 High Performance Network IDS, IPS and Security Monitoring engine(v5)
[albert@VPN ~]$
Найдя пакет, мы просто установим его. Если сомневаетесь, посетите Freshports.org, где можно найти всю необходимую информацию о программном обеспечении для FreeBSD.
[albert@VPN ~]$ sudo pkg install suricata
Contrasenya:
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 8 package(s) will be affected (of 0 checked):
New packages to be INSTALLED:
suricata: 5.0.1
libyaml: 0.2.2
libnet: 1.1.6_5,1
python37: 3.7.6
py37-yaml: 5.2
py37-setuptools: 41.4.0_1
pcre: 8.43_2
jansson: 2.12
Number of packages to be installed: 8
The process will require 128 MiB more space.
20 MiB to be downloaded.
Proceed with this action? [y/N]: y
.........
.........
You may want to try BPF in zerocopy mode to test performance improvements:
sysctl -w net.bpf.zerocopy_enable=1
Don't forget to add net.bpf.zerocopy_enable=1 to /etc/sysctl.conf
[albert@VPN ~]$
Как всегда, полезно сохранить сообщения об установке, потому что они могут оказаться очень полезными.
=====
Message from suricata-5.0.1:
--
If you want to run Suricata in IDS mode, add to /etc/rc.conf:
suricata_enable="YES"
suricata_interface="<if>"
NOTE: Declaring suricata_interface is MANDATORY for Suricata in IDS Mode.
However, if you want to run Suricata in Inline IPS Mode in divert(4) mode,
add to /etc/rc.conf:
suricata_enable="YES"
suricata_divertport="8000"
NOTE:
Suricata won't start in IDS mode without an interface configured.
Therefore if you omit suricata_interface from rc.conf, FreeBSD's
rc.d/suricata will automatically try to start Suricata in IPS Mode
(on divert port 8000, by default).
Alternatively, if you want to run Suricata in Inline IPS Mode in high-speed
netmap(4) mode, add to /etc/rc.conf:
suricata_enable="YES"
suricata_netmap="YES"
NOTE:
Suricata requires additional interface settings in the configuration
file to run in netmap(4) mode.
RULES: Suricata IDS/IPS Engine comes without rules by default. You should
add rules by yourself and set an updating strategy. To do so, please visit:
http://www.openinfosecfoundation.org/documentation/rules.html
http://www.openinfosecfoundation.org/documentation/emerging-threats.html
You may want to try BPF in zerocopy mode to test performance improvements:
sysctl -w net.bpf.zerocopy_enable=1
Don't forget to add net.bpf.zerocopy_enable=1 to /etc/sysctl.conf
Для начала выясним, какой у нас интерфейс, с помощью команды ifconfig. Поскольку это виртуальная машина FreeBSD DOcean по умолчанию, у нее только один интерфейс (не считая loop-интерфейса). Рекомендуется использовать один интерфейс для управления, а второй — для приема зеркалированного трафика с коммутатора или брандмауэра. Если по какой-то причине зеркалированный трафик превысит пропускную способность системы, у вас всегда будет запасной вариант. Для демонстрации мы будем использовать только один интерфейс, но мы вас предупредили. И вы это знаете.
[albert@VPN ~]$ ifconfig
vtnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=6c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
ether 2e:d3:db:28:6a:d8
inet6 fe80::2cd3:dbff:fe28:6ad8%vtnet0 prefixlen 64 scopeid 0x1
inet 142.93.75.244 netmask 0xfffff000 broadcast 142.93.79.255
inet 10.17.0.5 netmask 0xffff0000 broadcast 10.17.255.255
media: Ethernet 10Gbase-T <full-duplex>
status: active
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
inet 127.0.0.1 netmask 0xff000000
groups: lo
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
[albert@VPN ~]$
Как мы видим, сетевой интерфейс здесь называется vtnet0. Давайте настроим этот интерфейс в режиме promiscuous. Зачем? Потому что мы хотим проверять сетевой трафик и хотим, чтобы каждый сетевой пакет проверялся полностью, а не только фреймы.
[albert@VPN ~]$ sudo ifconfig vtnet0 promisc
[albert@VPN ~]$
Чтобы проверить, что изменения вступили в силу, выполните следующую команду и найдите строку ‘promisc’.
[albert@VPN ~]$ ifconfig vtnet0 | grep 'PROMISC'
vtnet0: flags=28943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,PPROMISC> metric 0 mtu 1500
[albert@VPN ~]$
Вот и все, теперь интерфейс vtnet0 передает все полученные пакеты в ядро, где они будут проверены.
Теперь мы можем включить Suricata как службу и настроить ее для работы на интерфейсе vtnet0. Мы сделаем это с помощью команды sysrc.
[albert@VPN ~]$ sudo sysrc suricata_enable="YES"
suricata_enable: -> YES
[albert@VPN ~]$
Теперь, когда служба добавлена, давайте настроим ее для работы на интерфейсе vtnet0.
[albert@VPN ~]$ sudo sysrc suricata_interface="vtnet0"
suricata_interface: -> vtnet0
[albert@VPN ~]$
Чтобы убедиться, что изменения внесены в файл /etc/rc.conf, просто введите следующую команду. Должны появиться две записи:
[albert@VPN ~]$ grep -n 'suricata' /etc/rc.conf
46:suricata_enable="YES"
47:suricata_interface="vtnet0"
[albert@VPN ~]$
Как видно выше, в строках 46 и 47 файла /etc/rc.conf указаны служба и интерфейс suricata.
Прежде чем мы запустим сервис и пакеты, проходящие через интерфейс, начнут проверяться, нужно настроить несколько параметров, таких как адрес электронной почты, на который будут приходить оповещения, расположение правил и ответы на некоторые другие вопросы о работе Suricata.
Suricata использует правила для проверки и работы в качестве системы обнаружения вторжений. Поэтому, если вы используете ее для защиты локальной сети, убедитесь, что в брандмауэре настроено правило для получения необходимых источников, иначе Suricata не сможет получать информацию и выполнять свою основную функцию. Правила находятся в следующем каталоге и файле:
/var/lib/suricata
/var/lib/suricata/suricata.rules
Правила также необходимо сортировать по приоритетам для уровней оповещений. Эта информация хранится в файле /usr/local/etc/suricata/classification.config. Следующий абзац взят из этого файла.
# $Id$
# classification.config taken from Snort 2.8.5.3. Snort is governed by the GPLv2
#
# The following includes information for prioritizing rules
#
# Each classification includes a shortname, a description, and a default
# priority for that classification.
#
# This allows alerts to be classified and prioritized. You can specify
# what priority each classification has. Any rule can override the default
# priority for that rule.
#
# Here are a few example rules:
#
# alert TCP any any -> any 80 (msg: "EXPLOIT ntpdx overflow";
# dsize: > 128; classtype:attempted-admin; priority:10;
#
# alert TCP any any -> any 25 (msg:"SMTP expn root"; flags:A+; \
# content:"expn root"; nocase; classtype:attempted-recon;)
#
# The first rule will set its type to "attempted-admin" and override
# the default priority for that type to 10.
#
# The second rule set its type to "attempted-recon" and set its
# priority to the default for that type.
#
#
# config classification:shortname,short description,priority
#
config classification: not-suspicious,Not Suspicious Traffic,3
config classification: unknown,Unknown Traffic,3
config classification: bad-unknown,Potentially Bad Traffic, 2
config classification: attempted-recon,Attempted Information Leak,2
config classification: successful-recon-limited,Information Leak,2
config classification: successful-recon-largescale,Large Scale Information Leak,2
Также есть справочный файл, в котором указаны URL-адреса источников информации.
[albert@VPN /usr/local/etc/suricata]$ cat reference.config
# config reference: system URL
config reference: bugtraq http://www.securityfocus.com/bid/
config reference: bid http://www.securityfocus.com/bid/
config reference: cve http://cve.mitre.org/cgi-bin/cvename.cgi?name=
#config reference: cve http://cvedetails.com/cve/
config reference: secunia http://www.secunia.com/advisories/
#whitehats is unfortunately gone
config reference: arachNIDS http://www.whitehats.com/info/IDS
config reference: McAfee http://vil.nai.com/vil/content/v_
config reference: nessus http://cgi.nessus.org/plugins/dump.php3?id=
config reference: url http://
config reference: et http://doc.emergingthreats.net/
..........
..........
[albert@VPN /usr/local/etc/suricata]$
Еще один файл, о котором стоит упомянуть, — это threshold.config, в котором можно указать, насколько система обнаружения вторжений должна быть чувствительна, чтобы предупреждать вас о возможных проблемах. Помните, что система обнаружения вторжений может быть довольно шумным элементом в наборе инструментов для защиты вашего офиса, компании или даже двух небольших серверов. Настройка системы требует времени и внимания, так что будьте готовы к ложным срабатываниям, особенно в средних и крупных сетях. Вот фрагмент файла threshold.config:
[albert@VPN /usr/local/etc/suricata]$ cat threshold.config
# Thresholding:
#
# This feature is used to reduce the number of logged alerts for noisy rules.
# Thresholding commands limit the number of times a particular event is logged
# during a specified time interval.
#
# The syntax is the following:
#
# threshold gen_id <gen_id>, sig_id <sig_id>, type <limit|threshold|both>, track <by_src|by_dst>, count <n>, seconds <t>
#
# event_filter gen_id <gen_id>, sig_id <sig_id>, type <limit|threshold|both>, track <by_src|by_dst>, count <n>, seconds <t>
#
# suppress gen_id <gid>, sig_id <sid>
# suppress gen_id <gid>, sig_id <sid>, track <by_src|by_dst>, ip <ip|subnet>
#
# The options are documented at https://suricata.readthedocs.io/en/latest/configuration/global-thresholds.html
#
# Please note that thresholding can also be set inside a signature. The interaction between rule based thresholds
# and global thresholds is documented here:
# https://suricata.readthedocs.io/en/latest/configuration/global-thresholds.html#global-thresholds-vs-rule-thresholds
# Limit to 10 alerts every 10 seconds for each source host
#threshold gen_id 0, sig_id 0, type threshold, track by_src, count 10, seconds 10
# Limit to 1 alert every 10 seconds for signature with sid 2404000
#threshold gen_id 1, sig_id 2404000, type threshold, track by_dst, count 1, seconds 10
# Avoid to alert on f-secure update
# Example taken from https://blog.inliniac.net/2012/03/07/f-secure-av-updates-and-suricata-ips/
#suppress gen_id 1, sig_id 2009557, track by_src, ip 217.110.97.128/25
#suppress gen_id 1, sig_id 2012086, track by_src, ip 217.110.97.128/25
#suppress gen_id 1, sig_id 2003614, track by_src, ip 217.110.97.128/25
[albert@VPN /usr/local/etc/suricata]$
Самый важный файл в Suricata — это основной конфигурационный файл suricata.yaml. В файлах .yaml нужно соблюдать отступы. Если их не соблюдать, правила не загрузятся, и файл будет бесполезен. Этот файл находится в папке:
/usr/local/etc/suricata/suricata.yaml
Файл довольно большой, поэтому приготовьтесь использовать grep с флагом -n, чтобы найти строку, которую нужно настроить. Официальное руководство по администрированию будет вам очень полезно, ведь с помощью Suricata можно сделать очень многое.
Прежде чем мы углубимся в эту тему, давайте в общих чертах рассмотрим, что к чему. Первое, что нужно понять, — какой тип сети мы пытаемся контролировать: глобальную или локальную. По умолчанию в файле suricata.yaml (помните, что это основной файл конфигурации) зарезервированный блок IP-адресов интерпретируется как локальный, как видно из следующего фрагмента. Для локальной сети это нормально, но вам, возможно, придется внести некоторые изменения. Например, если у вас нет SQL-сервера, вы можете отключить эту переменную. Возможно, у вас не сервер OracleDB, а сервер MySQL, поэтому порт 3306 должен быть указан в разделе «port-groups». Просто уделите немного времени изучению следующего снимка из файла suricata.yaml.
##
## Step 1: inform Suricata about your network
##
vars:
# more specific is better for alert accuracy and performance
address-groups:
HOME_NET: "[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]"
#HOME_NET: "[192.168.0.0/16]"
#HOME_NET: "[10.0.0.0/8]"
#HOME_NET: "[172.16.0.0/12]"
#HOME_NET: "any"
EXTERNAL_NET: "!$HOME_NET"
#EXTERNAL_NET: "any"
HTTP_SERVERS: "$HOME_NET"
SMTP_SERVERS: "$HOME_NET"
SQL_SERVERS: "$HOME_NET"
DNS_SERVERS: "$HOME_NET"
TELNET_SERVERS: "$HOME_NET"
AIM_SERVERS: "$EXTERNAL_NET"
DC_SERVERS: "$HOME_NET"
DNP3_SERVER: "$HOME_NET"
DNP3_CLIENT: "$HOME_NET"
MODBUS_CLIENT: "$HOME_NET"
MODBUS_SERVER: "$HOME_NET"
ENIP_CLIENT: "$HOME_NET"
ENIP_SERVER: "$HOME_NET"
port-groups:
HTTP_PORTS: "80"
SHELLCODE_PORTS: "!80"
ORACLE_PORTS: 1521
SSH_PORTS: 22
DNP3_PORTS: 20000
MODBUS_PORTS: 502
FILE_DATA_PORTS: "[$HTTP_PORTS,110,143]"
FTP_PORTS: 21
VXLAN_PORTS: 4789
##
Вторая важная тема — формат вывода данных, о котором вы можете подробно прочитать по этой ссылке. Если вкратце, то по умолчанию включены строковое оповещение fast и EVE (расширяемый формат событий), а также ряд протоколов, таких как http, snmp, smb, dhcp и многие другие. Настоятельно рекомендуем внимательно изучить документацию, но даже просто просмотрев основной конфигурационный файл, вы поймете, что к чему. Для этого вы всегда можете использовать следующую команду и нажать Enter, чтобы появилась новая строка. Чтобы выйти из программы, просто введите «q».
cat /usr/local/etc/suricata/suricata.yaml | less
Как уже было сказано, Suricata регистрирует оповещения в нескольких типах журналов, таких как журнал быстрого формата или EVE, а также в журнале suricata.log, где фиксируются и другие типы событий, например проблемы с некоторыми правилами, неполадки в работе демона и т. д. Запомните, где находятся журналы и с чем они связаны.
[albert@VPN /usr/local/etc/suricata]$ sudo ls -la /var/log/suricata
total 1582
drwx------ 2 root wheel 6 28 des. 08:24 .
drwxr-xr-x 4 root wheel 52 28 des. 08:00 ..
-rw-r--r-- 1 root wheel 1207757 28 des. 20:42 eve.json
-rw-r--r-- 1 root wheel 0 28 des. 08:24 fast.log
-rw-r--r-- 1 root wheel 643645 28 des. 20:42 stats.log
-rw-r--r-- 1 root wheel 3957 28 des. 20:17 suricata.log
[albert@VPN /usr/local/etc/suricata]$
После того как мы настроили Suricata в соответствии со своими предпочтениями, мы можем получить доступ к правилам, проверить, все ли в порядке, и запустить их. Следующая команда также используется для обновления установленных наборов правил.
[albert@VPN ~]$ sudo suricata-update
28/12/2019 -- 08:24:27 - <Info> -- Using data-directory /var/lib/suricata.
28/12/2019 -- 08:24:27 - <Info> -- Using Suricata configuration /usr/local/etc/suricata/suricata.yaml
28/12/2019 -- 08:24:27 - <Info> -- Using /usr/local/share/suricata/rules for Suricata provided rules.
28/12/2019 -- 08:24:27 - <Info> -- Found Suricata version 5.0.1 at /usr/local/bin/suricata.
28/12/2019 -- 08:24:27 - <Info> -- Loading /usr/local/etc/suricata/suricata.yaml
28/12/2019 -- 08:24:27 - <Info> -- Disabling rules for protocol modbus
28/12/2019 -- 08:24:27 - <Info> -- Disabling rules for protocol dnp3
28/12/2019 -- 08:24:27 - <Info> -- Disabling rules for protocol enip
28/12/2019 -- 08:24:27 - <Info> -- No sources configured, will use Emerging Threats Open
28/12/2019 -- 08:24:27 - <Info> -- Fetching https://rules.emergingthreats.net/open/suricata-5.0.1/emerging.rules.tar.gz.
100% - 2516963/2516963
28/12/2019 -- 08:24:28 - <Info> -- Done.
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/app-layer-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/decoder-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/dhcp-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/dnp3-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/dns-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/files.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/http-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/ipsec-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/kerberos-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/modbus-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/nfs-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/ntp-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/smb-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/smtp-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/stream-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Loading distribution rule file /usr/local/share/suricata/rules/tls-events.rules
28/12/2019 -- 08:24:28 - <Info> -- Ignoring file rules/emerging-deleted.rules
28/12/2019 -- 08:24:31 - <Info> -- Loaded 26103 rules.
28/12/2019 -- 08:24:31 - <Warning> -- Disabling ja3 rules as Suricata is built without libnss.
28/12/2019 -- 08:24:31 - <Info> -- 122 ja3_hash rules disabled.
28/12/2019 -- 08:24:31 - <Info> -- Disabled 136 rules.
28/12/2019 -- 08:24:31 - <Info> -- Enabled 0 rules.
28/12/2019 -- 08:24:31 - <Info> -- Modified 0 rules.
28/12/2019 -- 08:24:31 - <Info> -- Dropped 0 rules.
28/12/2019 -- 08:24:31 - <Info> -- Enabled 59 rules for flowbit dependencies.
28/12/2019 -- 08:24:31 - <Info> -- Creating directory /var/lib/suricata/rules.
28/12/2019 -- 08:24:31 - <Info> -- Backing up current rules.
28/12/2019 -- 08:24:31 - <Info> -- Writing rules to /var/lib/suricata/rules/suricata.rules: total: 26103; enabled: 20835; added: 26103; removed 0; modified: 0
28/12/2019 -- 08:24:31 - <Info> -- Testing with suricata -T.
28/12/2019 -- 08:24:43 - <Info> -- Done.
[albert@VPN ~]$
Как мы уже видели, команда suricata-update загружает правила и проверяет их. Вы можете автоматизировать этот процесс, запустив специальное задание cron на каждый день. Кстати, обратите внимание, где находятся правила. Все они собраны в одном файле по следующему пути:
/var/lib/suricata/rules/suricata.rules
Suricata может работать в таком режиме, но управлять правилами таким образом довольно сложно. В другой статье мы расскажем о Oinkmaster — программе для управления правилами Snort (еще одного IDS), которая отлично работает и в Suricata. IDS может быть довольно «шумным» инструментом, и вы можете прийти в отчаяние, когда увидите, сколько времени уходит на его тонкую настройку. Oinkmaster может помочь в этом, поскольку вы можете отключать отдельные наборы правил, а не целые источники.
Еще одна интересная команда — suricata-update list-sources. Она показывает происхождение правил, например названия компаний, лицензии и некоторые другие параметры.
[albert@VPN /usr/local/etc/suricata]$ sudo suricata-update list-sources
28/12/2019 -- 19:50:41 - <Info> -- Using data-directory /var/lib/suricata.
28/12/2019 -- 19:50:41 - <Info> -- Using Suricata configuration /usr/local/etc/suricata/suricata.yaml
28/12/2019 -- 19:50:41 - <Info> -- Using /usr/local/share/suricata/rules for Suricata provided rules.
28/12/2019 -- 19:50:41 - <Info> -- Found Suricata version 5.0.1 at /usr/local/bin/suricata.
28/12/2019 -- 19:50:41 - <Info> -- No source index found, running update-sources
28/12/2019 -- 19:50:41 - <Info> -- Downloading https://www.openinfosecfoundation.org/rules/index.yaml
28/12/2019 -- 19:50:41 - <Info> -- Saved /var/lib/suricata/update/cache/index.yaml
Name: et/open
Vendor: Proofpoint
Summary: Emerging Threats Open Ruleset
License: MIT
Name: et/pro
Vendor: Proofpoint
Summary: Emerging Threats Pro Ruleset
License: Commercial
Replaces: et/open
Parameters: secret-code
Subscription: https://www.proofpoint.com/us/threat-insight/et-pro-ruleset
Name: oisf/trafficid
Vendor: OISF
Summary: Suricata Traffic ID ruleset
License: MIT
Name: ptresearch/attackdetection
Vendor: Positive Technologies
Summary: Positive Technologies Attack Detection Team ruleset
License: Custom
Name: scwx/malware
Vendor: Secureworks
Summary: Secureworks suricata-malware ruleset
License: Commercial
Parameters: secret-code
Subscription: https://www.secureworks.com/contact/ (Please reference CTU Countermeasures)
Name: scwx/security
Vendor: Secureworks
Summary: Secureworks suricata-security ruleset
License: Commercial
Parameters: secret-code
Subscription: https://www.secureworks.com/contact/ (Please reference CTU Countermeasures)
Name: sslbl/ssl-fp-blacklist
Vendor: Abuse.ch
Summary: Abuse.ch SSL Blacklist
License: Non-Commercial
Name: sslbl/ja3-fingerprints
Vendor: Abuse.ch
Summary: Abuse.ch Suricata JA3 Fingerprint Ruleset
License: Non-Commercial
Name: etnetera/aggressive
Vendor: Etnetera a.s.
Summary: Etnetera aggressive IP blacklist
License: MIT
Name: tgreen/hunting
Vendor: tgreen
Summary: Threat hunting rules
License: GPLv3
[albert@VPN /usr/local/etc/suricata]$
Теперь, когда мы кое-что прояснили, можно запускать Suricata без каких-либо изменений в файле suricata.yaml. Очевидно, что в зависимости от типа используемой сети потребуются корректировки. В противном случае вы будете получать слишком много предупреждений о ложных срабатываниях.
Если мы не загрузили правила до запуска Suricata, не волнуйтесь, это можно сделать сразу после запуска.
[albert@VPN /usr/local/etc/suricata]$ sudo service suricata start
Starting suricata.
[100403] 28/12/2019 -- 20:53:16 - (suricata.c:1084) <Notice> (LogVersion) -- This is Suricata version 5.0.1 RELEASE running in SYSTEM mode
[albert@VPN /usr/local/etc/suricata]$
Теперь проверим, что все работает.
[albert@VPN /usr/local/etc/suricata]$ ps aux | grep suricata
root 24659 0,0 38,7 417296 389032 - Ss 20:53 0:17,55 /usr/local/bin/suricata -D --pcap=vtnet0 --pidfile /var/run/suricata.pid -c /usr/local/etc/suricata/suricata.yaml
albert 24683 0,0 0,0 524 336 1 R+ 20:59 0:00,00 grep suricata
[albert@VPN /usr/local/etc/suricata]$
А если вам интересно, можете заглянуть в файл suricata.log, чтобы убедиться, что все прошло гладко.
[albert@VPN /usr/local/etc/suricata]$ sudo tail /var/log/suricata/suricata.log
[100380] 28/12/2019 -- 20:53:18 - (detect-engine-build.c:1416) <Info> (SigAddressPrepareStage1) -- 20838 signatures processed. 1067 are IP-only rules, 4837 are inspecting packet payload, 14705 inspect application layer, 103 are decoder event only
[100380] 28/12/2019 -- 20:53:28 - (util-runmodes.c:173) <Info> (RunModeSetLiveCaptureAutoFp) -- Using 1 live device(s).
[100427] 28/12/2019 -- 20:53:28 - (source-pcap.c:351) <Info> (ReceivePcapThreadInit) -- using interface vtnet0
[100427] 28/12/2019 -- 20:53:28 - (source-pcap.c:362) <Info> (ReceivePcapThreadInit) -- running in 'auto' checksum mode. Detection of interface state will require 1000ULL packets
[100427] 28/12/2019 -- 20:53:28 - (util-ioctl.c:112) <Info> (GetIfaceMTU) -- Found an MTU of 1500 for 'vtnet0'
[100427] 28/12/2019 -- 20:53:28 - (source-pcap.c:399) <Info> (ReceivePcapThreadInit) -- Set snaplen to 1524 for 'vtnet0'
[100380] 28/12/2019 -- 20:53:28 - (runmode-pcap.c:295) <Info> (RunModeIdsPcapAutoFp) -- RunModeIdsPcapAutoFp initialised
[100380] 28/12/2019 -- 20:53:28 - (util-conf.c:162) <Info> (ConfUnixSocketIsEnable) -- Running in live mode, activating unix socket
[100380] 28/12/2019 -- 20:53:28 - (unix-manager.c:129) <Info> (UnixNew) -- Using unix socket file '/var/run/suricata/suricata-command.socket'
[100380] 28/12/2019 -- 20:53:28 - (tm-threads.c:2165) <Notice> (TmThreadWaitOnThreadInit) -- all 2 packet processing threads, 4 management threads initialized, engine started.
[albert@VPN /usr/local/etc/suricata]$
Как видите, Suricata работает без проблем. В следующих статьях мы расскажем, как запустить службу системного журнала для отправки логов в SIEM, как управлять правилами с помощью Oinkmaster вместо обычных команд и как добавить стек ELK для графического отображения оповещений.
Краткий список того, на что следует обратить внимание при установке Suricata на FreeBSD.
– Не забудьте назначить хотя бы один интерфейс.
– Настройка локальной или глобальной сети.
– По умолчанию включены быстрый формат вывода, EVE и статистика. Активируйте все остальные необходимые параметры.
– Настройка пороговых значений. Границы срабатывания оповещения.
– Настройка классификации. Настройте приоритет любой категории, которую нужно изменить.
– Настройка ссылок. Добавьте источники или отключите те, которые вам не нужны.
– Системный журнал. Если вам нужно отправлять журналы в программное обеспечение SIEM, не забудьте включить это.
– Ротация журналов. Вы можете начать читать это руководство.
– Обновления исходного кода. Задания Cron могут справиться с этим.
The Top 20 Nmap Commands You Must Know
Вас сбивают с толку бесчисленные команды Nmap и их описания в официальной документации? Мы вас понимаем и готовы помочь. Хорошая новость в том, что не нужно знать все возможности Nmap, чтобы эффективно использовать его в повседневной работе.
Мы расскажем о 20 самых популярных командах Nmap, которые пригодятся вам в работе. Независимо от того, являетесь ли вы этичным хакером, студентом, изучающим эту сферу, или просто любителем игр в стиле «захват флага», эти 20 основных команд Nmap помогут вам практически в любой ситуации.
Вам больше не придется разбираться в тонкостях работы с Nmap. Давайте прокрутим страницу вниз и приступим к сканированию наших целей на предмет уязвимостей.
What Is Nmap?
Network Mapper (Nmap) is a command-line-based multi-platform (Windows, Mac OS X, Linux, etc.) network scanning application designed to detect hosts and services on a computer network.
Nmap is a vital tool for any student or professional in cyber security. This free and open-source utility helps you gather network information and assess the security posture of devices in the networks you scan with it. Nmap can identify a host’s operating system, running applications, open ports, firewall information, and more.
If you don’t have it yet, install Nmap here.
How To Use Nmap
The Nmap command syntax is the “nmap” keyword followed by at least two arguments:
nmap <flag(s)> <target/file>
All flags begin with one (-) or two (--) hyphens, and a single Nmap command may contain multiple flags. A target is typically an IPv4/IPv6 address or address range.
Some flags apply to files instead of targets; those are for Nmap commands that read from a file or write Nmap scan results to files.
1. List all hosts on a network
nmap -sL <target>
This type of scan (list scan) is a version of host discovery that only lists each host on the selected network (s) and doesn’t send any packets to the target hosts. By default, Nmap does a reverse DNS lookup to get host names.
2. Disable port scanning and only discover active hosts
nmap -sn <target>
nmap -sP <target>
With this option, Nmap will only print the names of hosts that have responded to the host discovery probes without any port scan. By default, this option is slightly more intrusive than the list scan. Use this option as a “ping sweep” to count available machines on a network or monitor server availability.
3. Discover the network path to a host
nmap --traceroute <target>
A packet may traverse several hosts before reaching its destination. This option allows you to trace this packet’s journey from host to host.

4. Scan for open ports and version information of services
nmap -sV <target>
When preparing for and doing pentesting, the command above helps you find open ports and determine the versions of running processes. Having accurate version numbers enables you to assess a device’s vulnerabilities.

5. Scan the ports specified
nmap -p <port number or numbers> <target>
Use this option to tell Nmap which ports you want to scan. It admits individual port numbers and ranges separated by a hyphen (e.g., 1-1023). Nmap can also scan port zero, but you must specify it explicitly.
When scanning a combination of protocols (e.g., TCP and UDP), you can specify a particular protocol by preceding the port numbers using a single-letter qualifier:
T: for TCP,U: for UDP,S: for SCTP, andP: for IP Protocol.
The qualifier lasts until you specify another qualifier. For example, the argument -p U:53,111,137,T:21-25,80,139,8080 would scan UDP ports 53, 111, and 137, and the listed TCP ports.

6. Scan all ports on a target
nmap -p- <target>
This command will scan ports numbered 1 through 65535.

7. Scan for open ports on the target
nmap --open <target>
Only show hosts with open or likely open ports, and list those ports. Here, “open ports” refer to any ports that may be open, which includes the port states “open,” “open|filtered (open or filtered),” and “unfiltered.” The Nmap official documentation has more on port states.

8. Scan for the specified number of most common ports
nmap --top-ports <number> <target>
Specify an arbitrary number of the most commonly open ports for Nmap to scan. Nmap scans the <number> highest-ratio ports found in nmap-services file after excluding all ports specified by --exclude-ports. <number> must be at least 1.

9. Perform a TCP connect scan
nmap -sT <target>
A TCP connect scan is where Nmap asks the underlying operating system to establish a connection with the target machine and port by issuing the “connect” system call. The “connect” system call is the same high-level system call that web browsers, P2P clients, and most other network-enabled applications use to establish a connection.

10. Scan for UDP ports
nmap -sU <target>
In a UDP scan, Nmap sends a UDP packet to every targeted port, usually without extra data, except for ports where a payload would increase the response rate, such as 53 and 161. If Nmap receives an error message, the port is unavailable. Avoid rushing UDP scans, as operating systems such as Linux and Solaris impose strict rate limits.

11. Enable OS detection, version detection, script scanning, and traceroute
nmap -A <target>
This option turns on operating system detection and the advanced and aggressive functions mentioned above.

12. Scan for remote operating system
nmap -O <target>
Perform remote operating system detection using TCP/IP stack fingerprinting: Nmap sends a series of TCP and UDP packets to the remote host, examines every bit in the responses, compares its nmap-os-db database of more than 2,600 known operating system fingerprints, and prints out the operating system details if there is a match.

13. Scan a target with a specific timing template
nmap -T<timing template: 0-5> <target>
Timing templates allow users to specify how aggressive they wish to be, leaving Nmap to pick the exact timing values. The template names are paranoid (0), sneaky (1), polite (2), normal (3), aggressive (4), and insane (5). Polite mode slows the scan to use less bandwidth and target machine resources to evade intrusion detection systems.

14. Increase the verbosity of the output (second level)
nmap -vv <target>
A single -v flag increases the verbosity level, causing Nmap to print more information about the scan in progress, such as open ports found in real-time and completion time estimates for scans that may take considerable time. Use it twice or more for even greater verbosity: -vv, or give a verbosity level directly, for example -v3.

15. Scan for commonly used ports and services
nmap -sC <target>
This command is equivalent to nmap --script=default <target>. It uses Nmap’s default Nmap Scripting Engine (NSE) scripts to scan for individual ports and protocols, including HTML and POP3. The scripts are mostly safe but contain intrusive processes. For example, the default script “jdwp-info” tries to exploit Java’s remote debugging port.

16. Run a script on the target
nmap --script <script type> <target>
Nmap runs a script scan using the comma-separated list of filenames, script categories, and directories.

17. Run all vulnerability scans on the target
nmap --script vuln <target>
The vuln scripts check for specific known vulnerabilities, and Nmap generally only reports results when it finds any. Examples include realvnc-auth-bypass and afp-path-vuln.

18. Read targets from a text file
nmap -iL <file>
Nmap reads a list of targets from a file as input. Entries can be in any format Nmap accepts on the command line (IP address, hostname, CIDR, IPv6, or octet ranges). Each entry must have spaces, tabs, or newlines as delimiters. The input file may contain comments that start with # and extend to the end of the line.

19. Save scan results in normal, XML, and grepable formats at once
nmap -oA <file>
Store Nmap scan results as three separate files, with <file> as the base file name and file extensions .nmap (normal), .xml (XML), and .gnmap (grepable). Like most programs, <file> may include a directory path, such as ~/folder1/foo/ on Unix or c:\folder2\bar on Windows.

20. Save the scan results to a normal format
nmap -oN <file>
Write the Nmap scan results to the given file name. Only use this command together with a valid Nmap scan command containing some <target> as shown in the example below (nmap --top-ports 10 192.168.1.1-10 -oN tenports.txt):

Conclusion
We hope this brief guide to the top 20 Nmap commands helps you in your IT or cyber security journey. Don’t forget to share this article with someone who needs it. To learn more about Nmap, check out our other articles on Nmap and courses on Nmap below. For access to over 30,000 courses and labs on all aspects of cyber security, join the StationX Master's Program today.
SpamAssassin for Sendmail on FreeBSD
This page is about how to install and use SpamAssassin for Sendmail on FreeBSD. Tested on FreeBSD 14.3.
What is SpamAssassin?
SpamAssassin is a filter system, that can detect spam mail. SpamAssassin is an open source project, that has been offered by Apache since 2001. The filter can be implemented as a mail filter for mail servers, such as Sendmail. Such a mail filter is also known as a milter. Unfortunately, the official documentation and the FreeBSD install instructions are rather old and outright wrong.
https://spamassassin.apache.org
How does SpamAssassin work?
SpamAssassin reads the headers of email and use a set of rules to detect known spam characteristics and apply a spam score to the headers. Email clients can then use this score to identify the email as spam and move it to another inbox for spam or trash.
Below, is an example of SpamAssassin score headers in a filtered message, that spoofed a Google GMail account and presented a crypto extortion scheme.
X-Spam-Checker-Version: SpamAssassin 4.0.2 (2025-08-27) on wopr
X-Spam-Flag: YES
X-Spam-Level: ********************
X-Spam-Status: Yes, score=20.7 required=3.8 tests=BITCOIN_EXTORT_01,
BITCOIN_SPAM_05,DKIM_ADSP_CUSTOM_MED,FORGED_GMAIL_RCVD,
FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,GB_HASHBL_BTC,HELO_MISC_IP,
NML_ADSP_CUSTOM_MED,RCVD_IN_BL_SPAMCOP_NET,RCVD_IN_DNSWL_BLOCKED,
RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_L5,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,
RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED,
RCVD_IN_ZEN_BLOCKED_OPENDNS,RDNS_NONE,SPOOFED_FREEMAIL,
SPOOFED_FREEMAIL_NO_RDNS,SPOOF_GMAIL_MID,SUBJ_ALL_CAPS,URIBL_BLOCKED,
URIBL_DBL_BLOCKED_OPENDNS autolearn=spam autolearn_force=no
version=4.0.2
Install SpamAssassin on FreeBSD.
# pkg install spamass-milter
Check the default configuration.
# cat /usr/local/etc/mail/spamassassin/init.pre | grep -v '^#' | grep -v '^$'
enable_compat welcomelist_blocklist
loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
# cat /usr/local/etc/mail/spamassassin/local.cf | grep -v '^#' | grep -v '^$'
ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
endif # Mail::SpamAssassin::Plugin::Shortcircuit
Update spam detection rules.
# sa-update && sa-compile
Test SpamAssassin with ham and spam manually.
You can filter mail folders through SpamAssassin and inspect the results in the mail client. In this example, ham and spam mail folders for Alpine is used for testing SpamAssassin manually. Alpine use the MBOX format.
$ ls mail
Ham Spam
$ spamassassin --mbox < mail/Ham > mail/SpamAssassin
$ spamassassin --mbox < mail/Spam >> mail/SpamAssassin
$ alpine
The spam mail folder can later be used for training SpamAssassin, which can scan it regularly.
You can also save ham and spam messages as plain-text files and filter those through SpamAssassin.
Settle on a maximum spam score.
Settle on a spam score for future use in the configuration. The default is 5. If DNS block lists are unavailable due to IP address range block or rate limiting, which is common, I recommend a score closer to 3,8.
Configure SpamAssassin.
If you want SpamAssassin to learn from human marked spam, then create a directory for such database.
# mkdir -m 700 -p /usr/local/etc/spamassassin
# nano /usr/local/etc/mail/spamassassin/init.pre
# cat /usr/local/etc/mail/spamassassin/init.pre | grep -v '^#' | grep -v '^$'
loadplugin Mail::SpamAssassin::Plugin::URIDNSBL
enable_compat welcomelist_blocklist
# nano /usr/local/etc/mail/spamassassin/local.cf
# cat /usr/local/etc/mail/spamassassin/local.cf | grep -v '^#' | grep -v '^$'
score RDNS_NONE 2.8
required_score 3.2
use_bayes 1
bayes_auto_learn 1
body_part_scan_size 200000
rawbody_part_scan_size 2000000
ifplugin Mail::SpamAssassin::Plugin::Shortcircuit
bayes_path /usr/local/etc/spamassassin/bayes
bayes_auto_learn 1
endif # Mail::SpamAssassin::Plugin::Shortcircuit
If DNS block lists are unavailable due to IP address range block or rate limiting, which is common, then you might want do disable the use of DNS. This is probably especially a good practice for higher volume mail servers to maintain speed.
Test Bayes learning.
Test the Bayes learning and the new settings. It is important, that the mail box format is indicated.
# sa-learn --spam --mbox /home/lightman/mail/Spam
Configure FreeBSD to start SpamAssassin.
If the spam score reaches 10, then the message will be rejected at the port.
# nano /etc/rc.conf
# grep spam /etc/rc.conf
spamd_enable="YES"
spamd_flags="-c --max-children=10"
spamass_milter_enable="YES"
spamass_milter_socket="/var/run/spamd/spamass-milter.sock"
spamass_milter_flags="-r 10 -f -u spamd -p ${spamass_milter_socket}"
# find /usr/local/etc/rc.d -name '*spam*'
/usr/local/etc/rc.d/sa-spamd
/usr/local/etc/rc.d/spamass-milter
# service sa-spamd start
# service spamass-milter start
# ls -l /var/run/spamd
total 1
srw-r--r-- 1 root wheel 0 Mar 12 02:09 spamass-milter.sock
-rw-r--r-- 1 root spamd 5 Mar 9 18:19 spamd.pid
Configure Sendmail to use SpamAssassin milter on FreeBSD.
# cd /etc/mail
# nano $(hostname).mc
# grep spamassassin $(hostname).mc
INPUT_MAIL_FILTER(`spamassassin',`S=local:/var/run/spamd/spamass-milter.sock, F=T, T=C:15m;S:4m;R:4m;E:10m')
# make && make install
# service sendmail restart
# cd
Configure CRON for SpamAssassin.
# nano bin/spamassassin-update
# cat bin/spamassassin-update
#!/bin/sh
sa-update && sa-compile
service sa-spamd restart
service spamass-milter restart
sa-learn --spam /home/lightman/mail/Spam
# chmod 700 bin/spamassassin-update
# spamassassin-update
# nano /etc/crontab
# grep spam /etc/crontab
37 13 * * 5 root /root/bin/spamassassin-update >/dev/null 2>&1
# service cron restart
Configure Dovecot IMAP server for handling spam.
I am still testing this feature. If you have tips, let me know. Thanks.
If the server runs Dovecot IMAP server, or a similar IMAP server, it might support automatic handling of spam mail by reading mail headers, creating user spam folders and moving spam into those. The Pigeonhole Sieve plug-in for Dovecot can do this.
# pkg install dovecot-pigeonhole
Create the global script and compile it.
# mkdir -p /usr/local/etc/dovecot/sieve
# nano /usr/local/etc/dovecot/sieve/global.sieve
# cat /usr/local/etc/dovecot/sieve/global.sieve
require ["fileinto", "imap4flags"];
if header :contains "X-Spam-Flag" "YES" {
fileinto "Spam";
stop;
}
# sievec /usr/local/etc/dovecot/sieve/global.sieve
Configure Dovecot.
# nano /usr/local/etc/dovecot/dovecot.conf
# cat /usr/local/etc/dovecot/dovecot.conf | grep -v '^#' | grep -v '^$' | tail -n 6
protocol lda {
mail_plugins = sieve
}
plugin {
sieve_global_path = /usr/local/etc/dovecot/sieve/global.svbin
}
# service dovecot restart
Configure Alpine or other mail client for handling spam.
You can now configure your mail client for handling spam. The spam features of mail clients include looking in mail headers and using this information to move the mail to a spam folder or deleting it outright.
In Alpine, you can go to “Setup”, “Rules” and “Filters”. Here, you can create filtering rules. Create a new filter. If it has an “X-Spam-Status” mail header and the the value is “Yes”, then move the message to the “Spam” folder. You can also use other spam headers and options.
X-Spam-Checker-Version: SpamAssassin 4.0.2 (2025-08-27) on wopr
X-Spam-Flag: YES
X-Spam-Level: ********************
X-Spam-Status: Yes, score=20.7 required=3.8 tests=BITCOIN_EXTORT_01,
BITCOIN_SPAM_05,DKIM_ADSP_CUSTOM_MED,FORGED_GMAIL_RCVD,
FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,GB_HASHBL_BTC,HELO_MISC_IP,
NML_ADSP_CUSTOM_MED,RCVD_IN_BL_SPAMCOP_NET,RCVD_IN_DNSWL_BLOCKED,
Check SpamAssassin related entries in the system mail log.
Check for issues by following and scanning the system mail log, investigate specific messages and adjust configuration as necessary.
# tail -f /var/log/maillog
# grep -e spamc -e spamass /var/log/maillog
More about SpamAssassin.
SendMail, Dovecot, SpamAssassin, RainLoop, Sieve, OpenDkim, SPF, DMARC on FreeBSD
In this article, we will learn how to set up a complete email system. We will be able to send/receive emails, access them through a web interface, filter spam, define Sieve filters, and sign outgoing emails using DKIM.
The technologies used for this are:
- SendMail : Sends and receives emails
- Dovecot : Allows access to stored emails through the web interface
- SpamAssassin : Filters incoming emails based on certain rules
- RainLoop : Web interface for accessing emails
- Sieve : Email filtering/categorization system
This article is quite extensive, so I have divided it into several sections:
- SendMail
- Dovecot
- RainLoop
- SpamAssassin
- SPF
- DKIM
- DMARC
- SSL RainLoop
- SSL SendMail
- Reverse DNS
- Account maintenance
- Debug
SendMail
The first step will be to make sure our server knows its own hostname:
127.0.0.1 HellStorm HellStorm.alfaexploit.com mail.alfaexploit.com localhost localhost.my.domain
SendMail is installed by default on FreeBSD, we start the service:
sysrc sendmail_msp_queue_enable=yes
service sendmail start
We check that we can access it over the network:
220 HellStorm.alfaexploit.com ESMTP Sendmail 8.16.1/8.16.1; Sun, 1 Jan 2023 17:39:07 +0100 (CET)
In the magnificent FreeBSD handbook, we can find a guide from which I have extracted the following information.
Access permissions are filtered by origin in the file: /etc/mail/access
OK: Permitiremos la entrada del mail siempre y cuando el destino sea un dominio local(/etc/mail/local-host-names)
RELAY: Permitiremos el envío de mails a dominios de terceros a través de nuestro server
ERROR: Denegaremos el envío de mails con el mensaje indicado
SKIP: Denegaremos el envío de mails sin avisar al cliente que el email ha sido destruido
QUARANTINE: El mail se guardará en el servidor local pero no se enviará a su destino, el cliente recibirá una explicación de porque su email ha sido retenido
#From:cyberspammer.com ERROR:"550 We don't accept mail from spammers"
#From:okay.cyberspammer.com OK
#Connect:sendmail.org RELAY
#To:sendmail.org RELAY
#Connect:128.32 RELAY
#Connect:128.32.2 SKIP
#Connect:IPv6:1:2:3:4:5:6:7 RELAY
#Connect:suspicious.example.com QUARANTINE:Mail from suspicious host
#Connect:[127.0.0.3] OK
#Connect:[IPv6:1:2:3:4:5:6:7:8] OK
By default, the OK policy is applied from any IP as long as the destination is local or listed in /etc/mail/local-host-names.
For example, if we try to send an email to kr0m@alfaexploit.com , access will be denied, but for kr0m@localhost, it will be allowed:
Trying 192.168.69.17...
Connected to 192.168.69.17.
Escape character is '^]'.
220 HellStorm.alfaexploit.com ESMTP Sendmail 8.16.1/8.16.1; Sun, 1 Jan 2023 17:39:07 +0100 (CET)
ehlo 192.168.69.17
250-HellStorm.alfaexploit.com Hello [192.168.69.17], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-STARTTLS
250-DELIVERBY
250 HELP
mail from: test@kr0m.com
250 2.1.0 test@kr0m.com... Sender ok
rcpt to: kr0m@alfaexploit.com
250 2.1.5 kr0m@alfaexploit.com... Recipient ok
data
354 Enter mail, end with "." on a line by itself
prueba00
.
250 2.0.0 301Gd7Qr028498 Message accepted for delivery
quit
221 2.0.0 HellStorm.alfaexploit.com closing connection
Connection closed by foreign host.
In the telnet session, there will be no error, but in the logs, we can see that the mail has not been sent:
Jan 1 17:41:05 HellStorm sm-mta[32142]: 301Gd7Qr028498: to=kr0m@alfaexploit.com, delay=00:00:12, xdelay=00:00:00, mailer=esmtp, pri=30009, relay=alfaexploit.com., dsn=5.3.5, stat=Local configuration error
However, if the recipient is kr0m@localhost, we will see the delivery:
Jan 1 17:45:31 HellStorm sm-mta[35699]: 301Gj39N027210: to=kr0m@localhost, delay=00:00:18, xdelay=00:00:00, mailer=local, pri=30396, relay=local, dsn=2.0.0, stat=Sent
The user kr0m can read this last email:
Mail version 8.1 6/6/93. Type ? for help.
"/var/mail/kr0m": 1 message 1 new
>N 1 test@kr0m.com Sun Jan 1 17:45 13/455
& 1
Message 1:
From test@kr0m.com Sun Jan 1 17:45:31 2023
Date: Sun, 1 Jan 2023 17:45:03 +0100 (CET)
From: test@kr0m.com
To: undisclosed-recipients:;
prueba01
&
We add alfaexploit.com to the group of local domains:
alfaexploit.com
We restart SendMail:
We perform the test again:
Trying 192.168.69.17...
Connected to 192.168.69.17.
Escape character is '^]'.
220 HellStorm.alfaexploit.com ESMTP Sendmail 8.16.1/8.16.1; Sun, 1 Jan 2023 17:48:01 +0100 (CET)
ehlo 192.168.69.17
250-HellStorm.alfaexploit.com Hello [192.168.69.17], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-STARTTLS
250-DELIVERBY
250 HELP
mail from: test@kr0m.com
250 2.1.0 test@kr0m.com... Sender ok
rcpt to: kr0m@alfaexploit.com
250 2.1.5 kr0m@alfaexploit.com... Recipient ok
data
354 Enter mail, end with "." on a line by itself
prueba02
.
250 2.0.0 301Gm17S090416 Message accepted for delivery
quit
221 2.0.0 HellStorm.alfaexploit.com closing connection
Connection closed by foreign host.
We can see that now the delivery has been made correctly:
Jan 1 17:48:28 HellStorm sm-mta[13349]: 301Gm17S090416: to=kr0m@alfaexploit.com, delay=00:00:12, xdelay=00:00:00, mailer=local, pri=30402, relay=local, dsn=2.0.0, stat=Sent
We read the mail:
Mail version 8.1 6/6/93. Type ? for help.
"/var/mail/kr0m": 1 message 1 new
>N 1 test@kr0m.com Sun Jan 1 17:48 13/461
& 1
Message 1:
From test@kr0m.com Sun Jan 1 17:48:28 2023
Date: Sun, 1 Jan 2023 17:48:01 +0100 (CET)
From: test@kr0m.com
To: undisclosed-recipients:;
prueba02
&
NOTE: By adding the domain alfaexploit.com to local-host-names, it is equivalent to creating email accounts for all users in the operating system. For larger environments, we should look for some kind of integration of virtual users from a MySQL, LDAP, or similar database.
The aliases file defines email addresses that expand to other users, external addresses, files, programs, or other aliases. In my case, we leave it as it comes by default, but root will be an alias to kr0m@alfaexploit.com :
MAILER-DAEMON: postmaster
postmaster: root
_dhcp: root
_pflogd: root
auditdistd: root
bin: root
bind: root
daemon: root
games: root
hast: root
kmem: root
mailnull: postmaster
man: root
news: root
nobody: root
operator: root
pop: root
proxy: root
smmsp: postmaster
sshd: root
system: root
toor: root
tty: root
usenet: news
uucp: root
abuse: root
security: root
ftp: root
ftp-bugs: ftp
root: kr0m@alfaexploit.com
We regenerate the hash of the file:
To convert an email address to a mailbox, we will use the virtusertable file. The destination can be local mailboxes, remote mailboxes, aliases defined in /etc/mail/aliases, or files. In my case, it is not necessary to generate the file since I do not use these functionalities.
root@example.com root
postmaster@example.com postmaster@noc.example.net
@example.com joe
NOTE: Entries are checked in the order they appear in the configuration file. In this example, a generic entry has been configured for the example.com domain. If the recipient is anyone other than root or postmaster, it will be sent to joe.
If we have generated the /etc/mail/virtusertable file, we refresh the hash of the file and restart SendMail:
service sendmail restart
If we need an external computer to be able to use our server to send emails, we must indicate the IPs/DNS in the relay-domains file. In my case, it is not necessary:
service sendmail restart
We can find the documentation on SendMail configuration in the file: /usr/share/sendmail/cf/README
Dovecot
With SendMail, we can send and receive emails but not read the received ones. For this, we need an IMAP server:
We copy the example configuration files:
We remove the SSL configuration since we will access emails through the web interface, the only point of contact with the outside world will be through SendMail to send/receive emails.
ssl = no
#ssl_cert = </etc/ssl/certs/dovecot.pem
#ssl_key = </etc/ssl/private/dovecot.pem
The web interface only accesses Dovecot via IMAP:
protocols = imap lmtp
We bind Dovecot to the server’s IP:
listen = 192.168.69.17
We tell Dovecot where to organize Sent/Drafts/Spam/Trash/Archive emails and where to look for received emails:
mail_location = mbox:~/mboxDir:INBOX=/var/mail/%u
mail_privileged_group = mail
We adjust the permissions of the /var/mail directory:
We create the email directories in the user’s home directory:
su -l kr0m
mkdir mboxDir
chmod 700 mboxDir
touch mboxDir/Sent
touch mboxDir/Drafts
touch mboxDir/Spam
touch mboxDir/Trash
touch mboxDir/Archive
chmod 600 mboxDir/Sent
chmod 600 mboxDir/Drafts
chmod 600 mboxDir/Spam
chmod 600 mboxDir/Trash
chmod 600 mboxDir/Archive
exit
We start the service:
service dovecot start
RainLoop
We install RainLoop, a web interface that will allow us to read and send emails:
pkg install -y unzip curl wget socat
pkg install -y php82 php82-mbstring php82-tokenizer php82-pdo php82-pdo_mysql php82-phar php82-filter php82-zlib php82-dom php82-xml php82-xmlwriter php82-xmlreader php82-pecl-imagick php82-curl php82-session php82-ctype php82-iconv php82-gd php82-simplexml php82-zip php82-filter php82-tokenizer php82-calendar php82-fileinfo php82-intl php82-phar php82-soap php82-opcache php82-mysqli php82-bcmath php82-gmp
cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
We adjust some parameters in php.ini to be able to send larger attachments:
date.timezone = Europe/Madrid
upload_max_filesize = 25M
post_max_size = 25M
We start the php-fpm service:
service php-fpm start
We install MySQL to store user contacts:
We start the service:
service mysql-server start
We configure the database:
We create the configuration file to be able to log in without typing the password every time:
[client]
user = root
password = XXXXXXXXX
We secure access:
We create the database and a user with access to it:
CREATE DATABASE rainloop;
CREATE USER rainloop@'192.168.69.17' IDENTIFIED WITH mysql_native_password BY 'XXXXXXXXX';
GRANT ALL PRIVILEGES ON rainloop.* TO rainloop@'192.168.69.17';
FLUSH PRIVILEGES;
exit;
We install Nginx:
We start the service:
service nginx start
We create a vhost for RainLoop:
server {
listen 80;
server_name mail.alfaexploit.com;
root /usr/local/www/rainloop;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ^~ /data {
deny all;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_keep_conn on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}
We include the vhost in the general Nginx configuration, add the include and increase the maximum body size in the http{} section:
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 25M;
include rainloop.conf;
We restart the service:
We download and install RainLoop:
cd /usr/local/www/rainloop
wget http://www.rainloop.net/repository/webmail/rainloop-latest.zip
unzip rainloop-latest.zip -d /usr/local/www/rainloop
rm rainloop-latest.zip
chown -R www:www /usr/local/www/rainloop
We access the administration panel:
http://mail.alfaexploit.com/?admin
admin
12345
The first step is to change the password.

We configure access to the database where user contacts will be saved:
Contacts -> MySQL:
mysql:host=192.168.69.17;port=3306;dbname=rainloop
rainloop
XXXXXXXXX

We click on the Test button to check the correct access.
We tell the login to automatically add @alfaexploit.com to the user:

We add the domain:
Domains -> alfaexploit.com
IMAP
X.X.X.X
143
SMTP
X.X.X.X
25
Use short login
NOTE: Use short login -> Since RainLoop will automatically add @alfaexploit.com as we have indicated in the previous step.

We access the email account as a user:
http://mail.alfaexploit.com
kr0m
PASSWORD-SO
We configure the directories where to save the emails:
Bottom gear -> Folders
System Folders
We assign the directory to each Folder, we can click on the eye for Deleted items and Junk emails so they don’t show up.

We perform tests of sending and receiving emails and check the associated logs:
Sieve is an email classification service, through filters defined by the sysadmin/user we can classify incoming emails, for example based on certain headers, origins, this is very useful if we combine SpamAssassin with Sieve since SpamAssassin will mark emails with their headers and through Sieve we will filter based on these.
SpamAssassin
We install the Spamassassin milter:
We enable the spamd service indicating from which IPs it will accept connections, in this case the server’s own IP:
sysrc spamd_flags="-u spamd -H /var/spool/spamd -A 192.168.69.17"
We enable the milter indicating where it should generate the Unix socket:
sysrc spamass_milter_socket="/var/run/spamass-milter.sock"
The rest of the options that we can configure can be seen in:
: ${spamass_milter_enable="NO"}
: ${spamass_milter_socket="/var/run/spamass-milter.sock"}
: ${spamass_milter_flags="-f -p ${spamass_milter_socket} ${spamass_milter_localflags}"}
: ${spamass_milter_socket_owner="root"}
: ${spamass_milter_socket_group="wheel"}
: ${spamass_milter_socket_mode="644"}
We update the SpamAssassin rules and compile them:
sa-compile
We start SpamAssassin and SpamAssassin-milter:
service spamass-milter start
We generate a base configuration file for SendMail:
make
The above command will have generated a file with the name of the host, we define the milter at the end of the file:
MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')
define(`confINPUT_MAIL_FILTERS', `spamassassin')
We compile the new configuration to M4:
We update the SendMail configuration with ours:
cp HellStorm.cf sendmail.cf
We restart the service:
We put a tail to see the logs, some errors will appear since SpamAssassin is not yet fully configured:
We send ourselves an email and we can see in the logs how spamd intercepts the incoming email and assigns it a score:
Jan 1 19:42:55 HellStorm spamd[41333]: spamd: result: . -5 - DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,HTML_MESSAGE,RCVD_IN_DNSWL_HI,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,TVD_SPACE_RATIO scantime=0.3,size=2793,user=root,uid=58,required_score=5.0,rhost=192.168.69.17,raddr=192.168.69.17,rport=50983,mid=<CA+SWLLzfBAmUfQQTmiFejuKVkaRpkZKdd7ECv3qXLrPaW-QJAQ@mail.gmail.com>,autolearn=unavailable autolearn_force=no
If we look at the email in raw, we will see the headers added by SpamAssassin:
X-Spam-Status: No, score=-5.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID,
DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,HTML_MESSAGE,
RCVD_IN_DNSWL_HI,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS,
TVD_SPACE_RATIO autolearn=unavailable autolearn_force=no version=3.4.6
X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on
HellStorm.alfaexploit.com
NOTE: If we want to mark a specific domain or address as spam, we add it to the end of the local.cf file of SpamAssassin:
blacklist_from *@126.com
blacklist_from hacker@xxxxxxx.com
Restart the service:
If you see errors like this in the logs:
Oct 21 22:21:19 DrWho spamd[3572]: plugin: eval failed: bayes: (in learn) locker: safe_lock: cannot create tmp lockfile /root/.spamassassin/bayes.lock.DrWho.alfaexploit.com.3572 for /root/.spamassassin/bayes.lock: Permission denied
You must define the location of the database of SpamAssasin to a location where the user spamd has access:
bayes_path /var/spamassassin/bayes_db/bayes
bayes_file_mode 0775
Create the directory:
Assign the permissions mentioned in the documentation:
chown root:spamd /var/spamassassin/bayes_db/
Restart the service:
Now that we have marked our emails, we will have to categorize them according to the reputation assigned by SpamAssassin. For this, we will use Sieve, which will allow us to configure filters based on many aspects of the email, but to use it, we must make SendMail deliver local mails via LMTP to Dovecot:
Replace:
FEATURE(local_lmtp)
With:
FEATURE(local_lmtp,`[IPC]',`FILE /var/run/dovecot/lmtp')dnl
Recompile the configuration:
Replace the current configuration with ours:
Restart the service:
We install the necessary package for Dovecot to support Sieve:
We enable it as a protocol:
protocols = imap lmtp sieve
And as an LMTP plugin:
protocol lmtp {
mail_plugins = $mail_plugins sieve
}
In the plugin configuration, we set where the users’ Sieve filters will be stored and which filter should be applied. We also indicate a filter that will always be executed before those defined by the user, ideal for sysadmins to perform their pre-user filtering:
plugin {
sieve = file:~/.sieve;active=~/.sieve/dovecot.sieve
sieve_before = file:/var/lib/dovecot/default.sieve
}
When scripting in Sieve, the required libraries must be indicated at the top and then used throughout the rest of the script:
require ["fileinto"];
if header :contains "X-Spam-Flag" "YES" {
fileinto "Spam";
stop;
}
We compile the script:
We create the Sieve scripts directory in the user’s home directory:
mkdir /home/kr0m/.sieve
exit
We check that Dovecot’s LMTP module has loaded the Sieve plugin:
mail_plugins = sieve
We restart Dovecot:
We manually connect to the Sieve-manager:
Trying 127.0.0.1...
Connected to HellStorm.
Escape character is '^]'.
"IMPLEMENTATION" "Dovecot Pigeonhole"
"SIEVE" "fileinto reject envelope encoded-character vacation subaddress comparator-i;ascii-numeric relational regex imap4flags copy include variables body enotify environment mailbox date index ihave duplicate mime foreverypart extracttext"
"NOTIFY" "mailto"
"SASL" "PLAIN"
"VERSION" "1.0"
OK "Dovecot ready."
The sieve_before script (/var/lib/dovecot/default.sieve) that moves emails marked as spam by SpamAssassin to the Spam directory should already be running.
We access the RainLoop administration panel and enable Sieve for our domain:
http://mail.alfaexploit.com/?admin
admin
XXXXXXX
Domains -> alfaexploit.com

Sieve configuration:
Allow sieve scripts
Allow custom user script
Server: 192.168.69.17 Port: 4190
Secure: None

Click on the Update button.
Access with the normal user account and configure a filter:
Configuration -> Filters

NOTE: We must filter network traffic through a firewall to prevent unauthorized access to Sieve(4190)/SpamAssassin(783) services.
SPF
Through SPF we will indicate which servers are authorized to send emails from our domain, this is nothing more than DNS entries indicating the IPs, in my case it would be as follows.
A 92.176.161.228 mail.alfaexploit.com
MX mail.alfaexploit.com
TXT spf2.0/mfrom,pra a mx -all
TXT v=spf1 mx -all
NOTE: The first entry is a simple A entry resolving mail.alfaexploit.com to the IP, the second indicates which server(MX) is responsible for receiving emails, the third indicates that the IP of the server indicated in the MX record of the domain is authorized to send emails and the fourth does the same as the third but it is spf1.
SPF supports two types of fails:
- hardfails: Any email coming from an unauthorized IP will be deleted, this behavior is indicated by entering -all in the DNS entry.
- softfail: Any email coming from an unauthorized IP will be marked as Spam, this behavior is indicated by entering ~all in the DNS entry.
We check that all entries resolve as they should:
0 mail.alfaexploit.com.
79.116.145.12
"spf2.0/mfrom,pra a mx ~all"
"v=spf1 mx ~all"
DKIM
Through DKIM we will be able to sign outgoing emails with a private key so that the recipient can verify that the email was sent from our server and not from another pretending to be us, the key to this process is to publish the pubkey in a DNS entry so that the recipient can obtain it and thus verify the authenticity of the email.
We install the OpenDkim milter:
We enable the service:
We generate the private-key/pub-key pair:
cd /var/db/dkim
opendkim-genkey -s smtp -d alfaexploit.com
NOTE: The -s smtp parameter is just the selector, it is a string with which the DNS query will have to be made to obtain the value of the pubkey.
The OpenDkim configuration would be as follows:
Domain alfaexploit.com
KeyFile /var/db/dkim/smtp.private
InternalHosts /var/db/dkim/internal_hosts
Selector smtp
Socket local:/var/run/milteropendkim/milter-opendkim.sock
Syslog Yes
We adjust the permissions so that OpenDkim can generate the unix socket file:
We define which IPs can connect to the milter, in my case the IP of the server itself:
192.168.69.17
We start the service:
We configure SendMail to use the new milter:
MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')
MAIL_FILTER(`dkim-filter', `S=/var/run/milteropendkim/milter-opendkim.sock, F=T, T=R:2m')
define(`confINPUT_MAIL_FILTERS', `spamassassin, dkim-filter')
We compile and update the configuration:
cp HellStorm.cf sendmail.cf
We restart the service:
If we send an email, we will see that they are signed.
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=alfaexploit.com; s=smtp; t=1672616405; bh=G1jVXBHX92kUkSHkyQ6MzL5LYYAW8yEUeAJmHQPkbeQ=; h=Date:From:Subject:To; b=u49nGRAoDNY0tWxab5lbE7GSDvJ796snMaJbMDKA9+Iz5NSxeqGbfCCswsDo+yuZ8
96TXfWXO0tzo0kjSqCcrm5s2gdhNPeG9Q2+eTjs71pXJS7sonqw4AncamPQl2kOx3i
ZFCq67c/BK+gup601dSdrurFVLt57jpgUcOwD9Kc=
But we must publish our pubkey on the Internet so that servers that receive our emails can verify that the email signature was generated with the private key corresponding to the published pubkey:
smtp._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+6l6oAODR0hUzsHqb2StBHVKlXdemKhbRNaCNDdoqMH9yi7TOfYeO4Ko5Wnp4Gq449ur8h14Afvgji24DC6GCBNbHCcDh67M9HZW28BJPRoaaIInQHzt5+9oVa9BREliNa50gfbwmNS/WnrZ6o3X94xCCbb6xcdQJC6FCrGoyMQIDAQAB" ) ; ----- DKIM key smtp for alfaexploit.com
The TXT record will have the following content:
v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+6l6oAODR0hUzsHqb2StBHVKlXdemKhbRNaCNDdoqMH9yi7TOfYeO4Ko5Wnp4Gq449ur8h14Afvgji24DC6GCBNbHCcDh67M9HZW28BJPRoaaIInQHzt5+9oVa9BREliNa50gfbwmNS/WnrZ6o3X94xCCbb6xcdQJC6FCrGoyMQIDAQAB
The final DNS entry should contain the selector (smtp):
TXT smtp._domainkey v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+6l6oAODR0hUzsHqb2StBHVKlXdemKhbRNaCNDdoqMH9yi7TOfYeO4Ko5Wnp4Gq449ur8h14Afvgji24DC6GCBNbHCcDh67M9HZW28BJPRoaaIInQHzt5+9oVa9BREliNa50gfbwmNS/WnrZ6o3X94xCCbb6xcdQJC6FCrGoyMQIDAQAB
If we consult the entry, it returns the configured pubkey:
"v=DKIM1;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+6l6oAODR0hUzsHqb2StBHVKlXdemKhbRNaCNDdoqMH9yi7TOfYeO4Ko5Wnp4Gq449ur8h14Afvgji24DC6GCBNbHCcDh67M9HZW28BJPRoaaIInQHzt5+9oVa9BREliNa50gfbwmNS/WnrZ6o3X94xCCbb6xcdQJC6FCrGoyMQIDAQAB;t=s;"
DMARC
DMARC are DNS records where we indicate to email servers what to do when the incoming email does not pass SPF/DKIM. Of course, each ISP can then respect what is indicated in the DMARC or not.
TXT _dmarc.alfaexploit.com
v=DMARC1\; p=reject\; rua=mailto:kr0m@alfaexploit.com\; ruf=mailto:kr0m@alfaexploit.com\; pct=100
Let’s break down each of the fields:
- v: Protocol version
- p: Indicates the DMARC policy to follow
- rua: Where notifications will be sent when an email that does not pass SPF/DKIM is received
- ruf: Where a copy of the spam emails will be sent when an email that does not pass SPF/DKIM is received
- pct: What percentage of received emails should have the DMARC filter applied
The possible policies are:
- none: Treat the email without applying DMARC
- quarantine: Accept the email but treat it as spam
- reject: Reject the email
We check that the DNS record responds with the correct information:
"v=DMARC1; p=reject; rua=mailto:kr0m@alfaexploit.com; ruf=mailto:kr0m@alfaexploit.com; pct=100"
We can see how Google approves the three checks:

SSL RainLoop
If we are going to access the RainLoop interface from the Internet, it is better to do it through SSL.
To do this, we will reconfigure Nginx by temporarily removing the include of the rainloop.conf file:
...
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 25M;
#include rainloop.conf;
...
We restart the service:
We install ACME:
We issue the certificate request:
[Mon Jan 2 08:02:05 CET 2023] Your cert is in: /root/.acme.sh/mail.alfaexploit.com/mail.alfaexploit.com.cer
[Mon Jan 2 08:02:05 CET 2023] Your cert key is in: /root/.acme.sh/mail.alfaexploit.com/mail.alfaexploit.com.key
[Mon Jan 2 08:02:05 CET 2023] The intermediate CA cert is in: /root/.acme.sh/mail.alfaexploit.com/ca.cer
[Mon Jan 2 08:02:05 CET 2023] And the full chain certs is there: /root/.acme.sh/mail.alfaexploit.com/fullchain.cer
We include rainloop.conf again:
...
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 25M;
#include rainloop.conf;
...
But this time it will only listen on port 443, and since my traffic goes through a traffic balancer, I use proxy_protocol :
server {
listen 443 ssl proxy_protocol;
server_name mail.alfaexploit.com;
set_real_ip_from 192.168.69.11;
real_ip_header proxy_protocol;
root /usr/local/www/rainloop;
ssl_certificate "/root/.acme.sh/mail.alfaexploit.com/fullchain.cer";
ssl_certificate_key "/root/.acme.sh/mail.alfaexploit.com/mail.alfaexploit.com.key";
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ^~ /data {
deny all;
}
location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_keep_conn on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}
We restart the service:
SSL Sendmail
By default, SendMail comes with SSL enabled with self-signed certificates:
dnl Enable STARTTLS for receiving email.
define(`CERT_DIR', `/etc/mail/certs')dnl
define(`confSERVER_CERT', `CERT_DIR/host.cert')dnl
define(`confSERVER_KEY', `CERT_DIR/host.key')dnl
define(`confCLIENT_CERT', `CERT_DIR/host.cert')dnl
define(`confCLIENT_KEY', `CERT_DIR/host.key')dnl
define(`confCACERT', `CERT_DIR/cacert.pem')dnl
define(`confCACERT_PATH', `CERT_DIR')dnl
define(`confDH_PARAMETERS', `CERT_DIR/dh.param')dnl
To configure ours, we will first make a copy of the originals:
The certificates are obtained on the web server, so we synchronize them using the following script:
#!/usr/local/bin/bash
function sendTelegram {
message=${@:1}
#curl -s -X POST https://api.telegram.org/botAPI_KEY/sendMessage -d chat_id=CHAT_ID -d text="$message"
curl -s -X POST https://api.telegram.org/bot535179217:AAGXRe1df_1WNgqxOCfC8VrCNKGqouhslLw/sendMessage -d chat_id=30418601 -d text="$message"
}
if [ -f "/etc/mail/certs/alfaexploit.com/fullchain.cer" ] && [ -f "/etc/mail/certs/alfaexploit.com/alfaexploit.com.key" ] && [ -f "/etc/mail/certs/alfaexploit.com/ca.cer" ]; then
mv /etc/mail/certs/alfaexploit.com/fullchain.cer /etc/mail/certs/alfaexploit.com/fullchain.cer.ori
mv /etc/mail/certs/alfaexploit.com/alfaexploit.com.key /etc/mail/certs/alfaexploit.com/alfaexploit.com.key.ori
mv /etc/mail/certs/alfaexploit.com/ca.cer /etc/mail/certs/alfaexploit.com/ca.cer.ori
PREV_CERTS_FOUND=1
else
PREV_CERTS_FOUND=0
fi
if [ ! -d /etc/mail/certs/alfaexploit.com/ ]; then
mkdir /etc/mail/certs/alfaexploit.com/
fi
fetch http://admin:XXXX@192.168.69.19:8080/fullchain.cer -o /etc/mail/certs/alfaexploit.com/fullchain.cer
if [ $? -ne 0 ]; then
sendTelegram "$HOSTNAME-SMTP/SSL: Cant download http://admin:XXXX@192.168.69.19:8080/fullchain.cer"
fi
fetch http://admin:XXXX@192.168.69.19:8080/alfaexploit.com.key -o /etc/mail/certs/alfaexploit.com/alfaexploit.com.key
if [ $? -ne 0 ]; then
sendTelegram "$HOSTNAME-SMTP/SSL: Cant download http://admin:XXXX@192.168.69.19:8080/alfaexploit.com.key"
fi
fetch http://admin:XXXX@192.168.69.19:8080/ca.cer -o /etc/mail/certs/alfaexploit.com/ca.cer
if [ $? -ne 0 ]; then
sendTelegram "$HOSTNAME-SMTP/SSL: Cant download http://admin:XXXX@192.168.69.19:8080/ca.cer"
fi
chmod 600 /etc/mail/certs/alfaexploit.com/*
if [ $PREV_CERTS_FOUND -eq 1 ]; then
for file in /etc/mail/certs/alfaexploit.com/*.ori; do
md5_ori=$(md5 $file|awk '{print$4}')
file=${file::-4}
md5=$(md5 $file|awk '{print$4}')
#echo "md5_ori: $md5_ori -- md5: $md5"
if [ "$md5_ori" != "$md5" ]; then
echo ">> New certs detected -> Restarting SendMail"
service sendmail restart
sendTelegram "$HOSTNAME:25-SSL alfaexploit certificates updated"
break
fi
done
fi
check=$(echo Q|openssl s_client -connect 192.168.69.17:25 -starttls smtp 2>/dev/null | grep '0 s:' | grep 'CN =' | awk -F "CN = " '{print$2}' | awk -F "," '{print$1}')
#echo "check: $check"
if [ "$check" != "alfaexploit.com" ]; then
sendTelegram "$HOSTNAME-SMTP/SSL Incorrect CommonName: $check"
fi
We assign the necessary permissions:
We add it to the crontab:
*/30 * * * * /root/.scripts/get_alfaexploit_certs.sh >/dev/null 2>&1
Once copied, we perform the following configuration:
dnl Enable STARTTLS for receiving email.
define(`CERT_DIR', `/etc/mail/certs/alfaexploit.com')dnl
define(`confSERVER_CERT', `CERT_DIR/fullchain.cer')dnl
define(`confSERVER_KEY', `CERT_DIR/alfaexploit.com.key')dnl
define(`confCLIENT_CERT', `CERT_DIR/fullchain.cer')dnl
define(`confCLIENT_KEY', `CERT_DIR/alfaexploit.com.key')dnl
define(`confCACERT', `CERT_DIR/ca.cer')dnl
define(`confCACERT_PATH', `CERT_DIR')dnl
We compile the configuration:
cp HellStorm.cf sendmail.cf
We restart the service:
We leave a tail in the log to make sure everything is still working:
We perform a manual test to verify that the correct certificate is being used:
Verification: OK
One way to check SSL for both incoming and outgoing mail is through this website:
https://ssl-tools.net/mailservers
https://ssl-tools.net/mails
Reverse DNS
Regarding reverse DNS, GMail/HotMail/OVH servers only require that the origin IP of the email has a reverse, it doesn’t matter what the reverse is, they DO NOT require it to match the origin domain of the email.
Account maintenance
Over time, mailboxes can fill up with emails due to neglect by users, thus causing excessive disk space consumption, SMTP denial of service, or even causing problems for the entire operating system if the disk is not partitioned correctly or disk quotas are not applied.
Dovecot provides an email system management tool called doveadm which also provides useful commands for user account administration.
We can see where the user stores their emails with the following command:
field value
uid 1001
gid 1001
home /home/kr0m
mail mbox:~/mboxDir:INBOX=/var/mail/kr0m
system_groups_user kr0m
We can check the email folders:
Drafts
Trash
Archive
Sent
Spam
INBOX
We can see the general status of each folder:
Spam messages=4 recent=0 uidnext=2343 uidvalidity=1584649428 unseen=4 highestmodseq=4277 vsize=31212 guid=1e54ce3009d6735e13310000d09efc50 firstsaved=1661967302
We can also get a list of emails in that folder:
uid date.saved
2339 2022-08-31 19:35:02
2340 2022-09-01 07:14:41
2341 2022-09-01 09:25:54
2342 2022-09-01 22:00:09
It’s very useful to perform a search before deleting emails to make sure we’re deleting the correct content:
1e54ce3009d6735e13310000d09efc50 2339
1e54ce3009d6735e13310000d09efc50 2340
We delete the emails:
If we check now, we’ll see that only two emails remain:
uid date.saved
2341 2022-09-01 09:25:54
2342 2022-09-01 22:00:09
Spam messages=2 recent=0 uidnext=2343 uidvalidity=1584649428 unseen=2 highestmodseq=4278 vsize=15667 guid=1e54ce3009d6735e13310000d09efc50 firstsaved=1662017154
It’s a good idea to schedule a script to clean the accounts periodically:
#!/usr/local/bin/bash
/usr/local/bin/doveadm expunge -u kr0m mailbox Spam savedbefore 1d
/usr/local/bin/doveadm expunge -u kr0m mailbox Trash savedbefore 7d
Assign the necessary permissions to the script:
Schedule the script:
00 00 * * * /root/.scripts/clearMail >/dev/null 2>&1
The expunge command allows executing commands on all existing users but NOT when system users are being used:
If the -A option is present, the command will be performed for all users.
Using this option in combination with system users from userdb { driver = passwd } is not recommended, because it contains also users with a lower UID than the one configured with the first_valid_uid setting.
When the SQL userdb module is used make sure that the iterate_query setting in /etc/dovecot/dovecot-sql.conf.ext matches your database layout. When using the LDAP userdb module, make sure that the iterate_attrs and iterate_filter settings in /etc/dovecot/dovecot-ldap.conf.ext match your LDAP schema. Otherwise doveadm(1) will be unable to iterate over all users.
Debug
We can enable Dovecot and Sieve debug by configuring certain parameters:
log_path = syslog
syslog_facility = mail
mail_debug = yes
Check the logs:
We can dump the entire running-config of Dovecot with:
The plugins loaded in the Dovecot LMTP service:
Some interesting links:
https://wiki.dovecot.org/Pigeonhole/Sieve/Troubleshooting
https://wiki1.dovecot.org/Logging
A very interesting website when experiencing deliverability issues is:
https://mxtoolbox.com/



