Назад в блог

Перенаправление портов с помощью Iptables в Linux: практическое руководство

Перенаправление портов с помощью Iptables в Linux: практическое руководство

Перенаправление портов, также называемое маппингом портов, представляет собой метод, позволяющий удаленным устройствам подключаться к определенной службе в вашей частной локальной сети (LAN). Как следует из названия, этот процесс включает в себя перенаправление запросов к определенному порту на другой порт или сеть. Он изменяет назначение пакета в процессе передачи и считается типом операции трансляции сетевых адресов (NAT)ы.

Включение перенаправления портов позволяет устройствам или хостам, не подключенным к внутренней сети, получать доступ друг к другу, что в противном случае ограничено, когда эта функция отключена. Вы можете использовать преимущества перенаправления портов для блокировки целевых веб-сайтов, повышения безопасности и обхода брандмауэра NAT в удобное для вас время.

В этом руководстве мы расскажем вам о шагах по перенаправлению портов с помощью iptables в Linux.

Предварительные требования

Чтобы следовать этому руководству, вам понадобятся:

Сведения о хосте

Во-первых, нам нужно знать сведения об интерфейсах и адресах рабочих серверов. Давайте проверим сетевые интерфейсы нашей системы:

Вы увидите вывод:

Здесь в выделенном выводе показаны два интерфейса, первый eth0, назначенный адресу 192.51.100.45, а второй eth1, назначенный адресу 192.168.1.5. Из этих двух интерфейсов один является публичным, а другой — частным. Мы запустим команду, чтобы различить их и определить публичный интерфейс, подключенный к вашему шлюзу по умолчанию. Чтобы различить их, введите:

Вы увидите вывод:

Фиктивные данные для руководства

В этом руководстве мы будем использовать фиктивные адреса и назначения интерфейсов. Вы можете использовать эти данные или заменить их по своему усмотрению.

Сетевые данные веб-сервера:

  • Публичный IP-адрес: 203.0.113.2

  • Частный IP-адрес: 192.0.2.2

  • Публичный интерфейс: eth0

  • Частный интерфейс: eth1

Сетевые данные брандмауэра:

  • Публичный IP-адрес: 203.0.113.15

  • Частный IP-адрес: 192.0.2.15

  • Публичный интерфейс: eth0

  • Частный интерфейс: eth1

Настройка веб-сервера

Давайте начнем с нашего хоста веб-сервера. Сначала войдите в систему под своим sudo пользователем.

Установка Nginx

Сначала мы установим Nginx на нашем хосте веб-сервера и заблокируем его так, чтобы он прослушивал только свой частный интерфейс. Это позволит нашему веб-серверу быть доступным только в том случае, если мы правильно настроили перенаправление портов.

Затем обновите локальный кэш пакетов и используйте apt для загрузки и установки Nginx:

Добавление ограничений

После установки Nginx на хосте веб-сервера мы заблокируем его, чтобы он принимал входящие соединения только с частных интерфейсов и ниоткуда больше. Кроме того, это гарантирует, что наши веб-серверы будут активны только в том случае, если настройка перенаправления портов выполнена правильно.

Чтобы добавить ограничения, откройте файл конфигурации блока сервера по умолчанию /etc/nginx/sites-enabled/default в любом текстовом редакторе по вашему выбору (здесь мы используем текстовый редактор nano) и введите:

В выводе вы увидите, что директива listen появляется дважды:

Port Forwarding Nginx Default File

В этом руководстве мы используем первую директиву для демонстрации перенаправления IPv4. Вторую, настроенную для IPv6, можно удалить. Добавьте частный IP-адрес вашего веб-сервера с двоеточием непосредственно перед 80, чтобы указать Nginx принимать входящие соединения только с частного интерфейса. Затем отредактируйте директиву:

Port Forwarding Nginx Edited Default File

После завершения сохраните и закройте файл. Прежде чем двигаться дальше, убедитесь в отсутствии синтаксических ошибок. Давайте протестируем файл:

Nginx T

Если ошибок не обнаружено, вы можете перезапустить Nginx и применить новую конфигурацию:

Проверка сетевого ограничения

Давайте проверим уровень доступа к нашему веб-серверу. Попробуйте получить доступ к веб-серверу через частный интерфейс с помощью curl команды:

Вы увидите следующий вывод:

Port Forwarding Nginx Output1

Если мы попытаемся использовать публичный интерфейс, мы не сможем подключиться:

Это именно то, чего мы ожидали.

Настройка брандмауэра для перенаправления порта 80

Давайте продолжим нашу работу по внедрению перенаправления портов на нашей машине с брандмауэром.

Включение перенаправления в ядре

По умолчанию на большинстве систем перенаправление портов выключено. Мы внесем изменения, чтобы включить перенаправление портов, сделав несколько правок. Также есть возможность включить перенаправление портов на постоянной основе, используя привилегии sudo , как показано в следующих шагах.

Чтобы включить перенаправление трафика на уровне ядра, введите:

Чтобы включить перенаправление портов на постоянной основе, отредактируйте файл /etc/sysctl.conf . Откройте файл с привилегиями sudo и введите:

Внутри найдите и раскомментируйте строку, которая выглядит следующим образом:

После завершения сохраните и закройте файл. Затем используйте команды sysctl для применения изменений в настройках, чтобы они вступили в силу:

Базовая настройка брандмауэра

Сначала ознакомьтесь с руководством по настройке базового брандмауэра на вашей машине. По завершении у вас будет:

  • Установлен iptables-persistent
  • Сохранен набор правил по умолчанию в /etc/iptables/rules.v4
  • Исчерпывающие знания о добавлении и изменении правил с помощью iptables команды

