Шпора

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

https://nightly.openhasp.com/

Могу ли я использовать образы дисков из 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 адресом, к другой подключен кабель до коммутатора внутренний сети. Компьютеры внутренней сеть должно иметь доступ в интернет.

Архитектура сети: Интернет — Маршрутизатор FreeBSD (IPFW + NAT) — Коммутатор — Компьютеры локальной сеть

На сервере работает веб-сервер и другие сервисы, для это необходимо открыть порты доступа. Также надо настроить возможность проброса портов с внешнего 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 с параметрами сетевых карт и включённым маршрутизатором должен выглядеть следующим образом

Открыт файл /etc/rc.conf редактором nano в FreeBSD. Настроены параметры сетевых карт, указан параметр для использования FreeBSD в качестве шлюза, включен IPFW + NAT, указан путь до скрипта настройки IPFW.

Дополнительно можно добавить загрузку модулей ядра 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:

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

Удалить правило с указанным номером, например 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

Устанавливаем пакет:

pkg install mpd5

Для установки из коллекции портов, обновляем коллекцию:

portsnap fetch && portsnap update || portsnap extract

Затем, устанавливаем порт:

cd /usr/ports/net/mpd5
make install clean

Настройка MPD5

Переходим в папку с файлами конфигурации:

cd /usr/local/etc/mpd5

В папке имеются следующие файлы:

Копируем файл конфигурации из шаблона:

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

В случае успешного старта видим следующий текст:

Заходим браузером в веб-админку: 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).

Раздел Download VMware Workstation 17 Player сайта www.vmware.com

Ссылка на репозиторий где можно скачать без создания учетной записи: 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)
В консоли Debian установка пакетов командой "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
Debian консоль, установка VMware Player 17.5.0 прошла успешно

1.4. Запуск VMware Player

Открываем меню со списком установленных приложений и запускаем VMware Player

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

VMware Player, окно Welcome to VMware Player, текст лицензии.

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

VMware Workstation Player запущена, можно создавать виртуальный машины.

VMware Workstation 17 Player запущена, открыто главное окно

2. Модули ядра vmmon и vmnet

Данный раздел статьи актуален только в том случае если VMware не смогла собрать свои модули ядра для Linux ядра.

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

При запуске VMware Player выводится окно с предложением собрать и загрузить модули ядра

Окно VMware kernel module updater с предложением собрать и загрузить модули ядра

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

VMware ошибка: Unable to install all modules. See log for details. (Exit code 1)

Для решения этой проблемы существует проект на GitHub (github.com/mkubecek/vmware-host-modules) с исправленными модулями для сборки на последних ядрах Linux.

Существует два варианта сборки и установки модулей ядра:

  1. Замена оригинальных файлов VMware на модифицирование и последующая сборка средствами VMware
  2. Полностью ручная сборка модулей ядра и их установка в систему.

Способы сборки и установки будет показыватся на примере версии 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 будет происходить сборка и установка модулей ядра.

Окно VMware kernel module updater, происходит процесс сборки и установки модулей ядра vmmon и vmnet

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 командой "vmware-installer -l" в консоли Debian

Удаляем 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 Player командой "vmware-installer -u vmware-player" в консоли Debian

Если был установлен только один продукт, то утилита 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. Создаем виртуальную машину

Создаем виртуальную машину, но не запускаем её. Можно использовать уже созданную с операционной системой, но тогда ОС не сможет загрузится из-за смены режима загрузки.

VMware Workstation 17 Player создание новый виртуальной машины Debian 12. Галочка автоматически запускать снята.

2. Редактируем файл виртуальной машины

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

В текстовом редакторе Geany открыт файл "Debian 12.vmx" и добавлена строка firmware = "efi"

Находим строку firmware в открытом файле и изменяем её значение если необходимо. Если строки firmware нет, то VMware работает в режиме BIOS.

Добавляем следующею строку для включения режима UEFI

firmware = "efi"

Если нужно использовать режим BIOS изменяем значение на bios или полностью удаляем строку.

firmware = "bios"

3. Сохраняем файл и запускаем

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

Если есть ошибка на некорректный параметр firmware при запуске, то это означает что в файле два параметра. Необходимо оставить только один параметр.

VMware Workstation 17 Player, виртуальная машина  запущена в режиме UEFI.

Виртуальная машина 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

Обновление до версии FreeBSD 14.3 используя команду “freebsd-update upgrade -r 14.3-RELEASE”. На вопрос Does this look reasonable? Ответ yes

Дожидаемся окончания процесса загрузки обновления.

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

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

Обновление до версии FreeBSD 14.3. Показаны какие изменения будут в файле /etc/ssh/sshd_config и задается вопрос “разумны такие изменения?“, ответ 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.“.

Перезагружаем сервер

shutdown -r now

Запускаем команду для завершения установки обновления

freebsd-update install
Выполнена команда “freebsd-update install“, обновление до версии FreeBSD 14.3 успешно завершено

Обновление до версии 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 версии 1.0.20210914_3 через пакеты FreeBSD при помощи команды 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 сервера в терминале FreeBSD, выведены ключи Server Private Key и Server Public Key

Генерировать ключи можно на любом компьютере где уставлен WireGuard, необязательно на сервере, где будет работать VPN сервер.

2.2. Генерация ключей клиента

