17 апреля 2024 18 апреля 2024 Linux docker stunnel4


Серверную часть тонеля stunnel4 не имеет смысла описывать, а вот создания контейнера шифрующего трафика ещё ни где особо не описано. Итак

В директори services/stunnel4 размещаем 3 файла

  • [remote-ip].pem - файл сертификат, [remote-ip]  я использую для быстрой идентификации IP сервера к которому идёт подключение
  • stunnel.conf - настройка stunnel4
  • Dockerfile - файл образа

в файле stunnel.conf пишем примерно такое

client = yes
pid = /var/run/stunnel.pid
foreground = yes

[postgres]
accept = 0.0.0.0:55432
connect = [remote-ip]:15432
cert = /etc/stunnel/[remote-ip].pem

Разумеется [remote-ip]  заменяем на свой

В файле Dockerfile пишем вот такое

from avccvut/stunnel4:0.1-5.44

COPY ./[remote-ip].pem /etc/stunnel/
COPY ./stunnel.conf /etc/stunnel/

CMD ["stunnel4", "/etc/stunnel/stunnel.conf"]

В файле docker-compose.yml добавляем новый такой контейнер:

  postgres:
    # ...

  stunnel4:
    container_name: ${APP_NAME}-stunnel4
    build:
      context: services/stunnel4
    ports:
      - 55432:55432

После того как контейнер будет запущен обращаться к продакшен базе вот так

docker-compose exec postgres psql postgresql://user:psswrd@stunnel4:55432/dbname

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

docker-compose exec postgres pg_dump postgresql://user:psswrd@stunnel4:55432/dbname -t auth_user | docker-compose exec postgres psql dbname

 


09 октября 2023 Linux ubuntu 22.04 haproxy rsyslog logging


Недавно обнаружил, что современные на 2023 года Ubuntu не логируют работу Haproxy. Оказывается в них отсутствует и не настроен rsyslog

проверить можно вот так

apt-cache policy rsyslog

установить вот так

sudo apt-get install rsyslog

Затем необходимо настроить его для работы на 514 пору, для этого необходимо раскоментировать следующие настройки

egrep 'im(tcp|udp)' /etc/rsyslog.conf
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")

и перезапустить

service rsyslog restart

Затем проверить в /etc/haproxy/haproxy.cfg глобальную настройку
 

global
        log 127.0.0.1:514 local0

defaults
        log     global

и перезапустить haproxy

haproxy -c -V -f /etc/haproxy/haproxy.cfg && service haproxy reload

А так же подумать на счёт переноса haproxy  в отдельный контейнер


04 октября 2023 Linux docker ftp proFTPD


Современный backend может не содержать на физическом сервере своих привычных файлов, там может даже не было СУБД и Веб-сервера потому что вся система размещается в контейнерах Docker

Для того чтобы предоставить доступ к файлам в таком контейнере можно воспользовать образом proFTPD и включить его в конфигурацию docker-compose

Ниже представлена настройка такого контейнера

  ftp:
    image: instantlinux/proftpd
    container_name: ${APP_NAME}-ftp
    ports:
      - "2100:21"
      - "30091-30100:30091-30100"
    env_file: .env
    volumes:
      - ./ftp/secrets:/run/secrets
      - ./site:/home/site/
    environment:
      - PASV_ADDRESS=0.0.0.0
      - ANONYMOUS_DISABLE=on
      - TZ=Europe/Moscow
      - SFTP_ENABLE=off
      - PASV_MAX_PORT=30100
      - PASV_MIN_PORT=30091

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

FTPUSER_UID=1000
FTPUSER_NAME=ftp_user
FTPUSER_PASSWORD_SECRET=Yhatztna7%$4A8hag

Переменная FTPUSER_UID должна быть равна ID текущего пользовать от имени которого запускается контейнер

Переменные FTPUSER_NAME и FTPUSER_PASSWORD_SECRET ипользуется для генерации пароля и поиска этого пароля в специальном файле в директории /run/secrets

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

python3 -c "import crypt,random,string;  print(crypt.crypt('$FTPUSER_PASSWORD_SECRET', '\$6\$' + ''.join( [random.choice(string.ascii_letters + string.digits)   for _ in range(16)])))" > ftp/secrets/$FTPUSER_PASSWORD_SECRET

в результате получится вот такой файл с паролем

cat  ftp/secrets/Yhatztna7%\$4A8hag 
$6$XyHVN6aqgQvgj7Vv$Ac/9hKk0WYOmYPPh/hcG/yLvMAAgi91.k5lC2U4Dx/1PEe0KtW8NsLOhN6GBzcX8TKQPF51JHmyBX580pZ9.A0

Если хочется дополнительных опцией автозапуска то достаточно изучить файл инициализации контейнера

