Справочник сисадмина

Сетевые службы

Служба = программа на сервере, ждущая подключений на определённом порту. Админ настраивает их десятками: от SSH до почты. Эта страница — расширенный справочник по самым востребованным сетевым сервисам: как они работают, какие порты занимают и как их правильно настроить на практике.

Порты и протоколы (расширенная шпаргалка)

Порты делятся на три диапазона: 0–1023 — системные/well-known (требуют root), 1024–49151 — зарегистрированные, 49152–65535 — динамические/ephemeral (клиентские). Протоколы: TCP (установка соединения, гарантия доставки), UDP (без соединения, быстрее, для DNS/NTP/VPN/QUIC).

ПортПротоколСлужбаНазначение / примечание
20/21TCPFTPПередача файлов. 21 — управление, 20 — данные (active mode). Небезопасен, используйте SFTP.
22TCPSSHЗащищённый удалённый терминал, туннели, SCP/SFTP.
23TCPTelnetУдалённый терминал БЕЗ шифрования. Не используйте в продакшене.
25TCPSMTPMTA→MTA доставка почты между серверами.
53UDP/TCPDNSРазрешение имён. UDP для обычных запросов, TCP для зонных трансферов/больших ответов.
67/68UDPDHCPРаздача IP (67 — сервер, 68 — клиент).
69UDPTFTPУпрощённая передача файлов (загрузка по сети, PXE).
80TCPHTTPВеб без шифрования. Редирект на 443.
110TCPPOP3Забор почты (загружает и удаляет с сервера).
123UDPNTPСинхронизация времени. Критично для логов и сертификатов.
137–139TCP/UDPNetBIOS/SMBСтарый SMB через NetBIOS. Закрывать в современных сетях.
143TCPIMAPЗабор почты с сохранением на сервере (письма синхронизируются).
161/162UDPSNMPМониторинг/управление сетевым оборудованием.
389TCP/UDPLDAPКаталог (аутентификация, адресная книга).
443TCPHTTPS/HTTP3Защищённый веб (TLS). HTTP/3 идёт поверх QUIC (UDP 443).
445TCPSMBФайловый/принтерный обмен Windows (современный, без NetBIOS).
465TCPSMTPSSMTP поверх TLS (устаревший, но работает).
514UDPSyslogОтправка логов (нешифрованный). Для защиты — 6514 (TLS).
587TCPSMTP SubmissionОтправка почты почтовым клиентом (аутентификация, STARTTLS).
636TCPLDAPSLDAP поверх TLS.
993TCPIMAPSIMAP поверх TLS.
995TCPPOP3SPOP3 поверх TLS.
1433TCPMS SQLMicrosoft SQL Server.
1521TCPOracle DBOracle Database listener.
2049TCP/UDPNFSСетевая файловая система Linux (через RPC).
3128TCPSquidПрокси-сервер (частый порт).
3306TCPMySQL/MariaDBРеляционная БД.
3389TCPRDPУдалённый рабочий стол Windows.
5432TCPPostgreSQLРеляционная БД.
5985/5986TCPWinRMУдалённое управление Windows (5986 — HTTPS).
6379TCPRedisIn-memory хранилище/кэш.
8080TCPHTTP-altАльтернативный веб-порт (прокси, dev, Tomcat).
8443TCPHTTPS-altАльтернативный защищённый веб-порт.
9200TCPElasticsearchПоиск/логи (REST API).
11211TCP/UDPMemcachedРаспределённый кэш. Не выставляйте в сеть.
2375/2376TCPDocker2375 — нешифрованный daemon, 2376 — TLS. Держите закрытым.
27017TCPMongoDBДокументная БД.
1194UDPOpenVPNVPN (по умолчанию).
50000TCPDB2IBM DB2.
51820UDPWireGuardСовременный VPN (по умолчанию).
Проверить, кто слушает порт на локальной машине: ss -tulnp (или netstat -tulnp). Проверить порт удалённо: nc -zv host port или nmap -sV host.

SSH — защищённый удалённый доступ (глубоко)

SSH (Secure Shell) — фундамент админского доступа. Шифрует сессию, аутентифицирует стороны и даёт терминал, туннели и безопасную передачу файлов.

Генерация ключей (типы)

Ключи безопаснее паролей: даже при перехвате трафика взлом вычислительно невозможен.

# Ed25519 — современный, быстрый, короткий (РЕКОМЕНДУЕТСЯ)
ssh-keygen -t ed25519 -C "admin@server"

# RSA 4096 — универсальный, поддерживается везде
ssh-keygen -t rsa -b 4096 -C "admin@server"

