iptables перенаправить внешний IP и порт на внутренний IP и порт

Вопрос или проблема

Мне срочно нужна помощь с конкретными примерами, а не словами. Работая с FreeBSD с версии 4.2, я хорошо разбираюсь в pf (фильтрация пакетов), но теперь у меня есть проект, в котором нужно сделать модуль для веб-панели OpenVZ в Linux.

Административная часть готова на 95%, но я застрял. Я понял, что каждую виртуальную машину нужно перенаправлять на другой порт. Причем, это перенаправление должно быть на локальный IP. У них есть только одна сетевая карта и только один публичный IP, так что для каждой виртуальной машины будет использоваться локальный IP.

Предположим:

Мы создаем виртуальную машину 101 с локальным IP 192.168.199.105, чтобы она слушала SSH на порту 5050, и мы имеем публичный IP 88.252.14.32. Как настроить IPTABLES, чтобы перенаправлять SSH-запросы с 88.252.14.32:5050 на 192.168.199.105:5050?

Сервер использует NAT, и для Apache это легко с помощью виртуального хоста, но для SSH – я не знаю как. Я умоляю вас о помощи с конкретными примерами, а не словами. Спасибо.

Вы можете попробовать прочитать этот учебник. Он хорошо описывает iptables. Для вашего вопроса вы можете использовать правила PREROUTING в таблице nat. Это будет выглядеть так:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 5050 -j DNAT --to-destination 192.168.199.105:5050
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

Вы должны заменить eth0 на имя вашего интерфейса.

Ответ или решение

Настройка перенаправления внешнего IP-адреса и порта на внутренний IP-адрес и порт с использованием iptables может быть достаточно сложной задачей, особенно если вы привыкли работать с другими системами, такими как PF в FreeBSD. Однако, использование iptables в Linux для перенаправления трафика — один из самых распространенных способов реализации NAT (Network Address Translation) для виртуальных машин (VM). Давайте разберем необходимые шаги и команды для выполнения данной задачи.

Теория

iptables — это мощный инструмент управления политиками фильтрации и трансляции IP-трафика в Linux. Для решения задачи перенаправления трафика с одного IP и порта на другой мы используем таблицу nat, которая отвечает за Network Address Translation. В рамках этой таблицы нас интересуют цепочки PREROUTING и POSTROUTING.

  1. PREROUTING: используется для изменения пакетов сразу после их получения, но до маршрутизации.
  2. POSTROUTING: применяется к пакетам непосредственно перед их отправкой.

Перенаправление трафика на определенный внутренний IP и порт называют Destination NAT (DNAT). Для успешной реализации необходимо:

  • Изменить адрес назначения входящего пакета (цепочка PREROUTING).
  • Обеспечить возврат трафика обратно к источнику (цепочка POSTROUTING).

Пример

Предположим, у вас есть публичный IP-адрес 88.252.14.32, и вы хотите перенаправить входящие SSH-запросы на порт 5050 к VM с локальным IP-адресом 192.168.199.105, также слушающему на порте 5050.

Пример необходимых команд для iptables:

# Добавление правила DNAT в цепочку PREROUTING для перенаправления входящих соединений
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 5050 -j DNAT --to-destination 192.168.199.105:5050

# Добавление правила MASQUERADE в цепочку POSTROUTING для правильной обработки исходящих пакетов
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Пояснения:

  • -t nat указывает, что правила добавляются в таблицу NAT.
  • -A PREROUTING добавляет правило в цепочку PREROUTING.
  • -i eth0 указывает интерфейс, на который приходит внешнее соединение. Убедитесь, что заменили eth0 на фактическое имя вашего сетевого интерфейса.
  • -p tcp указывает протокол, который вы хотите перенаправить (в данном случае TCP, так как SSH использует TCP).
  • --dport 5050 указывает порт, на который приходят запросы.
  • -j DNAT используется для назначения IP и порта назначения.
  • --to-destination 192.168.199.105:5050 указывает новый адрес и порт назначения пакета.
  • -A POSTROUTING добавляет правило в цепочку POSTROUTING для динамической маскировки исходящего трафика, обеспечивая, что ответы от VM правильно маршрутизируются обратно к источнику запроса.

Применение

Теперь, когда вы добавили эти правила, любые пакеты, поступающие на ваш публичный IP-адрес с портом 5050, будут автоматически перенаправляться на локальный IP и порт указанной виртуальной машины. Это особенно полезно при работе с OpenVZ, где у вас есть единый публичный IP-адрес для нескольких виртуальных машин.

Следует помнить:

  • Обязательно сохраняйте конфигурацию iptables, чтобы она сохранялась после перезагрузки. Это можно сделать командой iptables-save для сохранения текущих правил и iptables-restore для их восстановления.
  • Убедитесь, что другие правила брандмауэра не блокируют ни одно из этих соединений.

Такое детальное управление сетью позволяет эффективно распределять и защитывать ресурсы, обеспечивая безопасность и доступность ваших сервисов.

Оцените материал
Добавить комментарий

Капча загружается...