Перенаправление трафика между серверами — это классическая задача при масштабировании инфраструктуры, создании прокси-узлов или миграции сервисов без простоя. В этой статье мы разберем, как превратить обычный сервер на Debian 12 в высокопроизводительный транзитный шлюз, используя стандартный стек iptables.
Зачем это нужно?
Представьте ситуацию: у вас есть «входной» сервер (точка А), на который приходят запросы клиентов, и «целевой» сервер (точка Б), где работает само приложение. Задача — сделать так, чтобы сервер А незаметно для клиента перебрасывал все пакеты на сервер Б и возвращал ответы обратно. Мы будем настраивать транзит на уровне ядра, что обеспечит минимальные задержки и высокую пропускную способность.
Этап 1. Подготовка фундамента (Ядро)
По умолчанию ядро Linux работает как конечная точка: если пакет пришел не на его IP, он уничтожается. Нам нужно активировать режим маршрутизатора (IP Forwarding).
Проверяем текущее состояние:
sysctl net.ipv4.ip_forward
Если результат 0, активируем пересылку пакетов в реальном времени и фиксируем её в конфигурации, чтобы настройка пережила перезагрузку:
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/60-forwarding.conf
Этап 2. Архитектура правил IPTables
Для корректной работы нам понадобится механизм NAT (Network Address Translation). Пересылка будет состоять из двух этапов: DNAT (подмена адреса назначения) и MASQUERADE (подмена адреса источника).
1. Цепочка PREROUTING (Вход в систему)
Здесь мы ловим пакеты, пришедшие на определенный порт, и говорим им: «Твой новый пункт назначения — другой IP».
# Для TCP
sudo iptables -t nat -A PREROUTING -p tcp --dport ПОРТ -j DNAT --to-destination IP_ПОЛУЧАТЕЛЯ:ПОРТ
# Для UDP
sudo iptables -t nat -A PREROUTING -p udp --dport ПОРТ -j DNAT --to-destination IP_ПОЛУЧАТЕЛЯ:ПОРТ
2. Цепочка POSTROUTING (Выход из системы)
Это критический шаг. Нам нужно заставить целевой сервер ответить нашему шлюзу, а не клиенту напрямую. Для этого мы маскируем IP клиента под IP нашего сервера.
sudo iptables -t nat -A POSTROUTING -d IP_ПОЛУЧАТЕЛЯ -p tcp --dport ПОРТ -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -d IP_ПОЛУЧАТЕЛЯ -p udp --dport ПОРТ -j MASQUERADE
Этап 3. Стены и фильтры: Решаем конфликт с Docker
Если на вашем сервере установлен Docker, он автоматически переводит цепочку FORWARD в режим DROP. В этом случае пакеты будут успешно переадресованы внутри таблиц NAT, но не покинут сервер, так как их заблокирует фильтр.
Чтобы решить эту проблему, не нарушая логику Docker, мы добавляем разрешающие правила в цепочку DOCKER-USER:
sudo iptables -I DOCKER-USER 1 -p tcp -d IP_ПОЛУЧАТЕЛЯ --dport ПОРТ -j ACCEPT
sudo iptables -I DOCKER-USER 1 -p udp -d IP_ПОЛУЧАТЕЛЯ --dport ПОРТ -j ACCEPT
Ключ -I ... 1 гарантирует, что наши правила станут в самый верх списка и сработают раньше блокирующих инструкций.
Этап 4. Глубокая диагностика трафика
Как понять, что всё работает правильно? Мы будем использовать «рентген» для пакетов — утилиту tcpdump. Запустите её на шлюзе, чтобы увидеть движение байтов в реальном времени:
sudo tcpdump -i any port ПОРТ -n
Что искать в выводе?
- In: Пакет от клиента пришел на шлюз.
- Out: Пакет улетел со шлюза на целевой сервер.
- In (обратно): Целевой сервер прислал ответ на шлюз.
- Out (обратно): Шлюз переслал ответ клиенту.
Если вы видите только исходящие пакеты, но нет ответов — проблема на стороне целевого сервера (проверьте его Firewall или настройки приложения).
Этап 5. Сохранение конфигурации
Все правила iptables хранятся в оперативной памяти и исчезнут после ребута. Чтобы этого не случилось, установим утилиту для сохранения правил:
sudo apt update && sudo apt install iptables-persistent
Во время установки система предложит сохранить текущие правила. В будущем, после внесения правок, не забывайте выполнять команду:
sudo netfilter-persistent save
Заключение
Мы создали надежную систему транзита трафика. Прелесть этого метода в том, что он работает на уровне ядра Linux, практически не создавая нагрузки на процессор. Теперь ваш сервер — это полноценный сетевой мост, готовый к любым объемам данных.
Главное — всегда следите за цепочками FORWARD и вовремя делайте бэкап правил в /etc/iptables/rules.v4.