# ECDSA (P-521)
ssh-keygen -t ecdsa -b 521 -C "admin@server"

# Ключ с парольной фразой (защита от кражи файла):
ssh-keygen -t ed25519      # по запросу введите passphrase

# Копировать открытый ключ на сервер
ssh-copy-id user@host
# или вручную:
cat ~/.ssh/id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Ed25519 сейчас — золотой стандарт (RFC 8032, Curve25519). RSA оставьте для старых систем, где нет поддержки ed25519. DSA (dsa) — устарел и небезопасен, не используйте.

Конфиг-файл клиента ~/.ssh/config

Позволяет задавать хосты, ключи, порты и прокси-переходы один раз и подключаться по короткому имени.

# ~/.ssh/config  (права chmod 600)
Host web
    HostName 192.168.1.10
    User deploy
    Port 2222
    IdentityFile ~/.ssh/id_ed25519

Host bastion
    HostName bastion.example.com
    User admin
    IdentityFile ~/.ssh/id_ed25519
    Port 22

# Целевой сервер доступен только ЧЕРЕЗ bastion (ProxyJump)
Host internal
    HostName 10.0.0.5
    User deploy
    IdentityFile ~/.ssh/id_ed25519
    ProxyJump bastion

# Применение:
ssh web                 # вместо ssh -p 2222 deploy@192.168.1.10
ssh -J bastion internal # явный ProxyJump из командной строки
ssh internal            # то же благодаря ProxyJump в конфиге

ssh-agent (кэширование ключей с passphrase)

eval "$(ssh-agent -s)"       # запустить агента
ssh-add ~/.ssh/id_ed25519    # добавить ключ (спросит passphrase один раз)
ssh-add -l                   # список загруженных ключей
ssh-add -t 3600 key          # добавить на 1 час
# В macOS: ssh-add --apple-use-keychain для постоянного хранения

Передача файлов: scp, rsync, sftp, mosh

# scp — копирование по SSH
scp file.txt user@host:/tmp/            # локально → сервер
scp -P 2222 -r ./app user@host:/srv/    # рекурсивно, нестандартный порт
scp -C file.iso user@host:/tmp/         # со сжатием

# rsync over SSH — инкрементальная синхронизация (экономит трафик)
rsync -avz -e "ssh -p 2222" ./site/ user@host:/var/www/site/
rsync -avz --delete ./data/ user@host:/backup/data/   # зеркало (удаляет лишнее)

# sftp — интерактивный защищённый FTP-подобный клиент
sftp user@host
sftp> put local.txt
sftp> get remote.txt
sftp> ls /remote/path

# mosh — мобильная оболочка: не рвётся при смене IP/сна ноутбука
sudo apt install mosh
mosh user@host

Туннелирование (port forwarding)

ТипФлагЧто делаетПример
Local-LПробрасывает локальный порт на удалённый ресурс через серверssh -L 8080:localhost:80 user@host → открыть localhost:8080 = порт 80 на сервере
Remote-RПробрасывает порт с сервера к вам (обратный туннель)ssh -R 9000:localhost:3000 user@host → сервер видит ваш :3000 на своём :9000
Dynamic-DSOCKS5-прокси через SSH (весь трафик приложений)ssh -D 1080 user@host → в браузере SOCKS5 127.0.0.1:1080
# Локальный туннель: зайти на БД, слушающую только localhost на сервере
ssh -N -L 5432:127.0.0.1:5432 user@db-host
# теперь psql -h localhost подключается к удалённому PostgreSQL

# SOCKS-прокси для безопасного серфинга через сервер
ssh -N -D 1080 user@host
# Firefox: Настройки сети → Ручная → SOCKS5 127.0.0.1:1080
-N = не запускать команду/оболочку (только туннель), -f = уйти в фон. ProxyJump (-J) — удобная замена длинным ProxyCommand для доступа к серверам за NAT/бастионом.

Серверный конфиг /etc/ssh/sshd_config

Port 22
PermitRootLogin no          # корень не логинится по SSH
PasswordAuthentication no   # только ключи (отсекает брутфорс паролей)
PubkeyAuthentication yes
AllowUsers deploy admin     # кто может заходить (whitelist)
X11Forwarding no
MaxAuthTries 3
ClientAliveInterval 300

# Применить:
sudo sshd -t                # проверить синтаксис
sudo systemctl restart ssh

DNS-сервер (BIND/named, dnsmasq, unbound)

DNS переводит имя (google.com) в IP: рекурсивный резолвер → корневые серверы → TLD → авторитетные серверы. Для локальной сети удобно поднять свой резолвер/кэш.

