Как организовать доступ в локальную сеть через DMZ

«Как организовать доступ в локальную сеть через DMZ» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В инфраструктурных проектах я настраиваю 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 строго ограничен по принципу наименьших привилегий.