docker-compose exec ftp cat /usr/local/bin/entrypoint.sh

 


21 апреля 2023 22 августа 2023 Linux bind dnssec


export DOMAINNAME=breys.ru

cd /var/cache/bind

dnssec-keygen -L 3600 -a RSASHA256 -b 2048  $DOMAINNAME
dnssec-keygen -L 3600 -f KSK -a RSASHA256 -b 4096 $DOMAINNAME

for key in `ls K$DOMAINNAME*.key`; do 
    echo "\$INCLUDE $key"  /etc/bind/zones/$DOMAINNAME.conf ; 
done

salt=$(head -c 1000 /dev/urandom | sha1sum | cut -b 1-16)

dnssec-signzone -A -3 $salt -N INCREMENT -o $DOMAINNAME -t /etc/bind/zones/$DOMAINNAME.conf

В результате подписанный файл зоны будет в файле /etc/bind/zones/$DOMAINNAME.conf

этот файл необходимо указать в настройках зоны и перезапустить bind9

zone "breys.ru" {
    type master;
//    file "/etc/bind/zones/breys.ru.conf";
    file "/etc/bind/zones/breys.ru.conf.signed";
};

При этом утилита dnssec-signzone подписывает каждую запись зоны /etc/bind/zones/$DOMAINNAME.conf

в который мы добавили созданные ключи через $INCLUDE

Ключи должны находиться в /var/cache/bind

В дальнейшем с зоной необходимо работать по такой схеме

  • изменения вносят в оригинальный файл зоны /etc/bind/zones/breys.ru.conf
  • подписывают изменённый файл зоны ключами:
    dnssec-signzone -A -3 $salt -N INCREMENT -o $DOMAINNAME -t /etc/bind/zones/$DOMAINNAME.conf
  • перезапускают bind9

 


06 марта 2023 Linux


Проверить mail._domainkey

dig TXT mail._domainkey.centersvet.com

Получить заголовок зоны

 dig +nocmd centrsvet.com any +multiline +noall +answer

 


20 января 2023 25 января 2023 Linux dd losetup pvcreate vgcreate lvcreate vgchange


Задача: выжать максимум производительность из шины материнской платы.

Цель: raid массив построенный на программной технологии LVM

RAID массив 0 уровня состоит из 4 виртуальных устройств Linux созданных на основе пустых файлов размером по 512 мегабайт

Процедура создания программного LVM/RAID0

# создание пустых файлов
dd if=/dev//zero of=sda1.dd bs=1M count=512
dd if=/dev//zero of=sda2.dd bs=1M count=512
dd if=/dev//zero of=sda3.dd bs=1M count=512
dd if=/dev//zero of=sda4.dd bs=1M count=512


# создание виртуальных устройств
losetup --partscan --find --show  sda1.dd
losetup --partscan --find --show  sda2.dd
losetup --partscan --find --show  sda3.dd
losetup --partscan --find --show  sda4.dd


# создание PV
pvcreate /dev/loop15
pvcreate /dev/loop16
pvcreate /dev/loop17
pvcreate /dev/loop18


# создание VG
vgcreate vgdata /dev/loop15 /dev/loop16 /dev/loop17  /dev/loop18


# создание LVM/RAID0
lvcreate -i4 -I64  -l 100%VG -n lvmirror vgdata

Файлы блоков LVM/RAID0 будут размещать на 3 типах физических устройств

  1. Шпиндельный диск HDD с интерфейсом SATA
  2. Твердотельное хранилище SSD с интерфейсом SATA
  3. NVME с интерфейсом M2

Для перемещения блоков LVM/RAID0 необходимо остановить VG, удалить виртуальные устройства, перенести файлы, создать устройства, запустить VG по следующему сценарию

# остановка VG
vgchange -a n vgdata


# деактивация виртуальных устройств
losetup -d /dev/loop15
losetup -d /dev/loop16
losetup -d /dev/loop17
losetup -d /dev/loop18


# перемещение файлов-блоков LVM/RAID0
mv sda* /путь/


cd /путь/

# создание виртуальных устройств
losetup --partscan --find --show  sda1.dd
losetup --partscan --find --show  sda2.dd
losetup --partscan --find --show  sda3.dd
losetup --partscan --find --show  sda4.dd


# запуск VG
vgchange -a y vgdata

Ниже будут показаны три комбинации конфигураций, в каждой конфигурации по два скриншота замеров производительности диска на котором размещёны блоки LVM/RAID0 и замер производительности LVM/RAID0

Первая, самая медленная, конфигурация: здесь блоки raid размещаются на SSD с интерфейсом SATA

средняя скорость чтения с SSD/SATA диска 540Мб/с

SSD/SATARAID0/LVM on SSD SATA

 

Вторая конфигурация: здесь блоки raid размещаются на обычном шпиндельном SATA диске