Консольная команда генерации ключей аналогичен предыдущей, но с добавлением генерации Pre-Shared Key через команду wg genpsk и заменой слова Server на Client

Ключ Pre-Shared Key используется для дополнительного шифрования внутри основного. Оно необходимо для защиты от расшифровки трафика инопланетными цивилизациями при помощи квантовых компьютеров или в будущем квантовым компьютером созданным человечеством.

Генерируем приватный и публичный ключ клиента:

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 в файл конфигурации сервера.

Выполнена консольная команда для генерации ключей WireGuard клиента в терминале FreeBSD, выведены ключи Server Private Key, Server Public Key и Client Pre-Shared 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

Основные изменения которые необходимо внести в файл конфигурации:

Вносим необходимые измерения и сохраняем файл.

5. Автозагрузка и запуск VPN сервера WireGuard

Добавляем в автозагрузку, где wg0 — имя файла конфигурации без указания расширения .conf

sysrc wireguard_enable="YES" && sysrc wireguard_interfaces="wg0"
VPN сервера WireGuard добавлен составной командой sysrc wireguard_enable="YES" && sysrc wireguard_interfaces="wg0" в автозагрузку FreeBSD

Или вручную открываем файл /etc/rc.conf

nano /etc/rc.conf

и добавляем строки:

wireguard_enable="YES"
wireguard_interfaces="wg0"

Запускаем VPN сервера WireGuard

wg-quick up wg0
VPN сервера WireGuard запущен командой “wg-quick up wg0” в операционной системе FreeBSD, выведены сообщения процесса запуска WireGuard

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

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

Основные изменения которые необходимо внести в файл конфигурации:

Вносим необходимые измерения и сохраняем файл.

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 — путь до файла конфигурации клиента.

Сгенерирован QR-код конфигурации WireGuard при помощи команды “qrencode -t ANSIUTF8 -r /usr/local/etc/wireguard/wg0-client.conf” в консольном терминале FreeBSD

8. Настройка файрвола и маршрутизации в FreeBSD

Чтобы была возможность раздавать интернет внутри VPN сети, необходимо настроить маршрутизацию пакетов через один из трех доступных файрволов (IPFWPFIPF) в 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.

Запущен PowerShell в Windows 10, выполнена команда “scp root@80.95.110.25:/etc/wireguard/wg0-client.conf 'C:\Users\User\Desktop\'”, файл wg0-client.conf успешно скопирован на рабочий стол

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

Нажимаем на кнопку Импорт туннелей из файла и выбираем файл, скачанный ранее.

Запущен WireGuard в Windows 10, нажата кнопка “Импорт туннелей из файла”, открыто окно с выбором файлов и выбран файл wg0-client.conf

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

Запущен WireGuard в Windows 10, подключен wg0-client туннель, выведена статистика успешного VPN подключения, трафик принимается и передается

Как можно видеть, трафик принимается и передается, 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 сервер.

Выполнена команда “ping 192.168.10.1 -c 3; ping 1.1.1.1 -c 3” в консоли Debian, успешный пинг до 192.168.10.1 и 1.1.1.1 адресов, потерь нет

Как можно видеть, пинг до 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 запущено на Android телефоне, нажата кнопка добавить туннель, выведено меню как можно добавить туннель

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

Приложение WireGuard запущено на Android телефоне, выведена статистика успешного VPN подключения, трафик принимается и передается

Как можно видеть, в статистике трафик принимается и передается, 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
Репозиторий amneziawg-linux-kernel-module скопирован с github командой “git clone https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git” в консоли Debian, выведены сообщения процесса клонирования репозитория

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 позволяет сразу установить необходимые права для выполнения скриптов.

