Сетевые службы
Служба = программа на сервере, ждущая подключений на определённом порту. Админ настраивает их десятками: от SSH до почты. Эта страница — расширенный справочник по самым востребованным сетевым сервисам: как они работают, какие порты занимают и как их правильно настроить на практике.
Порты и протоколы (расширенная шпаргалка)
Порты делятся на три диапазона: 0–1023 — системные/well-known (требуют root), 1024–49151 — зарегистрированные, 49152–65535 — динамические/ephemeral (клиентские). Протоколы: TCP (установка соединения, гарантия доставки), UDP (без соединения, быстрее, для DNS/NTP/VPN/QUIC).
| Порт | Протокол | Служба | Назначение / примечание |
|---|---|---|---|
| 20/21 | TCP | FTP | Передача файлов. 21 — управление, 20 — данные (active mode). Небезопасен, используйте SFTP. |
| 22 | TCP | SSH | Защищённый удалённый терминал, туннели, SCP/SFTP. |
| 23 | TCP | Telnet | Удалённый терминал БЕЗ шифрования. Не используйте в продакшене. |
| 25 | TCP | SMTP | MTA→MTA доставка почты между серверами. |
| 53 | UDP/TCP | DNS | Разрешение имён. UDP для обычных запросов, TCP для зонных трансферов/больших ответов. |
| 67/68 | UDP | DHCP | Раздача IP (67 — сервер, 68 — клиент). |
| 69 | UDP | TFTP | Упрощённая передача файлов (загрузка по сети, PXE). |
| 80 | TCP | HTTP | Веб без шифрования. Редирект на 443. |
| 110 | TCP | POP3 | Забор почты (загружает и удаляет с сервера). |
| 123 | UDP | NTP | Синхронизация времени. Критично для логов и сертификатов. |
| 137–139 | TCP/UDP | NetBIOS/SMB | Старый SMB через NetBIOS. Закрывать в современных сетях. |
| 143 | TCP | IMAP | Забор почты с сохранением на сервере (письма синхронизируются). |
| 161/162 | UDP | SNMP | Мониторинг/управление сетевым оборудованием. |
| 389 | TCP/UDP | LDAP | Каталог (аутентификация, адресная книга). |
| 443 | TCP | HTTPS/HTTP3 | Защищённый веб (TLS). HTTP/3 идёт поверх QUIC (UDP 443). |
| 445 | TCP | SMB | Файловый/принтерный обмен Windows (современный, без NetBIOS). |
| 465 | TCP | SMTPS | SMTP поверх TLS (устаревший, но работает). |
| 514 | UDP | Syslog | Отправка логов (нешифрованный). Для защиты — 6514 (TLS). |
| 587 | TCP | SMTP Submission | Отправка почты почтовым клиентом (аутентификация, STARTTLS). |
| 636 | TCP | LDAPS | LDAP поверх TLS. |
| 993 | TCP | IMAPS | IMAP поверх TLS. |
| 995 | TCP | POP3S | POP3 поверх TLS. |
| 1433 | TCP | MS SQL | Microsoft SQL Server. |
| 1521 | TCP | Oracle DB | Oracle Database listener. |
| 2049 | TCP/UDP | NFS | Сетевая файловая система Linux (через RPC). |
| 3128 | TCP | Squid | Прокси-сервер (частый порт). |
| 3306 | TCP | MySQL/MariaDB | Реляционная БД. |
| 3389 | TCP | RDP | Удалённый рабочий стол Windows. |
| 5432 | TCP | PostgreSQL | Реляционная БД. |
| 5985/5986 | TCP | WinRM | Удалённое управление Windows (5986 — HTTPS). |
| 6379 | TCP | Redis | In-memory хранилище/кэш. |
| 8080 | TCP | HTTP-alt | Альтернативный веб-порт (прокси, dev, Tomcat). |
| 8443 | TCP | HTTPS-alt | Альтернативный защищённый веб-порт. |
| 9200 | TCP | Elasticsearch | Поиск/логи (REST API). |
| 11211 | TCP/UDP | Memcached | Распределённый кэш. Не выставляйте в сеть. |
| 2375/2376 | TCP | Docker | 2375 — нешифрованный daemon, 2376 — TLS. Держите закрытым. |
| 27017 | TCP | MongoDB | Документная БД. |
| 1194 | UDP | OpenVPN | VPN (по умолчанию). |
| 50000 | TCP | DB2 | IBM DB2. |
| 51820 | UDP | WireGuard | Современный 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"
Конфиг-файл клиента ~/.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 | -D | SOCKS5-прокси через 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
Веб-серверы (Nginx и Apache)
Два главных веб-сервера: Nginx (событийная архитектура, отличный reverse proxy/балансировщик, меньше памяти) и Apache (модульность, .htaccess, огромная экосистема).
| Критерий | Nginx | Apache |
|---|---|---|
| Архитектура | 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/
Content-Security-Policy-Report-Only, иначе сломаете легитимные скрипты.Базы данных
Сервер приложений хранит данные в СУБД. Основные:
- MySQL / MariaDB — реляционная, стандарт для веба (LAMP/LEMP).
- PostgreSQL — мощная реляционная, для сложных задач и строгой совместимости со стандартами.
- Redis — кэш/хранилище в памяти (очень быстрый), часто для сессий и очередей.
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
requirepass и на 0.0.0.0 — классическая дыра, ведущая к RCE.Почта: архитектура, протоколы, аутентификация, практика и доставляемость
Электронная почта — старейшая и до сих пор критичная служба (уведомления, биллинг, восстановление паролей). Понимать её архитектуру админу обязательно, даже если поднимаете не свой сервер, а настраиваете релеи и DNS.
Компоненты почтовой системы
Письмо проходит цепочку агентов. Важно понимать, кто на каком этапе отвечает:
| Компонент | Роль | Примеры | Порты |
|---|---|---|---|
| MUA (Mail User Agent) | Почтовый клиент, через который пользователь читает/пишет письма | Thunderbird, Outlook, mutt, веб-интерфейс | — |
| MSA (Mail Submission Agent) | Принимает исходящие письма от клиента, требует аутентификации, шифрует | Postfix (submission), Exim | 587 (STARTTLS), 465 (SMTPS) |
| MTA (Mail Transfer Agent) | Транспортирует почту между серверами (маршрутизация, очереди) | Postfix, Exim, Sendmail, Exchange | 25 (без шифрования) |
| MDA (Mail Delivery Agent) | Кладёт письмо в почтовый ящик пользователя, фильтрует (спам/правила) | Dovecot (LMTP), Procmail, Sieve | 24 (LMTP, локально) |
| Сервер почты (IMAP/POP3) | Отдаёт накопленную почту клиенту | Dovecot, Cyrus, Exchange | 143/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 | Оставляет письма на сервере, синхронизирует папки/флаги между всеми устройствами. Современный выбор для телефона + ноута + веба. |
DNS-записи для почты
| Запись | Тип | Зачем |
|---|---|---|
| MX (Mail eXchanger) | MX | Указывает, какой сервер принимает почту для домена. Чем меньше число приоритета — тем выше приоритет. |
| A / AAAA | A, AAAA | Сам почтовый сервер (mail.example.com) должен резолвиться в IP. |
| PTR (обратная зона) | PTR | IP → имя. Важна для доставляемости: имя из PTR должно совпадать с HELO/EHLO (FCrDNS). |
| SPF | TXT | Список разрешённых отправителей от имени домена. |
| DKIM | TXT | Публичный ключ для проверки цифровой подписи писем. |
| DMARC | TXT | Политика обработки писем, не прошедших SPF/DKIM, и отчёты. |
| autodiscover / SRV | SRV, 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"
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.
- PTR / FCrDNS — обратная зона IP должна указывать на ваш mail.example.com, и прямая A-запись должна совпадать. Большинство MTA отвергают почту без корректного PTR.
- Новый IP «греется» — начинайте с малого объёма, постепенно увеличивайте (warm-up), чтобы не выглядеть как спам-ферма.
- Blacklists (DNSBL) — Spamhaus, SpamCop, Barracuda. Проверяйте свой IP (multirbl.valli.org). Попадание = массовый спам.
- Greylisting — принимающий сервер временно отклоняет письмо (код 4xx), корректный MTA повторит через минуты. Спам-боты обычно не повторяют.
- Open relay — сервер, принимающий почту от всех, — катастрофа: его мгновенно начнут использовать для рассылки спама, IP улетит во все блэклисты. Всегда ограничивайте релей (
smtpd_relay_restrictionsвыше). - Согласованность HELO — имя, которое сервер называет при подключении, должно резолвиться в его IP.
Безопасность почты
- Требуйте TLS на всех этапах (MTA→MTA через
smtp_tls_security_level = may/dane, клиенты только по 587/465/993). - Отключите устаревшие шифры (SSLv2/SSLv3, RC4); оставьте современные (TLS 1.2/1.3).
- Защитите SASL от брутфорса (fail2ban для dovecot/postfix-sasl).
- DKIM подписывает тело и заголовки — защищает от изменений в пути.
- DMARC защищает бренд от фишинга от вашего имени.
Диагностика почты
Логи — главный источник правды. На 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 | Сервис готов (приветствие) |
| 250 | OK, команда принята |
| 421 | Сервис недоступен, соединение закрывается (часто greylisting/перегруз) |
| 450 | Почтовый ящик временно недоступен (retry later) |
| 451 | Локальная ошибка обработки (повторите) |
| 550 | Ящик/домен не существует (permanent failure — баунс) |
| 554 | Транзакция отклонена (часто — в блэклисте / policy) |
Когда НЕ поднимать свой сервер
Свой почтовый сервер оправдан для обучения, изоляции или специфичных требований. В остальных случаях часто выгоднее:
- Транзакционная почта приложений: Amazon SES, Mailgun, SendGrid, Postmark — высокая доставляемость, API, защищённый IP-пула.
- Корпоративная почта сотрудникам: Yandex 360, Zoho Mail, Microsoft 365, Google Workspace — готовый веб, календарь, администрирование.
- Гибрид: приложение отправляет через внешний SMTP-релей (настройте
relayhostв Postfix), а ящики у провайдера. Получаете контроль над исходящими уведомлениями без боли с IP-репутацией.
# 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
Файловый обмен (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
Мониторинг сервисов
- Prometheus + Node Exporter + Grafana — метрики по pull-модели, экспортеры собирают данные, Grafana рисует дашборды. Стандарт облачного мониторинга.
- Zabbix — комплексная система (метрики, траппы, алерты, карты сети), агент + сервер + веб.
- Nagios / Icinga — классический мониторинг доступности сервисов и хостов (проверки по расписанию).
- Uptime Kuma — простой self-hosted мониторинг (ping, HTTP, Docker, SSL) с красивым UI и уведомлениями (Telegram/Discord).
- Alertmanager — маршрутизация и группировка алертов от Prometheus (тишина/silence, дедупликация, каналы).
# 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
image@sha256:...) для воспроизводимости. Современная команда — docker compose (плагин), не путать со старым бинарником docker-compose.Очереди сообщений (Kafka / RabbitMQ)
Для асинхронной обработки и развязки сервисов:
- RabbitMQ — брокер на AMQP: очереди, маршрутизация по exchange, push-модель. Хорош для задач/заданий и надежной доставки.
- Apache Kafka — распределённый лог событий (commit log), pull-модель, высокая пропускная способность. Хорош для потоковой аналитики, event sourcing, журналирования.
# 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