dnsmasq — простой кэширующий DNS + DHCP

sudo apt install dnsmasq
# /etc/dnsmasq.conf
server=8.8.8.8            # вышестоящий (forwarder) резолвер
server=1.1.1.1
cache-size=1000           # кэш записей
local=/lan/               # домен локальной сети
address=/printer.lan/192.168.1.50   # статическая запись
listen-address=127.0.0.1,192.168.1.1
sudo systemctl enable --now dnsmasq

BIND9 (named) — полноценный авторитетный + кэширующий

sudo apt install bind9
# /etc/bind/named.conf.options — forwarders и управление
options {
    forwarders { 8.8.8.8; 1.1.1.1; };
    recursion yes;
    listen-on { 127.0.0.1; 192.168.1.1; };
    allow-query { localhost; 192.168.1.0/24; };
};

# Зона (пример локальной)
# /etc/bind/named.conf.local
zone "example.lan" {
    type master;
    file "/etc/bind/db.example.lan";
};

# /etc/bind/db.example.lan — файл зоны
$TTL 86400
@   IN  SOA ns.example.lan. admin.example.lan. (
        2024010101 ; serial
        3600       ; refresh
        1800       ; retry
        604800     ; expire
        86400 )    ; minimum
@       IN  NS  ns.example.lan.
ns      IN  A   192.168.1.1
www     IN  A   192.168.1.10
mail    IN  MX  10 mail.example.lan.
web     IN  CNAME www.example.lan.

# Проверка и перезапуск
named-checkconf
named-checkzone example.lan /etc/bind/db.example.lan
sudo systemctl restart named

unbound — современный валидирующий кэш (с DNSSEC)

sudo apt install unbound
# /etc/unbound/unbound.conf.d/forward.conf
forward-zone:
    name: "."
    forward-addr: 8.8.8.8
    forward-addr: 1.1.1.1
sudo unbound-checkconf
sudo systemctl enable --now unbound

Типы записей и диагностика

ЗаписьНазначение
Aимя → IPv4
AAAAимя → IPv6
CNAMEпсевдоним (поддомен → другое имя)
MXпочтовый сервер для домена
NSавторитетный сервер имён
TXTтекст (SPF/DKIM/DMARC для почты, верификация)
PTRобратная зона IP → имя (reverse DNS)
SRVслужба: хост+порт (напр. LDAP, SIP)
nslookup example.com
dig example.com A
dig example.com MX
dig +short example.com
dig @8.8.8.8 example.com           # запрос к конкретному серверу
dig example.com TXT                # текстовые записи
systemd-resolve --status           # резолвер в systemd-системах

DHCP-сервер (isc-dhcp-server, dnsmasq)

DHCP выдаёт клиенту IP, маску, шлюз и DNS на время (аренда/lease). Процесс: DISCOVER → OFFER → REQUEST → ACK.

ISC DHCP Server

sudo apt install isc-dhcp-server
# /etc/dhcp/dhcpd.conf
default-lease-time 600;
max-lease-time 7200;
option domain-name "lan";
option domain-name-servers 192.168.1.1, 8.8.8.8;

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.100 192.168.1.200;
  option routers 192.168.1.1;
  option broadcast-address 192.168.1.255;
}

# Резервирование (static lease по MAC)
host printer {
  hardware ethernet 00:11:22:33:44:55;
  fixed-address 192.168.1.50;
}
sudo systemctl restart isc-dhcp-server

dnsmasq как DHCP + опции и relay

# /etc/dnsmasq.conf
dhcp-range=192.168.1.100,192.168.1.200,255.255.255.0,12h
dhcp-option=option:router,192.168.1.1
dhcp-option=option:dns-server,192.168.1.1
dhcp-option=option:ntp-server,192.168.1.1
dhcp-host=00:11:22:33:44:55,192.168.1.50,printer,infinite   # резервирование

# DHCP Relay (если сервер в другом сегменте):
sudo apt install isc-dhcp-relay
# INTERFACES="eth0"  SERVERS="192.168.1.1"  в /etc/default/isc-dhcp-relay
В сети должен быть только один DHCP-сервер (или согласованные зоны), иначе клиенты получат конфликтующие настройки. Если роутер уже раздаёт DHCP — отключи его или настрой неперекрывающиеся диапазоны.

Веб-серверы (Nginx и Apache)

Два главных веб-сервера: Nginx (событийная архитектура, отличный reverse proxy/балансировщик, меньше памяти) и Apache (модульность, .htaccess, огромная экосистема).