Средняя скорость чтения SATA 144Мб/с

SATARAID0/LVM on SATA

 

 

Последняя, самая быстрая конфигурация: здесь блоки raid размещаются на скоростном NVME установленнам через переходник в слот PCI-Express

Средняя скорость чтения NVME 2,7Гб/м

NVME/M2RAID0/LVM on NVME

Вывод: с помощью LVM/Raid можно получить повышение производительности цифрового хранилища.

Получается, можно взять обычный шпиндельный SATA диск, разделить его на 4 раздел, на их основе создать LVM/RAID0 и получить увеличение скорости чтения в несколько раз

даже звучит дико

сводная таблица, в кавычках количество разделов используемых в LVM/RAID0

SATA (WDC WD3000FYYZ-01UL1B0) 143,3 Мб/с  
LVM/RAID0(1) SATA 3,0 Гб/с 117,1 Мб/с
LVM/RAID0(2) SATA 3,1 Гб/с 64,9 Мб/с
LVM/RAID0(3) SATA 3,9 Гб/с 85,9 Мб/с
LVM/RAID0(4) SATA 5.2 Гб/с 92.8 Мб/с
LVM/RAID0(6) SATA 5,5 Гб/с 73,3 Мб/с
SSD/SATA (Samsung SSD 870 QVO) 540.9 Мб/с  
LVM/RAID0(1) SSD/SATA 2,2 Гб/с 74,5 Мб/с
LVM/RAID0(2) SSD/SATA 3,7 Гб/с 66,7 Мб/с
LVM/RAID0(3) SSD/SATA 5,7 Гб/с 72,4 Мб/с
LVM/RAID0(4) SSD/SATA 5.1 Гб/с 71.7 Мб/с
LVM/RAID0(6) SSD/SATA 7,4 Гб/с 70,9 Мб/с
NVME/M2 (Samsung SSD 970 EVO Plus) 2.7 Гб/с  
LVM/RAID0(1) NVME/M2 2,4 Гб/с 457,3 Мб/с
LVM/RAID0(2) NVME/M2 3.7 Гб/с 351,9 Мб/с
LVM/RAID0(3) NVME/M2 4,2 Гб/с 453,1 Мб/с
LVM/RAID0(4) NVME/M2 5.5 Гб/с 522.4 Мб/с
LVM/RAID0(6) NVME/M2 7,9 Гб/с 462,7 Мб/с

 


19 января 2023 Linux


Наконец-то, спустя 10 лет, пришлось добавлять наши родные сертификаты, есть потенциально рабочий гайд установки корневого сертификата минцифры на RedHat/Сentos, а я представляю гайд для Debian/Ubuntu

# перейти в директорию с сертифкатами
cd /usr/local/share/ca-certificates

# скачать корневые сертификаты минцифры РФ
wget https://gu-st.ru/content/lending/russian_trusted_root_ca_pem.crt https://gu-st.ru/content/lending/russian_trusted_sub_ca_pem.crt

# обновить список доверенных сертификатов операционной системы
update-ca-certificates --verbose

Вот и всё


22 декабря 2022 27 декабря 2022 Linux


Управление dd образами производится в 4 операции

sudo losetup --partscan --find --read-only --show  file.dd 

# создаёт виртуальный Диск и отображает имя файла виртуального диска, в моём случае /dev/loop15
# список разделов можно посмотреть вот так sudo fdisk -l /dev/loop15

sudo mount /dev/loop15p2 /mnt

# монтирует второй раздел виртуальный диска в директорую /mnt/
# тут какие то работы с данными образами

sudo umount /mnt 

# отмонтировать

sudo losetup -d /dev/loop15 

# удалить виртуальный диск

 


05 ноября 2022 25 января 2023 Linux Linux OpenVPN Docker


Если нужно быстро запустить VPN на каком то удалённом сервере то проще всего воспользоваться готовым решением https://github.com/kylemanna/docker-openvpn

Затем делаете сколько нужно VPN ключей с помощью этой команды

docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full USERNAME nopass

выгружаете в хостовую машину

docker run -v $OVPN_DATA:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient USERNAME  > USERNAME.ovpn

И всё, можно пользоваться

Чтобы в дальнейшем сохранилась возможность генерировать новые ключи необходимо восстанавливать значение export OVPN_DATA="ovpn-data-example" и использовать passkey использованный для генерации корневого сертификата

Посмотреть статус OpenVPN сервера можно вот так

docker exec -it funny_varahamihira ovpn_status

Если необходимо запустить VPN клиента на постоянной основе, например на ubuntu сервере, то необходимо сгенерировать ключ для этого сервера, скопировать его в директорию /etc/openvpn/client.conf

и разрешить автозапуск

stemctl enable openvpn@client

 


03 марта 2022 Linux mpd songs amq


