<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Публичное облако на базе VMware с управлением через vCloud Director

Как перенаправлять порты через шлюз Linux с помощью Iptables

Миша Курушин
Миша Курушин
Технический писатель
11 апреля 2022 г.
12870
13 минут чтения
Средний рейтинг статьи: 4

Инструкция обновлена 26.02.2025

Было ли у вас такое, что на своем домашнем компьютере вы запускали сервер (игровой или веб), скидывали друзьям свой IP-адрес, но подключиться никто не мог?

Знаете, в чем была проблема? Ваш роутер скрывает подключенные к нему устройства за своим IP-адресом. Всё, что в пределах роутера, — локальная сеть. Всё, что за его пределами, — глобальная сеть. Однако между ними нет посредника. Только барьер. Поэтому никто извне не может подключиться.

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

Все показанные в этом руководстве команды запускались на облачном сервере Timeweb Cloud под управлением операционной системы Ubuntu 22.04.

Что такое проброс портов?

Проброс портов (port forwarding) — это перенаправление сетевого трафика с одного порта на другой либо с помощью маршрутизатора (то есть на уровне железа), либо через брандмауэр (то есть на уровне ПО).

Благодаря пробросу портов устройства в локальной сети становятся доступны из глобальной сети. Без проброса внешние запросы не смогут дойти до внутренних устройств.

Самые очевидные сценарии, в которых нужен проброс портов:

  • Подключение к домашнему серверу (игровому, камер видеонаблюдения, хранилища данных).

  • Хостинг игровых серверов или веб-сайтов на домашнем ПК.

  • Доступ к удаленному рабочему столу.

  • Удаленное управление устройствами.

Например, если сервер внутри локальной сети работает на порту 8080, проброс позволяет обращаться к нему из глобальной сети через порт 80.

Вот небольшой пример:

  • На компьютере с IP-адресом 192.168.1.100 (его называют серым, т.к. он внутренний) запущен веб-сервер, прослушивающий 8080 порт на наличие пользовательских запросов.

  • Компьютер находится в локальной сети Wi-Fi-роутера с IP-адресом 203.0.113.10 (его называют белым, т.к. он внешний), который прослушивает 80 порт на наличие пользовательских запросов.

  • Все запросы из глобальной сети, поступающие на Wi-Fi-роутер, пробрасываются с порта 80 (с внешнего 203.0.113.10) на порт 8080 (на внутренний 192.168.1.100).

Таким образом реализуется перенаправление входящего трафика из глобальной сети в локальную.

cloud

Как работает проброс портов в Linux?

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

В основе механизма проброса портов лежит технология NAT, которая конфигурируется системной утилитой iptables.

Что такое NAT?

NAT (Network Address Translation) — это технология, позволяющая преобразовывать внешние запросы из глобальной сети во внутренние запросы в локальной сети и наоборот.

Технически NAT подменяет IP-адреса и порты в пакетах данных. Однако важно понимать, что NAT — это не какая-то программная утилита, а своего рода подход или концепция.

В зависимости от направления, NAT можно разделить на два типа:

  • SNAT (Source NAT). Подмена IP-адреса в исходящих пакетах.

  • DNAT (Destination NAT). Подмена IP-адреса во входящих пакетах.

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

Что такое Iptables и как он работает?

Iptables — это специальная утилита в операционных системах Linux, предназначенная для настройки NAT (и не только его) путем редактирования соответствующих таблиц с цепочками правил, модифицирующих трафик.

Во-первых, в iptables есть 5 цепочек правил, обрабатывающих пакеты различных типов и состояний:

  • INPUT. Входящие пакеты.

  • FORWARD. Пересылаемые пакеты.

  • OUTPUT. Исходящие пакеты.

  • PREROUTING. Пакеты перед маршрутизацией.

  • POSTROUTING. Пакетов после маршрутизации.

Во-вторых, в iptables есть 5 таблиц, в каждой из которых используются строго определенные цепочки правил:

  • filter. Разрешает или запрещает пакеты. Цепочки: INPUT, FORWARD, OUTPUT.

  • nat. Изменяет IP-адреса и порты, указанные в пакетах. Цепочки: OUTPUT, PREROUTING, POSTROUTING.

  • mangle. Изменяет заголовки, указанные в пакетах. Цепочки: INPUT, FORWARD, OUTPUT, PREROUTING, POSTROUTING.

  • raw. Разрешает или запрещает соединения. Цепочки: OUTPUT, PREROUTING.

  • security. Применяет дополнительные политики безопасности. Цепочки: INPUT, FORWARD, OUTPUT.