КритерийNginxApache
Архитектураevent-driven (один процесс на ядро)prefork/worker/event (процессы/потоки)
Reverse proxy / LBРодная сила, лёгкийmod_proxy, чуть тяжелее
.htaccessНет (только конфиг целиком)Да (гибко per-directory)
Статические файлыОчень быстроХорошо
Когда выбиратьФронтенд, балансировка, высокая нагрузкаЛегаси, shared-хостинг, много .htaccess-логики

Virtual host (Nginx)

# /etc/nginx/sites-available/example.com → симлинк в sites-enabled/
server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}
# Активация:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Reverse proxy и балансировка нагрузки

# Балансировка (upstream) в Nginx
upstream backend {
    least_conn;                 # или round_robin / ip_hash
    server 10.0.0.1:8080 weight=2;
    server 10.0.0.2:8080;
    server 10.0.0.3:8080 backup;
}
server {
    listen 80;
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

# Apache: mod_proxy_balancer
<Proxy "balancer://mycluster">
    BalancerMember "http://10.0.0.1:8080"
    BalancerMember "http://10.0.0.2:8080"
</Proxy>
ProxyPass        "/" "balancer://mycluster/"
ProxyPassReverse "/" "balancer://mycluster/"

Сжатие (gzip/brotli) и кэширование

# Nginx — gzip
gzip on;
gzip_types text/css application/javascript image/svg+xml application/json;
gzip_min_length 1024;

# Nginx — brotli (модуль ngx_brotli, ещё лучше сжимает)
brotli on;
brotli_types text/css application/javascript application/json;

# Кэширование статических файлов браузером
location ~* \.(jpg|css|js|png)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
}

TLS: Let's Encrypt / certbot

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
# Автообновление (проверка каждый день, реальное обновление при сроке):
sudo certbot renew --dry-run
# cron/systemd timer уже установлен certbot-ом:
0 3 * * * certbot renew --quiet

# Включить HTTP/2 и HSTS:
# listen 443 ssl http2;
# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;

HTTP/2 и HTTP/3 (QUIC)

HTTP/2 мультиплексирует запросы по одному TCP-соединению. HTTP/3 работает поверх QUIC (UDP) и обязателен TLS 1.3 — быстрее при потерях пакетов и смене сети.

# Nginx 1.25.0+ с модулем http_v3 (listen 443 quic)
server {
    listen 443 ssl;
    listen 443 quic reuseport;     # HTTP/3 поверх UDP
    http2 on;                      # HTTP/2 поверх TCP
    ssl_protocols TLSv1.3;
    add_header Alt-Svc 'h3=":443"; ma=86400';   # подсказка браузеру про h3
    # ... ssl_certificate / ssl_certificate_key ...
}
# Проверка: curl --http3 https://example.com  (или через DevTools → Protocol h3)

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

# Nginx — важные заголовки безопасности
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;  # HSTS
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;        # защита от clickjacking
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; script-src 'self'" always;

# Редирект HTTP → HTTPS
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

# robots.txt (запретить индексацию служебных путей)
# /var/www/example.com/robots.txt
# User-agent: *
# Disallow: /admin/
# Disallow: /internal/
CSP (Content-Security-Policy) — мощная защита от XSS: явно разрешает источники скриптов/стилей/фреймов. Вводите осторожно, тестируйте на Content-Security-Policy-Report-Only, иначе сломаете легитимные скрипты.

Базы данных

Сервер приложений хранит данные в СУБД. Основные:

MySQL / MariaDB

sudo apt install mariadb-server
sudo mysql_secure_installation   # пароль root, удалить тестовые БД/пользователей
sudo systemctl enable --now mariadb

# Подключение и создание БД/пользователя
sudo mysql -u root -p
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPass!';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;

# Бэкап и восстановление (mysqldump)
mysqldump -u root -p appdb > appdb-$(date +%F).sql
mysql -u root -p appdb < appdb-2026-01-01.sql

# Репликация master-slave (кратко):
# Master: server-id=1; log_bin=mysql-bin;  CREATE USER 'repl'@'%' IDENTIFIED BY 'x'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
# Slave:  server-id=2; CHANGE MASTER TO MASTER_HOST='master', MASTER_USER='repl', MASTER_PASSWORD='x', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=123; START SLAVE;

PostgreSQL

sudo apt install postgresql
sudo -u postgres psql
CREATE DATABASE appdb;
CREATE ROLE appuser WITH LOGIN PASSWORD 'StrongPass!';
GRANT ALL PRIVILEGES ON DATABASE appdb TO appuser;