В консоли Debian последовательно выполнены команды: “cd /home/user/git/”, “mkdir -p /usr/src/amneziawg-1.0.0/”, “cd amneziawg-linux-kernel-module”, “cp -r src/* /usr/src/amneziawg-1.0.0/”, “install -m 755 kernel-tree-scripts/*-sources.sh /usr/src/amneziawg-1.0.0/”

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 успешно собран и установлен при помощи DKMS в Debian, использовались следующие команды в терминале: “dkms add -m amneziawg -v 1.0.0”, “dkms build -m amneziawg -v 1.0.0”, “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, что и модуль ядра.

Утилиты имеют имена awgawg-quick и они по командам, способом управления аналогичны утилитам wgwg-quick из WireGuard.

3.1. Загрузка исходного кода утилит AmneziaWG

Создаем для удобства каталог git в домашней директории пользователя и переходим в него

mkdir -p ~/git && cd ~/git

Клонируем репозиторий amneziawg-tools

git clone https://github.com/amnezia-vpn/amneziawg-tools.git
Репозиторий amneziawg-tools скопирован с github командой “git clone https://github.com/amnezia-vpn/amneziawg-tools.git” в консоли Debian, выведены сообщения процесса клонирования репозитория

3.2. Сборка утилит awg и awg-quick

Переходим в каталог клонированного репозитория amneziawg-tools

cd amneziawg-tools

Переходим в каталог src

cd src

Запускаем процесс сборки утилит awg и awg-quick

make
В консоли Debian последовательно выполнены команды: “cd amneziawg-tools”, “cd src”, “make”. Показан процесс сборки утилиты из исходного кода.

Дожидаемся окончания сборки.

3.3. Установка утилит awg и awg-quick

Заходим под root-пользователем или выполняем команды через sudo

su -

Устанавливаем утилиты awg и awg-quick

make install
Утилиты awg и awg-quick успешно установлены при помощи команды “sudo make install” в терминале операционной системе Debian, выведен список установленных файлов и их пути

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. Во вкладке “Дом” нажмите на Вашу камеру для входа в её интерфейс (Вы также можете перейти во вкладку “Камеры” и нажать на кнопку “Управление” на необходимой камере для входа в её интерфейс).

image.png

2. В интерфейсе камеры перейдите в её настройки, нажав на соответствующую иконку справа сверху.

image.png

3. Перейдите в раздел “Дополнительные настройки” > “Учетная запись камеры” для создания учетной записи (имя пользователя/пароль). С её помощью осуществляется управление камерой при использовании сторонних сервисов.

image.png

image.png

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

Примечание: Имя пользователя и пароль должны содержать от 6 до 32 символов.

image.png

image.png

image.png

Шаг 2: Просмотр камеры через iSpy (пример с использованием ONVIF)

1. Запустите iSpy на Вашем ПК.

2. Нажмите Add в левом верхнем углу экрана и выберите ONVIF Camera.

image.png

3. Введите имя пользователя (Username) и пароль (Password), которые Вы указывали при создании учетной записи камеры, выберите адрес сети (Network Address) и нажмите Next. Вы можете также изменить дополнительные параметры при необходимости.

image.png

4. Выберите разрешение видео и нажмите OK.

image.png

5. При необходимости настройте параметры камеры, включая микрофон, голосовую связь, обнаружение движения, оповещения, запись, изображения, расписания и хранение. Данные параметры можно будет изменить позднее. Нажмите “Finish” для завершения добавления камеры в iSpy.

image.png

6. После добавления камеры Tapo в iSpy Вы сможете просматривать и управлять камерой. Вам доступны просмотр в реальном времени, настройки обнаружения движения, проверка записи при обнаружении движения, установка записи по расписанию, видеозапись и многое другое.

image.png

Шаг 3: просмотр камеры Tapo через VLC Player (пример с использованием RTSP)

1. Запустите VLC Media Player на Вашем ПК.

2. Во вкладке “Медиа” выберите “Открыть URL…”

image.png

3. Введите URL-адрес RTSP-потока камеры Tapo.

image.png

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” (в зависимости от типа интерфейса Вашего роутера). Если Вы используете роутер другой марки, пожалуйста, свяжитесь с поддержкой производителя Вашего роутера, чтобы узнать эту информацию.

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

Также нужно настроить проброс порта на этом роутере. Чтобы узнать, как это сделать, обратитесь к этой статье: 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, как включить автоматическое обновление сертификатов.

FreeBSD, certbot успешно установлен, выедено сообщение как включить автоматическое обновление сертификатов и что есть плагины для 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.

Будет преложено два варианта как проверить собственность доменного имени сайта:

  1. запустить встроенный веб-сервер certbot (не походит, так как уже есть рабочий веб-сервер);
  2. использовать рабочий веб-сервер, например nginx.

Выбираем 2 вариант

Далее необходимо указать путь до каталога сайта. В каталоге сайте будет создан каталог .well-known/acme-challenge/ с файлами для проверки домена.

Указываем каталог сайта

Получение сертификата Let's Encrypt для домена notby.net командой “certbot certonly -d notby.net” в консоли FreeBSD

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

Консоль FreeBSD, сертификат Let's Encrypt успешно получен для домена notby.net, путь до сертификата и ключа

Сертификат Let's Encrypt успешно выдан сроком на 3 месяца.

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

Если во время получения сертификата произошла ошибка, возможны следующие причины:

Проверяем что каталог сайта имеет права как минимум 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.

Кусок браузера Firefox, проверка наличия сертификата сайта notby.net, соединение защищенное с Let's Encrypt сертификатом

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

Поисковые системы также со временем изменят протокол сайта или можно зайти в панель управления сайтами в поисковой системе и указать что сайт переехал на HTTPS.

6. Проверка обновлений сертификатов

После настройки веб-сервера запускаем проверку получения нового сертификата

certbot renew --dry-run

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

Симуляция получения нового сертификата командой “certbot renew --dry-run”, тестовое получение сертификата для notby.net успешно завершено

Тестовое получение сертификата успешно пройдено.

7. Автоматическое обновление сертификатов

Утилиту Certbot необходимо добавить в файл /etc/periodic.conf (периодическое выполнение заданий), чтобы она автоматически перевыпустила сертификаты сайтов, срок действия которых заканчивается.

Открываем в текстовом редакторе файл /etc/periodic.conf или создаем его

nano /etc/periodic.conf

Добавляем строку

weekly_certbot_enable="YES"
Открыт файл /etc/periodic.conf в текстовом редакторе nano, добавлена строка weekly_certbot_enable="YES"

Сохраняем файл. Теперь раз в неделю будет происходить проверка сертификатов сайтов и если сертификату остается меньше двух недель, он будет обновлен автоматически.

8. Изменение email адреса аккаунта

Если в дальнейшим потребуется изменить email адрес аккаунта Let's Encrypt, используем команду:

certbot update_account --email new@email.com

где new@email.com — новый email адрес.

Будет предложено подписатся на новости и немного рекламы, отвечаем N если неинтересно.

Обновление email адреса аккаунта Let's Encrypt командой “certbot update_account --email new@email.com” в консоли FreeBSD, email успешно обновлен

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 фаервола : IPFilteripfw и 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.

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, но есть важные нюансы.

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 отсутствует, копировать файлы удобнее всего через sshcurl присутствует по умолчанию. Можно скопировать 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.

  1. Поправьте /etc/inc/filter.inc следующим образом:
	<...>
	/* MOD */
	$natrules .= "# ZAPRET redirection\n";
	$natrules .= "rdr-anchor \"zapret\"\n";

	$natrules .= "# TFTP proxy\n";
	$natrules .= "rdr-anchor \"tftp-proxy/*\"\n";
	<...>

  1. Напишите файл с содержимым 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 не нужен.

  1. Добавьте в автозапуск /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

  1. После перезагрузки проверьте, что правила создались:
