← Back to notes

TLS и Firewall в
Linux: краткий обзор


TLS

SSL (1995–1996) — устаревший предшественник TLS, не используется. TLS 1.0/1.1 объявлены deprecated в RFC 8996. Современный продакшн — TLS 1.2 (RFC 5246) и TLS 1.3 (RFC 8446).

При корректной валидации сертификатов TLS даёт:

  • конфиденциальность — AEAD-шифрование (AES-GCM, ChaCha20-Poly1305);
  • целостность — встроена в AEAD;
  • аутентификацию сервера — X.509-сертификат должен пройти проверку цепочки доверия и имени; опционально mTLS-аутентификацию клиента.

Handshake (упрощённо)

В TLS 1.3 (RFC 8446) handshake занимает 1-RTT:

  1. ClientHello — список поддерживаемых версий, ciphersuites, key_share ((EC)DHE), signature_algorithms, SNI, ALPN.
  2. ServerHello + EncryptedExtensions + Certificate + CertificateVerify + Finished — после ServerHello всё шифруется.
  3. Finished от клиента → канал готов.

В TLS 1.3 статический RSA key exchange удалён. Полный handshake обычно использует (EC)DHE и даёт forward secrecy; PSK/resumption и 0-RTT требуют отдельной оценки replay/PFS-свойств.


X.509-сертификат

Содержит:

  • subject (CN, SAN — список доменов);
  • срок действия (для публичных CA ограничен требованиями CA/Browser Forum и браузерных root programs);
  • публичный ключ (RSA-2048+ или ECDSA P-256+);
  • подпись Issuer CA.

Проверка:

openssl s_client -connect example.com:443 -servername example.com
openssl x509 -in cert.pem -text -noout

Цепочка доверия

Root CA (в trust store ОС/браузера)
  └─ Intermediate CA (отправляется сервером)
       └─ Server Certificate (отправляется сервером)

Сервер обязан отдать leaf + все intermediates. Root уже у клиента. Пример: Let's Encrypt — leaf подписан R3 или R10/R11, который подписан ISRG Root X1.

Self-signed

openssl req -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem \
  -days 365 -subj "/CN=internal.local"

Применимо только если клиент явно доверяет конкретному сертификату (CA-pinning, internal trust store).


Firewall в Linux

Все стандартные firewall-инструменты используют netfilter в ядре.

iptables / iptables-nft

Подробно — в отдельной заметке про цепочки. Минимальный набор:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP

nftables

Современный фронтенд к netfilter, рекомендуемая замена iptables (с ядра 3.13, 2014). Объединяет IPv4/IPv6/ARP/bridge в одной семействе inet:

nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0\; policy drop\; }
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input iif lo accept
nft add rule inet filter input tcp dport {22,80,443} accept
nft list ruleset

ufw

Высокоуровневая обёртка над iptables/nftables (Ubuntu/Debian):

ufw default deny incoming
ufw allow 22/tcp
ufw allow 80,443/tcp
ufw enable
ufw status verbose

firewalld

Используется в RHEL/Fedora, работает поверх nftables, оперирует zone'ами и сервисами.

firewall-cmd --permanent --add-service=https
firewall-cmd --reload

Источники

TLS и Firewall в Linux: краткий обзор | Aleksandr Suprun