Ответ
В инфраструктурных проектах я настраиваю DMZ (демилитаризованную зону) как буфер между интернетом и внутренней сетью. Вот архитектура и конкретные правила, которые я применяю.
Типовая архитектура с DMZ:
Интернет → Фаервол → DMZ (веб-серверы, прокси) → Внутренний фаервол → LAN (БД, бэкенд-сервисы)
1. Сетевая сегментация:
# VLAN и подсети
- Интернет: eth0 (публичный IP)
- DMZ: eth1, VLAN 100, сеть 10.0.1.0/24
- LAN: eth2, VLAN 200, сеть 10.0.0.0/24
- Management: VLAN 300, сеть 10.0.2.0/24 (для администрирования)
2. Настройка правил iptables на внешнем фаерволе:
#!/bin/bash
# /etc/iptables/rules.v4
# Базовые политики
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Разрешаем established connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# Доступ из интернета ТОЛЬКО в DMZ
# HTTP/HTTPS к веб-серверам в DMZ
iptables -A FORWARD -i eth0 -o eth1 -d 10.0.1.10 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -d 10.0.1.10 -p tcp --dport 443 -j ACCEPT
# SSH только с white-list IP (для администрирования)
iptables -A FORWARD -i eth0 -o eth1 -d 10.0.1.0/24 -p tcp --dport 22 -s 203.0.113.0/24 -j ACCEPT
# Запрещаем прямой доступ из интернета в LAN
iptables -A FORWARD -i eth0 -o eth2 -j DROP
# NAT для исходящего трафика из DMZ
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.1.0/24 -j MASQUERADE
3. Правила на внутреннем фаерволе (между DMZ и LAN):
# Разрешаем только необходимые соединения из DMZ в LAN
# Веб-сервер в DMZ может подключиться к БД в LAN
iptables -A FORWARD -i eth1 -o eth2 -s 10.0.1.10 -d 10.0.0.20 -p tcp --dport 5432 -j ACCEPT
# Обратный трафик (ответы)
iptables -A FORWARD -i eth2 -o eth1 -d 10.0.1.10 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Запрещаем инициацию соединений из LAN в DMZ (если не требуется)
iptables -A FORWARD -i eth2 -o eth1 -j DROP
4. Реализация через современные инструменты:
В cloud-окружениях использую Security Groups и Network ACLs:
# Terraform для AWS VPC
resource "aws_security_group" "dmz" {
name = "dmz-sg"
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
# Разрешаем исходящие соединения только в LAN на порт БД
egress {
from_port = 5432
to_port = 5432
protocol = "tcp"
cidr_blocks = ["10.0.0.0/24"] # LAN подсеть
}
}
resource "aws_network_acl" "dmz_nacl" {
vpc_id = aws_vpc.main.id
# Правило: deny any из интернета напрямую в LAN
egress {
protocol = "-1"
rule_no = 100
action = "deny"
cidr_block = "10.0.0.0/24" # LAN
from_port = 0
to_port = 0
}
}
5. Мониторинг и аудит:
# Логирование подозрительных попыток доступа
iptables -A FORWARD -i eth0 -o eth2 -j LOG --log-prefix "BLOCKED_DIRECT_LAN_ACCESS: "
# Регулярная проверка правил
iptables-save > /backup/iptables-$(date +%Y%m%d).rules
# Использование fail2ban для защиты SSH в DMZ
Ключевой принцип: DMZ должна содержать минимально необходимые сервисы, а доступ из нее в LAN строго ограничен по принципу наименьших привилегий.