$ 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*

Code:
/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:

cd /etc/mail
cp /usr/share/examples/sendmail/mailer.conf /etc/mail/mailer.conf
make
cp HOSTNAME.cf sendmail.cf
service sendmail restart

Установите Home Assistant на FreeBSD внутри виртуальной машины bhyve

Для этого на FreeBSD 13.1-p1 vm vm-bhyve 1.5.0 в качестве менеджера виртуальных машин bhyve и qemu-tools 7.0.0_1 требуется преобразовать образ из qcow2 в raw, как я полагаю.

Требования

Требуемые pkgs

Для этого вам нужно настроить 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 — где будет храниться образ системы:





 

Если Вы работаете на локальной машине, указываем RemoteIP — системы, которую нужно клонировать:





Клонирование системы с помощью dd

Итак, что же еще можно сделать с помощью dd? Если Вы хотите клонировать систему с одного диска на другой, указываем RemoteIP — системы, которую нужно клонировать:






 


Или можно клонировать систему в образ, образ не сжатый:






 

Восстанавливаем образ системы, указываем RemoteIP — системы, которую нужно восстановить:






Выводы

Спасибо за уделенное время на прочтение статьи. Теперь Вы больше знаете о том, как осуществить различные полезные операции с помощью команды 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 sudo
su root

Update FreeBSD
freebsd-update fetch install

Install Ports Tree
portsnap fetch extract

Install ports-mgmt/portmaster

Code:

pkg install -y py311-matrix-synapse 
# 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

Code:

# 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 #1synapse_config.sh
This will be used to configure synapse before starting the service.

Code:

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


Code:

# ~/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 #2synapse_start.sh
This script will be used to start Synapse. It will also be added to cron so it'll run at boot.

Code:

#!/bin/sh
# Synapse: Start Synapse
cd ~/.synapse
synctl start


Lets start Synapse then add this script to cron

Code:

# ~/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.

Code:

# crontab -e
@reboot ~/synapse_start.sh



Script #3synapse_add_user.sh
This script will be used to add users to the Synapse database.

Code:

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

# ~/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://ru.hostzealot.com/blog/how-to/posagovoe-rukovodstvo-po-ustanovke-servera-synapse-matrix-server-na-ubuntu-2204

 

https://eurafri.com/projects/tutorials/tutorial-en-00009/

 

Samba

[global]
#Тип аутентификации
security = user
#База паролей
passdb backend = tdbsam
#Рабочая группа
workgroup = kdc

#Текстовое описание сервера
server string = storage
#Netbios имя
netbios name = storage

#Мастер браузер
local master = no

#Приоритет мастер браузера
os level = 255

#Домен контролер
domain master = no

#Версии протоколов
server min protocol = SMB2
client min protocol = SMB2
client max protocol = SMB3

#wins сервер
wins support = no
 

#Название сетевой шары
[storage]
#Путь до директории шары
path = /data/storage/files
#Разрешенные пользователи
valid users = @samba,@buzz
#Группа для сетевой шары
force group = samba
#Маска создания файлов
create mask = 0770
#Маска создания директорий
directory mask = 0770
#Разрешение на запись
writable = yes
#Видимость сетевой шары
browseable = yes


#Название сетевой шары
[admin]
#Путь до директории шары
path = /data/admin
#Разрешенные пользователи
valid users = @buzz
#Группа для сетевой шары
force group = buzz
#Маска создания файлов
create mask = 0770
#Маска создания директорий
directory mask = 0770
#Разрешение на запись
writable = yes
#Видимость сетевой шары
browseable = yes


#Название сетевой шары
[base]
create mask = 0770
path = /data/base
browseable = yes
directory mask = 0770
force group = bd
valid users = @bd,@buzz
writeable = yes
#Название сетевой шары
[accountancy]
#Путь до директории шары
path = /data/accountancy
#Разрешенные пользователи
valid users = @buzz,@buh,@bd
#Группа для сетевой шары
force group = buh
#Маска создания файлов
create mask = 0770
#Маска создания директорий
directory mask = 0770
#Разрешение на запись
writable = yes
#Видимость сетевой шары
browseable = yes

Создаём пользователя в 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

Быстрые Советы

Apache httpd : SSL/TLS Setting

 

Configure SSL/TLS setting to use secure encrypt HTTPS connection.

[1]

Get SSL Certificate, refer to here.