Также вы можете узнать, как просмотреть и удалить правила брандмауэра iptables.

Добавление правил перенаправления

Мы настроим наш брандмауэр так, чтобы трафик, поступающий на наш публичный интерфейс ( eth0 ) на порту 80 перенаправлялся на наш частный интерфейс ( eth1). По умолчанию в нашем базовом брандмауэре цепочка FORWARD настроена на DROP трафика. Добавление правил брандмауэра позволит перенаправлять соединения на наш веб-сервер. Для повышения безопасности мы ограничим правила брандмауэра, чтобы разрешить только необходимые запросы на перенаправление.

В цепочке FORWARD мы будем принимать новые соединения, предназначенные для порта 80 поступающие с нашего публичного интерфейса и направляющиеся на наш частный интерфейс. Мы будем идентифицировать новые соединения с помощью расширения conntrack и представлять их с помощью TCP SYN пакета:

Вам необходимо разрешить любой последующий трафик в обоих направлениях, возникающий в результате входящего соединения. Введите команды ниже, чтобы разрешить трафик ESTABLISHED и RELATED между нашими публичным и частным интерфейсами:

Давайте проверим, установлена ли наша политика для цепочки FORWARD в значение DROP:

К настоящему моменту мы добавили несколько правил, которые позволяют трафику проходить между нашими публичным и приватным интерфейсами через брандмауэр. Однако iptables еще не настроен для направления трафика, так как конфигурация правил брандмауэра еще не завершена. На следующих шагах мы добавим правила NAT и скорректируем постоянный набор правил для направления трафика.

Добавление правил NAT для направления пакетов

Мы выполним две отдельные операции, чтобы iptables мог корректно изменять пакеты и оптимизировать взаимодействие с клиентами и веб-сервером.

DNAT — это первая операция, которая начинает цепочку PREROUTING таблицы nat Эта операция изменяет адрес назначения пакета и позволяет правильно маршрутизировать его при прохождении между сетями. Однако клиенты в публичной сети будут подключаться к нашему серверу брандмауэра и не будут иметь информации о топологии нашей приватной сети. Чтобы передавать информацию в приватную сеть, измените адрес назначения каждого пакета, чтобы он мог правильно достичь нашего целевого веб-сервера.

Важно отметить, что мы сосредоточены на настройке перенаправления портов. Выполнение NAT для каждого пакета, попадающего на брандмауэр, не входит в рамки нашего руководства. Мы будем сопоставлять пакеты на порту 80 с приватным IP-адресом нашего веб-сервера:

Пакет будет правильно перенаправлен на наш веб-сервер, содержащий исходный адрес клиента в качестве адреса источника. Несмотря на попытки сервера отправить ответ напрямую на этот адрес, установить легитимное TCP-соединение будет невозможно.

Чтобы настроить правильную маршрутизацию, мы изменим адрес источника пакета. Давайте изменим адрес источника на приватный IP-адрес нашего сервера брандмауэра. После изменения ответ будет отправлен обратно на брандмауэр, который перенаправит его клиенту.

Чтобы включить эту функцию, добавьте правило в цепочку POSTROUTING таблицы nat которая оценивается непосредственно перед отправкой пакетов в сеть. Затем сопоставьте пакеты, предназначенные для нашего веб-сервера, по IP-адресу и порту:

Как только это правило вступит в силу, наш веб-сервер должен стать доступен при переходе в веб-браузере по публичному адресу нашего брандмауэра:

Вы увидите следующий вывод:

Nginx Output2

Настройка перенаправления портов завершена.

Корректировка постоянного набора правил

После завершения настройки перенаправления портов мы сохраним ее в наш постоянный набор правил. Если вы хотите сохранить комментарии в текущем наборе правил, используйте службу iptables-persistent для сохранения ваших правил:

Вы также можете открыть его и отредактировать вручную, чтобы сохранить комментарии в файле:

Затем настройте таблицу filter и таблицу nat для добавления правил цепочки FORWARD и правил ROUTING соответственно. Корректировка таблицы nat позволит нам добавить правила PREROUTING и POSTROUTING как показано в примере ниже:

После добавления указанных выше значений сохраните и закройте файл. Затем введите команду ниже, чтобы протестировать синтаксис ваших правил:

Если ошибок нет, загрузите набор правил:

Давайте проверим, что наш веб-сервер по-прежнему доступен через публичный IP-адрес вашего межсетевого экрана:

Заключение

К концу этого руководства вы научитесь уверенно перенаправлять порты на сервере Linux с помощью iptables. Вы можете использовать возможности перенаправления портов, чтобы скрыть топологию вашей частной сети, одновременно оптимизируя трафик служб для его свободного прохождения через ваш шлюзовой межсетевой экран.

Поскольку этот процесс напрямую зависит от безопасности вашей сети и используемых портов, он безопасен. Риск может возникнуть, если в вашей сети нет межсетевого экрана или VPN. Поэтому рекомендуется настроить межсетевой экран, как описано в этом руководстве. Надеемся, что это руководство поможет вам оставаться в безопасности в Интернете при использовании вашей частной сети.

Чтобы подробнее изучить другие решения для межсетевого экрана, которые вы можете внедрить в своей системе, ознакомьтесь со следующими ресурсами в нашем блоге:

Приятной работы!

author

Pranay Kapgate

Автор · CloudSigma

Preslav Dobrev — креативный дизайнер в CloudSigma, сосредоточенный на формировании последовательного корпоративного образа с помощью традиционных и инновационных маркетинговых каналов. Он умело сочетает художественное видение со стратегическим маркетингом, создавая убедительные истории бренда.

Комментарии

Комментариев пока нет. Будьте первым.