# pg_hba.conf — контроль доступа (host/database/user/address/method)
# /etc/postgresql/16/main/pg_hba.conf
local   all   postgres      peer
host    all   all   127.0.0.1/32   scram-sha-256   # только localhost, шифрованный пароль
host    all   all   10.0.0.0/24    md5

# Бэкап и восстановление
pg_dump -U appuser appdb > appdb.sql
psql -U appuser appdb < appdb.sql
# Логический формат каталога: pg_dump -Fd appdb -f /backup/appdb  (параллельно)

Redis

sudo apt install redis-server
# /etc/redis/redis.conf
bind 127.0.0.1            # слушать только localhost (НЕ 0.0.0.0 в проде)
requirepass StrongPass!   # обязательно пароль
save 900 1                # snapshot каждые 15 мин при >=1 изменении
appendonly yes            # AOF-журнал для надёжной persistence

# Клиент
redis-cli
127.0.0.1:6379> SET key "value" EX 3600
127.0.0.1:6379> GET key
Когда что использовать: PostgreSQL — сложная логика, JSON, аналитика, строгая целостность. MySQL/MariaDB — классический веб, простота, зрелость. Redis — кэш, счётчики, сессии, pub/sub, очереди (не основное хранилище истины без persistence).
Никогда не выставляй БД напрямую в интернет без пароля и ограничения по IP. Базы данных — главная цель взломщиков. Слушай их только на localhost, если нет нужды в удалённом доступе. Redis без requirepass и на 0.0.0.0 — классическая дыра, ведущая к RCE.

Почта: архитектура, протоколы, аутентификация, практика и доставляемость

Электронная почта — старейшая и до сих пор критичная служба (уведомления, биллинг, восстановление паролей). Понимать её архитектуру админу обязательно, даже если поднимаете не свой сервер, а настраиваете релеи и DNS.

Компоненты почтовой системы

Письмо проходит цепочку агентов. Важно понимать, кто на каком этапе отвечает:

КомпонентРольПримерыПорты
MUA (Mail User Agent)Почтовый клиент, через который пользователь читает/пишет письмаThunderbird, Outlook, mutt, веб-интерфейс
MSA (Mail Submission Agent)Принимает исходящие письма от клиента, требует аутентификации, шифруетPostfix (submission), Exim587 (STARTTLS), 465 (SMTPS)
MTA (Mail Transfer Agent)Транспортирует почту между серверами (маршрутизация, очереди)Postfix, Exim, Sendmail, Exchange25 (без шифрования)
MDA (Mail Delivery Agent)Кладёт письмо в почтовый ящик пользователя, фильтрует (спам/правила)Dovecot (LMTP), Procmail, Sieve24 (LMTP, локально)
Сервер почты (IMAP/POP3)Отдаёт накопленную почту клиентуDovecot, Cyrus, Exchange143/993, 110/995

Путь исходящего письма: MUA → (587, авторизация) → MSA → MTA → (25, между серверами) → MTA получателя → MDA → ящик → (993, IMAP) → MUA получателя.

Протоколы подробно

ПротоколПортыНазначение и особенности
SMTP (Simple Mail Transfer Protocol)25 / 465 / 587Передача почты. Порт 25 — сервер-сервер (часто без шифрования, блокируется провайдерами для домашних IP). 587 — отправка от клиента с STARTTLS и логином. 465 — SMTPS (шифрование сразу, legacy, но широко поддерживается).
ESMTPРасширение SMTP (EHLO, STARTTLS, аутентификация, размер сообщения). Современный «SMTP» на деле это ESMTP.
POP3 (Post Office Protocol v3)110 / 995Забирает письма и обычно удаляет их с сервера. Подходит для одного устройства. Состояние «прочитано/отвечено» не синхронизируется между клиентами.
IMAP (Internet Message Access Protocol)143 / 993Оставляет письма на сервере, синхронизирует папки/флаги между всеми устройствами. Современный выбор для телефона + ноута + веба.
STARTTLS — это «обнови обычное соединение до зашифрованного» поверх того же порта (587/143). SMTPS/IMAPS/POP3S — это отдельный порт, где TLS включается сразу (465/993/995). Всегда включайте шифрование: почта без TLS перехватывается «на лету».

DNS-записи для почты