[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"
root@www:~ # 
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/da1
da1 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/da1
da1p1 added

Второй раздел создадим без указания начального LBA и без указания размера — таким образом он будет создан на всем свободном пространстве:

gpart add -t freebsd-ufs /dev/da1
da1p2 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/da1
da1p1 added

Второй раздел создадим без указания начального LBA и без указания размера — таким образом он будет создан на всем свободном пространстве:

gpart add -t freebsd-ufs /dev/da1
da1p2 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:

swapinfo
Device    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:

 

 

Windows 32-bit Installer download link:

 

 

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 и подходит для таких целей):

bash
sudo mkdir -p /var/tmp/.webmin

Важно: Убедитесь, что у этой папки правильные права доступа, чтобы веб-сервер Webmin мог в неё писать:

bash
sudo chmod 1777 /var/tmp/.webmin

(Права 1777 означают «sticky-бит» — владелец может удалить только свои файлы, как в обычном /tmp).

Шаг 2: Смените путь в настройках Webmin

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

  1. Войдите в веб-интерфейс Webmin.

  2. Перейдите в раздел Webmin → Webmin Configuration (Конфигурация Webmin).

  3. Нажмите на иконку Advanced Options (Расширенные опции) .

  4. Найдите поле Temporary files directory (Директория временных файлов).

  5. Замените значение по умолчанию Default (/tmp/.webmin) или просто путь, который там указан, на: /var/tmp/.webmin

  6. Нажмите кнопку Save (Сохранить).

Что произошло?

После этой смены:

Дополнительные рекомендации

Если после этого ошибка в интерфейсе осталась, просто обновите страницу — предупреждение должно исчезнуть.

Диск 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 an
unsafe state. Please resume and shutdown Windows fully (no hibernation
or 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 shutdown
Windows fully (no hibernation or fast restarting), or mount the volume
read-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.
FAILED
Attempting to correct errors...
Processing $MFT and $MFTMirr...
Reading $MFT... OK
Reading $MFTMirr... OK
Comparing $MFTMirr to $MFT... OK
Processing of $MFT and $MFTMirr completed successfully.
Setting required flags on partition... OK
Going to empty the journal ($LogFile)... OK
Checking the alternate boot sector... OK
NTFS 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.
FAILED
Attempting to correct errors…
Processing $MFT and $MFTMirr…
Reading $MFT… OK
Reading $MFTMirr… OK
Comparing $MFTMirr to $MFT… OK
Processing of $MFT and $MFTMirr completed successfully.
Setting required flags on partition… OK
Going to empty the journal ($LogFile)… OK
Windows 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:

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.

  1. Update the server packages catalog.

    console
    $ sudo pkg update
    
  2. Install Apache on your server.

    console
    $ sudo pkg install -y apache24
    
  3. Verify that Apache is installed on your server.

    console
    $ apachectl -v
    

    Output:

    Server version: Apache/2.4.59 (FreeBSD)
    Server built:   unknown
  4. Enable Apache to automatically start at boot.

    console
    $ sudo service apache24 enable
    
  5. Start the Apache web server.

    console
    $ sudo service apache24 start
    
  6. 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.
  7. 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

    Default Apache webpage

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.

  1. 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)
    ...
  2. Install the latest MySQL server and client packages.

    console
    $ sudo pkg install mysql81-server mysql81-client
    
  3. View the installed MySQL version on your server.

    console
    $ mysql --version
    

    Output:

    mysql  Ver 8.1.0 for FreeBSD14.0 on amd64 (Source distribution)
  4. Enable the MySQL server to automatically start at boot.

    console
    $ sudo service mysql enable
    

    Output:

    mysql enabled in /etc/rc.conf
  5. Start the MySQL database server.

    console
    $ sudo service mysql-server start
    
  6. View the MySQL server status and verify that it's running.

    console
    $ sudo service mysql-server status
    

    Output:

    mysql is running as pid 3266.
  7. 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 root database 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) : 
  8. 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.

  1. 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)
  2. Install the latest PHP package. For example, PHP version 8.3.

    console
    $ sudo apt install php83
    
  3. 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
    
  4. 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
  5. 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
  6. Enable PHP-FPM to automatically start at boot.

    console
    $ sudo service php-fpm enable
    
  7. 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.

  1. 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 user and group directives and verify that PHP-FPM runs with the web server user profile www.
    ini
    user = www
    group = www
    
    • Find the listen directive and verify that PHP-FPM listens for connection requests on the localhost port 9000.
    ini
    listen = 127.0.0.1:9000
    

    Save and close the file.

  2. Run the following command to enable the mod_proxy and mod_proxy_fcgi Apache 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.

    apacheconf
    LoadModule proxy_module libexec/apache24/mod_proxy.so
    LoadModule proxy_fcgi_module libexec/apache24/mod_proxy_fcgi.so
    
  3. Open the main Apache configuration file.

    console
    $ sudo ee /usr/local/etc/apache24/httpd.conf
    
  4. 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.

  5. 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
  6. Restart PHP-FPM to apply changes.

    console
    $ sudo service php-fpm restart
    
  7. Restart Apache to apply the configuration changes.

    console
    $ sudo service apache24 restart
    