Цепочки правил можно рассматривать как своего рода хуки (hooks) в конвейере обработки пакетов. Именно с помощью них утилита iptables реализует проброс портов в операционных системах Linux.

Принцип работы port forwarding

Так называемый port forwarding в iptables лучше всего рассмотреть на примере типичного алгоритма обработки трафика.

Существует три возможных направления пакетов — для каждого свой порядок обработки:

  • Входящие (INPUT). Отправляются в локальную систему.

  • Исходящие (OUTPUT). Отправляются из локальной системы.

  • Маршрутизируемые (FORWARD). Пересылаются через систему.

Входящие пакеты обрабатываются так:

  • raw (PREROUTING). Фильтрация соединения.

  • mangle (PREROUTING). Модификация пакета.

  • nat (PREROUTING). Изменение адреса назначения.

  • Если пакет для текущий системы, то обработка продолжается в INPUT. Если нет — обработка переходит в FORWARD.

  • mangle (INPUT). Финальная модификация пакета.

  • filter (INPUT). Фильтрация пакета.

  • security (INPUT). Установка меток безопасности.

Исходящие пакеты обрабатываются так:

  • raw (OUTPUT). Фильтрация соединения.

  • mangle (OUTPUT). Модификация пакета.

  • nat (OUTPUT). Изменение адреса назначения.

  • filter (OUTPUT). Финальная фильтрация пакета.

  • security (OUTPUT). Применение меток безопасности.

  • mangle (POSTROUTING). Финальная модификация пакета.

  • nat (POSTROUTING). Изменение исходящего адреса.

Маршрутизируемые пакеты обрабатываются так:

  • raw (PREROUTING). Фильтрация соединения.

  • mangle (PREROUTING). Модификация пакета.

  • nat (PREROUTING). Изменение адреса назначения.

  • Принимается решение о пересылке.

  • mangle (FORWARD). Модификация пакета.

  • filter (FORWARD). Фильтрация пакета.

  • security (FORWARD). Установка меток безопасности.

  • mangle (POSTROUTING). Финальная модификация пакета.

  • nat (POSTROUTING). Изменение исходящего адреса.

Таким образом общий порядок выполнения таблиц следующий:

  • raw

  • mangle

  • nat

  • filter

  • security

Типы проброса портов

Чаще всего необходимы следующие типы проброса портов:

  • Локальный проброс. Перенаправляет трафик в пределах одной машины. Например, приложение на локальном сервере отправляет запрос на определенный порт.

  • Проброс между интерфейсами. Перенаправляет трафик между разными сетевыми интерфейсами. Например, пакет из глобальной сети приходит на один интерфейс, а локальной хост перенаправляет его на другой.

  • Проброс для удаленных хостов. Перенаправляет трафик с удаленного сервера на локальный хост. Например, запрос от удаленного сервера перенаправляется на локальный.

Каждый тип проброса выполняется с помощью соответствующего набора правил в таблицах iptables.

Использование команды Iptables

Подготовка системы

В большинстве дистрибутивов Linux утилита iptables уже установлена. В этом можно убедиться, запросив ее версию:

iptables --version

Если iptables нет в системе, тогда ее необходимо установить вручную. Сначала обновляем список доступных пакетов:

sudo apt update

А потом выполняем установку:

sudo apt install iptables -y

По умолчанию в Linux используется брандмауэр ufw, который автоматически конфигурирует iptables. Чтобы избежать возможных конфликтов, его службу сперва необходимо остановить:

sudo systemctl stop ufw

А потом отключить:

sudo systemctl disable ufw

Схема команды iptables

Базовая схема команды iptables выглядит следующим образом:

iptables [ТАБЛИЦА] [КОМАНДА] [ЦЕПОЧКА] [НОМЕР] [УСЛОВИЕ] [ДЕЙСТВИЕ]