ЗаписьТипЗачем
MX (Mail eXchanger)MXУказывает, какой сервер принимает почту для домена. Чем меньше число приоритета — тем выше приоритет.
A / AAAAA, AAAAСам почтовый сервер (mail.example.com) должен резолвиться в IP.
PTR (обратная зона)PTRIP → имя. Важна для доставляемости: имя из PTR должно совпадать с HELO/EHLO (FCrDNS).
SPFTXTСписок разрешённых отправителей от имени домена.
DKIMTXTПубличный ключ для проверки цифровой подписи писем.
DMARCTXTПолитика обработки писем, не прошедших SPF/DKIM, и отчёты.
autodiscover / SRVSRV, CNAMEАвтонастройка клиентов (Outlook, мобильные).

Аутентификация почты: SPF / DKIM / DMARC

Эти TXT-записи — три кита защиты от спуфинга (подделки отправителя) и повышения доставляемости. Без них ваши письма массово уходят в спам.

# MX — куда доставлять почту домена
example.com.            IN MX 10 mail.example.com.
mail.example.com.      IN A      203.0.113.10

# SPF — кто имеет право отправлять от имени домена
# v=spf1 — версия; mx, a — разрешить серверы из MX и A;
# ip4:203.0.113.10 — конкретный IP; include: — доверять ещё и этому домену
# -all = ЖЁСТКО отвергать всё остальное (лучше ~all на старте, потом -all)
example.com.  IN TXT "v=spf1 mx a ip4:203.0.113.10 include:_spf.google.com -all"

# DKIM — подпись писем криптографическим ключом (публичный — в TXT по селектору)
# selector._domainkey.example.com — "selector" генерирует OpenDKIM/Dovecot
selector._domainkey.example.com.  IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkq...AQAB"

# DMARC — политика и отчёты
# p=none        — только наблюдать (стартовая)
# p=quarantine  — класть в спам, если проверка не прошла
# p=reject      — отвергать (финальная, когда всё настроено)
# rua/ruf       — куда присылать агрегированные/форензик-отчёты
# adkim=s / aspf=s — strict совпадение меток/домена с заголовком From
_dmarc.example.com.  IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com; adkim=s; aspf=s"
Порядок внедрения: 1) настройте SPF и DKIM и убедитесь, что подписи валидны; 2) DMARC в режиме p=none, изучите отчёты (rua); 3) когда видите, что легитимная почта проходит — переведите в quarantine, затем reject. Резкая установка -all в SPF и p=reject в DMARC до проверки может «отрезать» легитимную рассылку.

Практика: поднимаем почтовый сервер (Postfix + Dovecot)

Минимальный рабочий стек на Ubuntu: Postfix (MTA+MSA) + Dovecot (IMAP/MDA, SASL-аутентификация).

# Установка
sudo apt install postfix dovecot-core dovecot-imapd dovecot-lmtpd

# --- /etc/postfix/main.cf (ключевые строки) ---
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost
# Только для своих доменов; всё остальное — релей запрещён (нет open relay!)
mynetworks = 127.0.0.0/8 [::1]/128
inet_interfaces = all

# TLS (STARTTLS на 25/587, SMTPS на 465)
smtpd_tls_cert_file = /etc/letsencrypt/live/example.com/fullchain.pem
smtpd_tls_key_file  = /etc/letsencrypt/live/example.com/privkey.pem
smtpd_use_tls = yes
smtpd_tls_security_level = may
smtp_tls_security_level = may

# Аутентификация клиентов через Dovecot SASL
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
# Запретить анонимную отправку без логина (только для авторизованных)
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

# Доставка локальным пользователям через Dovecot LMTP
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = example.com
virtual_mailbox_maps = hash:/etc/postfix/vmailbox

# --- /etc/dovecot/conf.d/10-mail.conf ---
mail_location = maildir:~/Maildir
mail_privileged_group = mail

# --- /etc/dovecot/conf.d/10-auth.conf ---
disable_plaintext_auth = yes       # пароли только по TLS
auth_mechanisms = plain login

# --- /etc/dovecot/conf.d/10-master.conf (фрагмент) ---
service auth {
  unix_listener auth-userdb { mode = 0660; user = dovecot }
  unix_listener /var/spool/postfix/private/auth { mode = 0660; user = postfix }
}
service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0600 } }

# Применить
sudo postfix check
sudo systemctl restart postfix dovecot

Создание почтового ящика (виртуального пользователя):

# /etc/postfix/vmailbox
user@example.com    example.com/user/
# затем:
sudo postmap /etc/postfix/vmailbox
sudo systemctl reload postfix
# Добавить системного пользователя-владельца ящика и пароль (через doveadm pw)
sudo doveadm pw -s SSHA256   # вставить хэш в passdb

Репутация IP и доставляемость (почему письма в спаме)

Даже с идеальным сервером письма могут не доходить. Решающий фактор — репутация отправляющего IP.

Безопасность почты