После блокировки западных стриминговых платных платформ можно оживить устройство Songs AMQ с помощью MPD

На любом хостинг-сервере ставим mpd

apt install mpd

закачиваем музыку в /var/lib/mpd/music

меняем на неё права

chown -R mpd:nogroup /var/lib/mpd/music/

в файле конфигурации /etc/mpd.conf можно оставить только такие настройки

playlist_directory        "/var/lib/mpd/playlists"
db_file            "/var/lib/mpd/tag_cache"
log_file            "/var/log/mpd/mpd.log"
pid_file            "/run/mpd/pid"
state_file            "/var/lib/mpd/state"
sticker_file                   "/var/lib/mpd/sticker.sql"
user                "mpd"
bind_to_address        "0.0.0.0" # слушаем все вшешние адрес
port                "6600"
password                        "Z2022.02.24@read,add,control,admin"
input {
        plugin "curl"
}
audio_output {    
    type        "httpd"    
    encoder     "lame"          # кодек lame необходим для работы с Songs AMQ
    port        "8000"    
    bitrate     "256"             # повышенный битрейт
    format      "44100:16:1"    
}
filesystem_charset        "UTF-8"

перезапускаем mpd

service mpd restart

Полученную ссылку в виде http://хостинг-сервер:8000 прописываем в songsApp

Всё работает. Управлять можно через приложение GMPC, так же есть приложения управления mpd для Android. Для управления используем адрес [хостинг-сервер], порт 6600, пароль из опции password


20 мая 2021 Linux


выключить звуковой сервер

killall -9 pulseaudio

запустить звуковой сервер

pulseaudio -D

 


15 января 2018 Linux Ubuntu git


Для того чтобы смержить два проекта потребуется git начиная с версии >=2.9. Такого нет в репозитариях стабильной версии Ubuntu 16.04. Для установки более новой версии необходимо сделать вот так:

sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git

вуаля:

ffsdmad@ffsdmad:~/Project$ git --version
git version 2.15.1

 


04 января 2018 05 января 2018 Linux uuencode mysqldump bash


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

Но нам ни кто не мешает поступить следующим образом, полученный дамп базы данных сжимается архиватором (для уменьшения размера), а затем полученный архив отсылается на почту администратора сайта, например на gmail. А для того чтобы не захламлять почтоый ящик регулярными дампами можно настроить ящик так, чтобы он письма с дампом базы данных перекладывал в спам. Таким образом, письмо не мешает работать с почтой и гмайл самостоятельно удаляет слишком старый спам и у вас всегда будет доступна самая актульаня версия базы данных, а устаревшие будут автоматически удаляться. Даже если не настраивать перенос писем в спам, то можно удалять письмо и оно автоматически будет удаленно через n-дней, так уж устроен gmail

У меня на одной базе данных проявилась проблема, так как база данных получалась слишком большая из-за таблицы которая хранила тексты входящей почты. Эти данные не являются актульными и я просто не включал их в дамп базы данных с помощью опции --ignore-table

Таким образом у меня получился вот такой скрипт

#!/bin/bash

site_name="site-name.ru" # переменная с именем проекта

# формирование имения файла дампа с датой
file_base_name="/home/$site_name/backup/$site_name-`date +%F`.sql.bz2"

# создание дампа резервной копии
mysqldump -u логин -pпароль $site_name --ignore-table $site_name.mails | bzip2  > $file_base_name

# отправка дампа на почту
uuencode  $file_base_name  $file_base_name | mail -s "backup $site_name `date '+%Y-%m-%d'`" admin@gmail.com

# удаление резервных копий старше 7 дней
find /home/$site_name/backup/ -ctime +7 -delete

#PS, утилита uuencode входит в состав пакета sharutils

 


03 января 2018 04 января 2018 Linux DNS CNAME host


Когда Яндекс.домены просят подтвердить домен с помощью CNAME записи то этот поддомен прописывается в панели управления доменом у хостера, а затем проверяется с помощью следующей команды

host -t CNAME python.breys.ru ns1.firstvds.ru
Using domain server:
Name: ns1.firstvds.ru
Address: 82.146.43.2#53
Aliases: 

python.breys.ru has no CNAME record

в выхлопе команды будет видно является ли запись типа CNAME, в данном случае не является, в от этот поддомен является CNAME на breys.ru

host -t CNAME static.python.breys.ru ns1.firstvds.ru
Using domain server:
Name: ns1.firstvds.ru
Address: 82.146.43.2#53
Aliases: 

static.python.breys.ru is an alias for breys.ru.

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

host -t MX breys.ru
breys.ru mail is handled by 20 mail.breys.ru.
breys.ru mail is handled by 10 mail.breys.ru.


host -t MX python.breys.ru
python.breys.ru has no MX recor

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