Test the Installation

  1. Log in to the MySQL database server using the root user and password you set earlier.

    console
    $ mysql -u root -p
    
  2. Create a new sample database exampledb.

    sql
    mysql> create database exampledb;
    
  3. Create a new database user such as dbadmin with a strong password.

    sql
    mysql> create user 'dbadmin'@'localhost' IDENTIFIED BY 'strong@@password25Bb';
    
  4. Grant the dbadmin user full privileges to the exampledb database.

    sql
    mysql> GRANT ALL PRIVILEGES ON exampledb.* TO 'dbadmin'@'localhost';
    
  5. Flush the MySQL privileges table to apply changes.

    sql
    mysql> FLUSH PRIVILEGES;
    
  6. Switch to the sample database exampledb.

    sql
    mysql> use exampledb;
    
  7. Create a new sample table exampletable with the following columns to store integer and string values.

    sql
    mysql> 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: id that stores numeric data, and messages that stores mixed characters.

  8. Insert sample data into the table. For example, Greetings from Vultr.

    sql
    mysql> INSERT INTO exampletable (messages) VALUES ('Greetings from Vultr');
    
  9. Exit the MySQL database console.

    sql
    mysql> EXIT;
    
  10. Create a new directory to store your web application files. For example, app.example.com in the default Apache web root path.

    console
    $ sudo mkdir -p /usr/local/www/apache24/app.example.com
    
  11. 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
    
  12. 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 exampledb database to output values in the exampledata column within the messages table. The application displays a Greetings from Vultr heading when successful or No Data Found when unsuccessful.

  13. 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
    
  14. 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.com on the default HTTP port 80. All PHP requests are forwarded to PHP-FPM on the host port 9000 applied in your main Apache configuration.

  15. 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
  16. Restart Apache to apply the new virtual host configuration.

    console
    $ sudo service apache24 restart
    
  17. Access your domain using a web browser and verify that you can access the PHP web application.

    http://app.example.com

    A Sample PHP web application

Secure the Server

  1. Install the Certbot Let's Encrypt client for Apache.

    console
    $ sudo pkg install py39-certbot-apache
    
  2. Run the following commands to enable the Apache mod_rewrite and mod_ssl modules 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.conf Apache configuration file:

    apacheconf
    LoadModule ssl_module libexec/apache24/mod_ssl.so
    LoadModule rewrite_module libexec/apache24/mod_rewrite.so
    
  3. Generate a new SSL certificate for your domain. Replace app.example.com with your actual domain.

    console
    $ sudo certbot --apache -d app.example.com --agree-tos
    
  4. 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)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  5. Restart Apache to apply your SSL configuration changes.

    console
    $ sudo service apache24 restart
    
  6. Create a new Packet Filter (pf) firewall configuration.

    console
    $ sudo ee /etc/pf.conf
    
  7. Add the following configurations to the file. Replace vtnet0 with your public server interface name.

    ini
    ext_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 port 80, and the HTTPS port 443. In addition, the firewall blocks any other network connections to other ports on your server.

  8. Enable the firewall to automatically start at boot.

    console
    $ sudo sysrc pf_enable="YES"
    

    Output:

    pf_enable: NO -> YES
  9. Load your firewall configuration.

    console
    $ sudo pfctl -f /etc/pf.conf
    
  10. Start the Packet Filter firewall.

    console
    $ sudo pfctl -e
    

    Output:

    pf enabled
  11. 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
  12. 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.

bash
chown -R mailnull:mailnull /var/db/dkim

2️⃣ Безопасные права доступа
Вы уже делали эту часть ранее, но лучше повторить, чтобы исключить ошибку. Это даст OpenDKIM возможность читать ключ и заходить в каталог.

bash
chmod 0600 /var/db/dkim/ip-mail.ru/myselector.private
chmod 0750 /var/db/dkim
chmod 0750 /var/db/dkim/ip-mail.ru

3️⃣ Перезапуск сервисов
Чтобы все изменения вступили в силу.

bash
service milter-opendkim restart
service sendmail restart   # или service postfix restart, если он у вас

💡 Почему это важно

После выполнения этих шагов выполните команду tail -f /var/log/maillog и попробуйте отправить тестовое письмо. Ошибка Permission denied должна исчезнуть.

Если проблема сохранится, проверьте еще одну вещь: в некоторых версиях требуется также явно указать пользователя в настройках. Убедитесь, что в файле /etc/rc.conf есть следующие строки:

sh
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.

All-20-Commands-at-a-Glance.jpg

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.

Discover the network path to a 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.

Scan for open ports and version information of services

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:

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.

Scan the ports specified

6. Scan all ports on a target

nmap -p- <target>

This command will scan ports numbered 1 through 65535.

Scan all ports on a target

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.

Scan for open ports on the target

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.

Scan for the specified number of most common ports

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.

Perform a TCP connect scan

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.

Scan for UDP ports

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.

Enable OS detection, version detection, script scanning, and traceroute

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.

(12) Scan for remote operating system

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.

(13) Scan a target with a specific timing template

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.

Increase the verbosity of the output (second level)





Grab Your FREE Nmap Cheat Sheet Now!
Want to keep all Nmap commands at your fingertips? Just enter your email address, and we’ll send the cheat sheet to your inbox.

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.

Scan for commonly used ports and services

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.

Run a script on the target

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.

(17) Run all vulnerability scans on the target

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.

Read targets from a text file

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.