Диагностика почты

Логи — главный источник правды. На Debian/Ubuntu это /var/log/mail.log (или /var/log/maillog на RHEL).

sudo tail -f /var/log/mail.log          # следить за доставкой в реальном времени
sudo postqueue -p                        # очередь исходящих писем
sudo postqueue -f                        # форсировать повторную отправку
echo "test" | mail -s "Test $(date)" user@example.com

# Проверка DNS-записей почты
dig example.com MX +short
dig example.com TXT +short              # увидите SPF
dig selector._domainkey.example.com TXT +short
dig _dmarc.example.com TXT +short
dig -x 203.0.113.10 +short              # обратная зона (PTR)

# Проверка порта 25 снаружи (может блокироваться провайдером)
nc -zv mx.example.com 25

Расшифровка кодов ответа SMTP (в логах и при telnet mx 25):

КодЗначение
220Сервис готов (приветствие)
250OK, команда принята
421Сервис недоступен, соединение закрывается (часто greylisting/перегруз)
450Почтовый ящик временно недоступен (retry later)
451Локальная ошибка обработки (повторите)
550Ящик/домен не существует (permanent failure — баунс)
554Транзакция отклонена (часто — в блэклисте / policy)

Когда НЕ поднимать свой сервер

Свой почтовый сервер оправдан для обучения, изоляции или специфичных требований. В остальных случаях часто выгоднее:

# Postfix как релей через внешний сервис (пример Mailgun/SES)
relayhost = [smtp.mailgun.org]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
Чек-лист «почта работает и доходит»: ① MX указывает на ваш сервер; ② A-запись mail.example.com резолвится; ③ PTR совпадает с HELO (FCrDNS); ④ SPF/DKIM/DMARC настроены и валидны (проверьте mail-tester.com); ⑤ TLS включён на 25/465/587/993; ⑥ нет open relay (тест на внешнем сканере); ⑦ IP не в блэклистах; ⑧ тестовое письмо дошло не в спам.
Почему свой почтовый сервер сложен: нужны корректные MX/SPF/DKIM/DMARC, репутация IP (новые IP часто уже в блэклистах или блокируются провайдерами на 25-м порту), обратный DNS (PTR), запрет открытого релея, мониторинг на компрометацию и своевременный warm-up. Это постоянная поддержка, а не «настроил и забыл». Для старта часто выгоднее готовые сервисы (Yandex 360, Mailgun, Zoho, M365) или релей через них.

Файловый обмен (SMB, NFS, FTP/SFTP)

SMB (Samba) — Windows и Linux

sudo apt install samba
# /etc/samba/smb.conf
[shared]
   path = /srv/samba/shared
   browseable = yes
   read only = no
   guest ok = no
   valid users = @smbgroup

sudo smbpasswd -a username        # добавить пользователя Samba
sudo systemctl restart smbd

# Клиент (Linux подключить шару):
sudo mount -t cifs //server/share /mnt/share -o username=user,password=pass
# Windows:  \\server\share

NFS — Linux ↔ Linux

sudo apt install nfs-kernel-server
# /etc/exports
/srv/nfs 192.168.1.0/24(rw,sync,no_subtree_check,root_squash)
sudo exportfs -ra
sudo systemctl restart nfs-kernel-server

# Клиент:
sudo mount -t nfs server:/srv/nfs /mnt/nfs

FTP vs SFTP (безопасность)

FTP (21) шлёт логин/пароль и данные в открытом виде — небезопасен. SFTP (поверх SSH, порт 22) шифрует всё. Используйте SFTP всегда; FTP только в изолированных сценариях с TLS (FTPS).

# vsftpd (если FTP всё же нужен, с TLS)
sudo apt install vsftpd
# /etc/vsftpd.conf: anonymous_enable=NO, ssl_enable=YES, force_local_data_ssl=YES
# proftpd — альтернатива с гибкой конфигурацией

# SFTP — встроен в SSH, отдельный сервер не нужен:
sftp user@host
# Ограничить пользователя только SFTP (в sshd_config):
# Match User sftpuser
#     ChrootDirectory /srv/sftp
#     ForceCommand internal-sftp

VPN-серверы (WireGuard подробно, OpenVPN кратко)

WireGuard — современный, быстрый, простой

Минималистичный VPN на современной криптографии (Curve25519, ChaCha20, BLAKE2s). Конфиг в /etc/wireguard/wg0.conf.

# 1. Установка
sudo apt install wireguard

# 2. Генерация ключей (приватный + публичный)
umask 077
wg genkey | tee privatekey | wg pubkey > publickey
cat privatekey publickey