При этом в каждой конкретной команде указываются лишь некоторые из упомянутых позиций:

  • ТАБЛИЦА. Название одной из пяти таблиц, в которую добавляется правило.

  • КОМАНДА. Манипуляция, которую необходимо проделать над конкретным правилом или цепочкой.

  • ЦЕПОЧКА. Название цепочки, над которой необходимо выполнить манипуляцию.

  • НОМЕР. Номер правила, над которым необходимо выполнить манипуляцию.

  • УСЛОВИЕ. Условие, при котором будет выполняться указанное правило.

  • ДЕЙСТВИЕ. Преобразование, которое будет выполняться над конкретным пакетом.

Выбор таблицы

С помощью флага -t выбирается конкретная таблица, внутри которой будут выполняться различные манипуляции.

Для filter:

iptables -t filter

Для nat:

iptables -t nat

Для mangle:

iptables -t mangle

Для raw:

iptables -t raw

Для security:

iptables -t security

Если не указывать флаг -t, то будет автоматически выбрана таблица по умолчанию — filter. Последняя же таблица security используется в очень редких случаях.

Манипуляции над правилами

С правилами внутри каждой цепочки можно выполнять различные манипуляции.

Флаг -A добавляет правило в конец указанной цепочки:

iptables -A INPUT -s 192.168.123.132 -j DROP

В данном случае добавленное правило запрещает входящие соединения с указанного IP-адреса.

Флаг -D удаляет правило под указанным номером:

iptables -D OUTPUT 7

Флаг -I вставляет правило в определенную часть указанной цепочки:

iptables -I INPUT 5 -s 192.168.123.132 -j DROP

В данном случае вставленное правило запрещает входящие соединения с указанного IP-адреса.

Флаг -R заменяет правило под указанным правилом:

iptables -R INPUT 5 -s 192.168.123.132 -j ACCEPT

В данном случае ранее вставленное запрещающее правило заменяется на разрешающее.

Флаг -F удаляет все правила в указанной цепочке:

iptables -F INPUT

Манипуляции над цепочками

С цепочками тоже можно выполнять разнообразные манипуляции.

Флаг -N создает цепочку с указанным именем:

iptables -N SOMENAME

Флаг -X удаляет указанную цепочку:

iptables -X SOMENAME

Флаг -E переименовывает указанную цепочку:

iptables -E SOMENAME NEWNAME

Флаг -P определяет правила по умолчанию для указанной цепочки:

iptables -P INPUT DROP

Обратите внимание, что выполнение этой команды для цепочки INPUT блокирует все входящие подключения к серверу.

Флаг -Z обнуляет статистику указанной цепочки.

iptables -Z INPUT

Установка условий

Для каждого правила можно задать условие его выполнения.

Флаг -p указывает протоколы соединения:

iptables -A INPUT -p tcp -j ACCEPT

Протоколы можно указывать либо выборочно (TCP, UDP, ICMP) либо все сразу (ALL). В данном случае добавленное правило разрешает входящие соединения с по протоколу TCP.

Флаг -s указывает адреса источника входящего трафика:

iptables -A INPUT -s 192.168.123.132 -j DROP

Флаг -d указывает адреса назначения исходящего трафика:

iptables -A OUTPUT -d 192.168.123.132 -j DROP

Флаг -i указывает сетевые адаптеры исходящего трафика:

iptables -A INPUT -i eth2 -j DROP

В данном случае добавленное правило запрещает входящие соединения через Ethernet-интерфейс.

Флаг -o указывает сетевые адаптеры входящего трафика:

iptables -A OUTPUT -o eth3 -j ACCEPT

Флаг --dport указывает порты исходящего трафика (только для -p, равному TCP или UDP):

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Флаг --sport указывает порты входящего трафика (только для -p, равному TCP или UDP):

iptables -A INPUT -p tcp --sport 1023 -j DROP

Любое условие можно инвертировать с помощью восклицательного знака (!):

iptables -A INPUT ! -s 192.168.123.132 -j DROP

В данном случае добавленное правило запрещает все входящие соединения не с указанного IP-адреса.

Указание действий

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

Для таблицы filter:

  • ACCEPT. Разрешить пакет.

  • DROP. Запретить пакет.

  • REJECT. Отбросить пакет, отправив ответ серверу.

  • LOG. Записать информацию о пакете в системный лог.

  • ULOG или NFLOG. Отправить информацию о пакете в пользовательское пространство.

  • RETURN. Завершить обработку в текущей цепочке.