Save scan results in normal, XML, and grepable formats at once

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):

Save the scan results to a normal format

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:


This article is quite extensive, so I have divided it into several sections:


SendMail

The first step will be to make sure our server knows its own hostname:

vi /etc/hosts

 

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_enable=yes
sysrc sendmail_msp_queue_enable=yes
service sendmail start

 

We check that we can access it over the network:

telnet X.X.X.X 25

 

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:

telnet 192.168.69.17 25

 

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:

tail -f /var/log/maillog

 

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:

tail -f /var/log/maillog

 

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

 

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:

vi /etc/mail/local-host-names

 

alfaexploit.com

We restart SendMail:

service sendmail restart

 

We perform the test again:

telnet 192.168.69.17 25

 

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

 

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 :

vi /etc/mail/aliases

 

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:

newaliases

 

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:

makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
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:

vi /etc/mail/relay-domains

 

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:

pkg install dovecot

 

We copy the example configuration files:

cp -R /usr/local/etc/dovecot/example-config/* /usr/local/etc/dovecot/

 

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.

vi /usr/local/etc/dovecot/conf.d/10-ssl.conf

 

ssl = no
#ssl_cert = </etc/ssl/certs/dovecot.pem
#ssl_key = </etc/ssl/private/dovecot.pem

The web interface only accesses Dovecot via IMAP:

vi /usr/local/etc/dovecot/dovecot.conf

 

protocols = imap lmtp

We bind Dovecot to the server’s IP:

vi /usr/local/etc/dovecot/dovecot.conf

 

listen = 192.168.69.17

We tell Dovecot where to organize Sent/Drafts/Spam/Trash/Archive emails and where to look for received emails:

vi /usr/local/etc/dovecot/conf.d/10-mail.conf

 

mail_location = mbox:~/mboxDir:INBOX=/var/mail/%u
mail_privileged_group = mail

We adjust the permissions of the /var/mail directory:

chmod a+rwxt /var/mail

 

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:

sysrc dovecot_enable=yes
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:

vi /usr/local/etc/php.ini

 

date.timezone = Europe/Madrid
upload_max_filesize = 25M
post_max_size = 25M

We start the php-fpm service:

sysrc php_fpm_enable=yes
service php-fpm start

 

We install MySQL to store user contacts:

pkg install -y mysql80-server

 

We start the service:

sysrc mysql_enable=yes
service mysql-server start

 

We configure the database:

mysql_secure_installation

 

We create the configuration file to be able to log in without typing the password every time:

vi .my.cnf

 

[client]
user     = root
password = XXXXXXXXX

We secure access:

chmod 600 .my.cnf

 

We create the database and a user with access to it:

mysql

 

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:

pkg install -y nginx

 

We start the service:

sysrc nginx_enable=yes
service nginx start

 

We create a vhost for RainLoop:

vim /usr/local/etc/nginx/rainloop.conf

 

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:

vi /usr/local/etc/nginx/nginx.conf

 

http {
    include       mime.types;
    default_type  application/octet-stream;
    client_max_body_size 25M;
    include rainloop.conf;

We restart the service:

service nginx reload

 

We download and install RainLoop:

mkdir -p /usr/local/www/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:

tail -f /var/log/maillog

 


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:

pkg install -y spamass-milter

 

We enable the spamd service indicating from which IPs it will accept connections, in this case the server’s own IP:

sysrc spamd_enable="yes"
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_enable="yes"
sysrc spamass_milter_socket="/var/run/spamass-milter.sock"

 

The rest of the options that we can configure can be seen in:

cat /usr/local/etc/rc.d/spamass-milter

 

: ${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-update
sa-compile

 

We start SpamAssassin and SpamAssassin-milter:

service sa-spamd start
service spamass-milter start

 

We generate a base configuration file for SendMail:

cd /etc/mail/
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:

vi HellStorm.mc

 

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:

make

 

We update the SendMail configuration with ours:

cp sendmail.cf sendmail.cf.ori
cp HellStorm.cf sendmail.cf

 

We restart the service:

service sendmail restart

 

We put a tail to see the logs, some errors will appear since SpamAssassin is not yet fully configured:

tail -f /var/log/maillog

 

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:

vi /usr/local/etc/mail/spamassassin/local.cf
blacklist_from *@126.com
blacklist_from hacker@xxxxxxx.com

Restart the service:

service sa-spamd restart

 

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:

vi /usr/local/etc/mail/spamassassin/local.cf

 

bayes_path /var/spamassassin/bayes_db/bayes
bayes_file_mode 0775

Create the directory:

mkdir -p /var/spamassassin/bayes_db/

 

Assign the permissions mentioned in the documentation:

chmod 775 /var/spamassassin/bayes_db/
chown root:spamd /var/spamassassin/bayes_db/

 

Restart the service:

service sa-spamd restart

 

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:

cd /etc/mail/

 

vi HellStorm.mc

Replace:

FEATURE(local_lmtp)

With:

FEATURE(local_lmtp,`[IPC]',`FILE /var/run/dovecot/lmtp')dnl

Recompile the configuration:

make

 

Replace the current configuration with ours:

cp HellStorm.cf sendmail.cf

 

Restart the service:

service sendmail restart

 

We install the necessary package for Dovecot to support Sieve:

pkg install -y dovecot-pigeonhole

 

We enable it as a protocol:

vi /usr/local/etc/dovecot/dovecot.conf

 

protocols = imap lmtp sieve

And as an LMTP plugin:

vi /usr/local/etc/dovecot/conf.d/20-lmtp.conf

 

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:

vi /usr/local/etc/dovecot/conf.d/90-plugin.conf

 

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:

mkdir /var/lib/dovecot

 

vi /var/lib/dovecot/default.sieve
require ["fileinto"];
  
if header :contains "X-Spam-Flag" "YES" {
    fileinto "Spam";
    stop;
}

We compile the script:

sievec /var/lib/dovecot/default.sieve

 

We create the Sieve scripts directory in the user’s home directory:

su -l kr0m
mkdir /home/kr0m/.sieve
exit

 

We check that Dovecot’s LMTP module has loaded the Sieve plugin:

doveconf -f service=lmtp mail_plugins

 

mail_plugins = sieve

We restart Dovecot:

service dovecot restart

 

We manually connect to the Sieve-manager:

telnet 127.0.0.1 4190

 

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:

We check that all entries resolve as they should:

dig mx alfaexploit.com +short

 

0 mail.alfaexploit.com.
dig mail.alfaexploit.com +short
79.116.145.12
dig txt alfaexploit.com +short
"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:

pkg install -y opendkim

 

We enable the service:

sysrc milteropendkim_enable=yes

 

We generate the private-key/pub-key pair:

mkdir /var/db/dkim
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:

vi /usr/local/etc/mail/opendkim.conf

 

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:

chown mailnull:mailnull /var/run/milteropendkim/

 

We define which IPs can connect to the milter, in my case the IP of the server itself:

vi /var/db/dkim/internal_hosts

 

192.168.69.17

We start the service:

service milter-opendkim start

 

We configure SendMail to use the new milter:

cd /etc/mail


vi HellStorm.mc

 

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:

make
cp HellStorm.cf sendmail.cf

 

We restart the service:

service sendmail restart

 

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:

cat /var/db/dkim/smtp.txt

 

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:

dig TXT smtp._domainkey.alfaexploit.com +short

 

"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:

The possible policies are:

We check that the DNS record responds with the correct information:

dig TXT _dmarc.alfaexploit.com +short

 

"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:

vi /usr/local/etc/nginx/nginx.conf

 

...
http {
    include       mime.types;
    default_type  application/octet-stream;
    client_max_body_size 25M;
    #include rainloop.conf;
...

We restart the service:

service nginx restart

 

We install ACME:

pkg install -y curl socat
curl https://get.acme.sh | sh -s email=kr0m@alfaexploit.com

 

We issue the certificate request:

/root/.acme.sh/acme.sh --issue -d mail.alfaexploit.com -w /usr/local/www/nginx --renew-hook 'service nginx restart'

 

[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:

vi /usr/local/etc/nginx/nginx.conf

 

...
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 :

vi /usr/local/etc/nginx/rainloop.conf

 

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:

service nginx restart

 


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:

cp -r /etc/mail/certs /etc/mail/certs.ori

 

The certificates are obtained on the web server, so we synchronize them using the following script:

vi ~/.scripts/get_alfaexploit_certs.sh

 

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

chmod 700 ~/.scripts/get_alfaexploit_certs.sh

 

We add it to the crontab:

crontab -e

 

*/30 * * * * /root/.scripts/get_alfaexploit_certs.sh >/dev/null 2>&1