# 3. Серверный конфиг /etc/wireguard/wg0.conf
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <СЕРВЕРНЫЙ_ПРИВАТНЫЙ_КЛЮЧ>
# разрешить форвардинг и NAT (для выхода в интернет через VPN):
PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = <ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА>
AllowedIPs = 10.8.0.2/32

# 4. Клиентский конфиг (peer)
[Interface]
Address = 10.8.0.2/24
PrivateKey = <КЛИЕНТСКИЙ_ПРИВАТНЫЙ_КЛЮЧ>
DNS = 10.8.0.1

[Peer]
PublicKey = <ПУБЛИЧНЫЙ_КЛЮЧ_СЕРВЕРА>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0, ::/0     # весь трафик через VPN
PersistentKeepalive = 25          # держать туннель за NAT

# 5. Запуск
sudo wg-quick up wg0
sudo wg show                      # статус, хендшейки
sudo systemctl enable wg-quick@wg0
AllowedIPs определяет, какой трафик маршрутизируется в туннель (маршрутизация на уровне клиента). 0.0.0.0/0 = весь трафик; 10.8.0.0/24 = только сеть VPN (split tunnel).

OpenVPN — зрелый, на сертификатах (кратко)

sudo apt install openvpn easy-rsa
# Инициализация PKI и выпуск сертификатов (CA, сервер, клиенты):
./easyrsa init-pki
./easyrsa build-ca
./easyrsa build-server-full server nopass
./easyrsa build-client-full client1 nopass

# /etc/openvpn/server.conf (выдержка)
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
tls-auth ta.key 0
cipher AES-256-GCM
sudo systemctl start openvpn@server
WireGuard проще и быстрее, но не умеет per-user сертификаты/OTP из коробки и сложнее для централизованной отзывы ключей. OpenVPN гибче в корпоративных сценариях (рутинг, сертификаты, 2FA-плагины).

Мониторинг сервисов

# Node Exporter — собирает метрики хоста
sudo apt install prometheus-node-exporter
curl http://localhost:9100/metrics | head

# Uptime Kuma — docker-compose (см. раздел контейнеров)
# docker run -d --name uptime-kuma -p 3001:3001 -v uptimekuma:/app/data louislam/uptime-kuma:1

Контейнеры (Docker)

Docker упаковывает приложение с зависимостями в изолированный контейнер. Когда уместно: микросервисы, повторяемые окружения, CI/CD, быстрый масштаб.

# Установка (Ubuntu)
sudo apt install docker.io docker-compose-plugin
sudo systemctl enable --now docker
sudo usermod -aG docker $USER        # без sudo для текущего пользователя (выход/вход)

# Образы и контейнеры
docker pull nginx:stable
docker images
docker run -d --name web -p 8080:80 nginx:stable
docker ps
docker exec -it web bash
docker logs web
docker stop web && docker rm web

# Volumes (постоянные данные вне контейнера)
docker volume create appdata
docker run -d -v appdata:/var/lib/app mysql:8

# Сети
docker network create mynet
docker run -d --network mynet --name db postgres:16

docker-compose.yml (пример)

# docker-compose.yml (Compose Spec)
services:
  web:
    image: nginx:stable
    ports:
      - "8080:80"
    volumes:
      - ./site:/usr/share/nginx/html:ro
    networks:
      - frontend
    depends_on:
      - app

  app:
    image: myapp:1.2
    environment:
      - DB_HOST=db
      - DB_PASS=secret
    networks:
      - frontend
      - backend

  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=secret
    networks:
      - backend

volumes:
  pgdata:

networks:
  frontend:
  backend:

# Запуск:  docker compose up -d
# Логи:    docker compose logs -f
# Стоп:    docker compose down
Registry: публичный Docker Hub, либо приватный (Harbor, GitLab Registry, AWS ECR). Пингуйте образы по тегам и используйте digest (image@sha256:...) для воспроизводимости. Современная команда — docker compose (плагин), не путать со старым бинарником docker-compose.

Очереди сообщений (Kafka / RabbitMQ)

Для асинхронной обработки и развязки сервисов:

# RabbitMQ (docker)
docker run -d --name rabbit -p 5672:5672 -p 15672:15672 rabbitmq:management
# Веб-UI админа: http://host:15672  (guest/guest)

# Kafka (кратко, через docker-compose): образы bitnami/kafka или confluentinc
Выбор: RabbitMQ — когда важна гарантированная доставка конкретных задач и сложная маршрутизация. Kafka — когда нужен высоконагруженный поток событий, который можно «переиграть» заново (replay).