Для таблицы nat:

  • DNAT. Изменить адрес назначения пакета.
  • SNAT. Изменить адрес источника пакета.
  • MASQUERADE. Заменить адрес источника без указания интерфейса.
  • REDIRECT. Перенаправит трафик на локальную машину.
  • RETURN. Завершить обработку в текущей цепочке.

Для таблицы mangle:

  • MARK. Установить метку для пакета.
  • TTL. Изменить TTL (Time-To-Live) пакета.
  • TOS. Изменить TOS (Type-of-Service) пакета.
  • DSCP. Изменить DSCP (Differentiated Services Code Point) пакета.
  • CLASSIFY. Применить классификацию пакета.
  • RETURN. Завершить обработку в текущей цепочке.

Для таблицы raw:

  • NOTRAC. Отключить отслеживание соединения.
  • RETURN. Завершить обработку в текущей цепочке.

Для таблицы security:

  • SECMARK. Установить метку безопасности.
  • RETURN. Завершить обработку в текущей цепочке.

Настройка проброса портов через Iptables

Разобравшись с механизмом работы проброса портов и устройством команды iptables, можно перейти к практическим примерам. 

Проброс порта на локальной машине

Иногда необходимо перенаправить локальные запросы с одного порта на другой:

sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80

В данном случае в таблицу nat добавляется правило для цепочки OUTPUT, которое при условии наличия порта назначения 8080 подменяет адрес назначения на локальный хост с портом 80.

Теперь любые серверы, запущенные на локальном хосте (например, через Python или NodeJS) на 80 порту, будут доступны через веб-браузер по 8080 порту.

Удалить созданное правило можно следующим образом:

sudo iptables -t nat -D PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80

Проброс порта между интерфейсами

Например, необходимо пробросить порт 8080 с интерфейсом eth0 на порт 80 с интерфейсом eth1.

Для начала настраивается перенаправление трафика:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 10.0.0.100:80

После этого необходимо разрешить пересылку пакетов:

sudo iptables -A FORWARD -p tcp -d 10.0.0.100 --dport 80 -j ACCEPT

Проброс порта для удаленного хоста

Пакеты, пришедшие на порт локального устройства, можно перенаправлять на сервер удаленного устройства.

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

echo 1 > /proc/sys/net/ipv4/ip_forward

Во-вторых, необходимо добавить правило проброса порта:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80

В-третьих, нужно разрешить перенаправленным пакетам отправляться наружу:

sudo iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j MASQUERADE

В этом случае проброс порта работает в несколько этапов:

  • PREROUTING. Трафик с порта 8080 перенаправляется по адресу 192.168.1.100:80.

  • POSTROUTING. Подменяется адрес отправителя так, чтобы ответ от удаленного сервера корректно возвращался обратно.

Альтернативы iptables для проброса портов

Надо сказать, что iptables — не единственный инструмент управления трафиком. Есть несколько популярных альтернатив.

Использование nftables

nftables — это более современный инструмент для управления трафиком в Linux. В отличие от iptables, в нем нет предопределенных таблиц, а синтаксис более понятный и лаконичный.

В дополнение к этой, утилита использует одну команду nft для управления всеми видами трафика: IPv4, IPv6, ARP и Ethernet. В iptables для этого есть дополнительные команды: ip6tables, arptables, ebtables.

Использование firewalld

firewalld — это более сложный инструмент управления трафиком в Linux, которые построен на концепции областей (zones) и служб (services). Благодаря этому сетевым ресурсам можно назначать разные уровни безопасности.

Конфигурация firewalld более широкая и гибкая. Например, вместо того, чтобы вручную прописывать правила для каждого порта, можно указывать конкретные службы.

Помимо этого firewalld предоставляет более интерактивный интерфейс командной строки, с помощью которого можно управлять трафиком в режиме реального времени.

Надежные Linux-серверы для ваших проектов

Заключение

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

Правила фильтрации и модификации записываются в соответствующих таблицах с помощью определенных флагов. Хотя общая структура этих таблиц и правил не такая сложная, с iptables можно довольно гибко модифицировать трафик. 

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
11 апреля 2022 г.
12870
13 минут чтения
Средний рейтинг статьи: 4
Комментарии 2
Сергеев
30.01.2025, 19:06
Timeweb Cloud
Timeweb Cloud
31.01.2025, 11:37

Спасибо за замечание! Заберем на доработку, чтобы подготовить оригинальный и актуальный материал.