Once copied, we perform the following configuration:

cd /etc/mail


vi HellStorm.mc

 

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:

make
cp HellStorm.cf sendmail.cf

 

We restart the service:

service sendmail restart

 

We leave a tail in the log to make sure everything is still working:

tail -f /var/log/maillog

 

We perform a manual test to verify that the correct certificate is being used:

echo Q|openssl s_client -connect mail.alfaexploit.com:25 -starttls smtp 2>/dev/null|grep ‘Verification:’

 

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:

doveadm user kr0m

 

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:

doveadm mailbox list -u kr0m

 

Drafts
Trash
Archive
Sent
Spam
INBOX

We can see the general status of each folder:

doveadm mailbox status -u kr0m all Spam

 

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:

doveadm -f tab fetch -u kr0m "uid date.saved" mailbox Spam

 

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:

doveadm search -u kr0m mailbox Spam savedbefore 1d

 

1e54ce3009d6735e13310000d09efc50 2339
1e54ce3009d6735e13310000d09efc50 2340

We delete the emails:

doveadm expunge -u kr0m mailbox Spam savedbefore 1d

 

If we check now, we’ll see that only two emails remain:

doveadm -f tab fetch -u kr0m "uid date.saved" mailbox Spam

 

uid	date.saved
2341	2022-09-01 09:25:54
2342	2022-09-01 22:00:09
doveadm mailbox status -u kr0m all Spam
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:

vi ~/.scripts/clearMail

 

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

chmod 700 ~/.scripts/clearMail

 

Schedule the script:

crontab -e

 

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:

vi conf.d/10-logging.conf

 

log_path = syslog
syslog_facility = mail
mail_debug = yes

Check the logs:

tail -f /var/log/debug.log

 

We can dump the entire running-config of Dovecot with:

doveconf -a

 

The plugins loaded in the Dovecot LMTP service:

doveconf -f service=lmtp mail_plugins

 

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/