Инструкция обновлена 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 есть специальный инструментарий для обработки входящего и исходящего трафика, представляющий собой своего рода конвейер фильтрации и модификации пакетов данных.
В основе механизма проброса портов лежит технология NAT, которая конфигурируется системной утилитой iptables.
NAT (Network Address Translation) — это технология, позволяющая преобразовывать внешние запросы из глобальной сети во внутренние запросы в локальной сети и наоборот.
Технически NAT подменяет IP-адреса и порты в пакетах данных. Однако важно понимать, что NAT — это не какая-то программная утилита, а своего рода подход или концепция.
В зависимости от направления, NAT можно разделить на два типа:
SNAT (Source NAT). Подмена IP-адреса в исходящих пакетах.
DNAT (Destination NAT). Подмена IP-адреса во входящих пакетах.
Несмотря на то, что NAT защищает локальную сеть от внешнего доступа, он также требует проброса портов для всех входящих соединений.
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 в 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.
В большинстве дистрибутивов 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 [ТАБЛИЦА] [КОМАНДА] [ЦЕПОЧКА] [НОМЕР] [УСЛОВИЕ] [ДЕЙСТВИЕ]
При этом в каждой конкретной команде указываются лишь некоторые из упомянутых позиций:
ТАБЛИЦА. Название одной из пяти таблиц, в которую добавляется правило.
КОМАНДА. Манипуляция, которую необходимо проделать над конкретным правилом или цепочкой.
ЦЕПОЧКА. Название цепочки, над которой необходимо выполнить манипуляцию.
НОМЕР. Номер правила, над которым необходимо выполнить манипуляцию.
УСЛОВИЕ. Условие, при котором будет выполняться указанное правило.
ДЕЙСТВИЕ. Преобразование, которое будет выполняться над конкретным пакетом.
С помощью флага -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
:
Для таблицы mangle
:
Для таблицы raw
:
Для таблицы security
:
Разобравшись с механизмом работы проброса портов и устройством команды 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 — не единственный инструмент управления трафиком. Есть несколько популярных альтернатив.
nftables — это более современный инструмент для управления трафиком в Linux. В отличие от iptables, в нем нет предопределенных таблиц, а синтаксис более понятный и лаконичный.
В дополнение к этой, утилита использует одну команду nft для управления всеми видами трафика: IPv4, IPv6, ARP и Ethernet. В iptables для этого есть дополнительные команды: ip6tables, arptables, ebtables.
firewalld — это более сложный инструмент управления трафиком в Linux, которые построен на концепции областей (zones) и служб (services). Благодаря этому сетевым ресурсам можно назначать разные уровни безопасности.
Конфигурация firewalld более широкая и гибкая. Например, вместо того, чтобы вручную прописывать правила для каждого порта, можно указывать конкретные службы.
Помимо этого firewalld предоставляет более интерактивный интерфейс командной строки, с помощью которого можно управлять трафиком в режиме реального времени.
Надежные Linux-серверы для ваших проектов
Итак. Несмотря на то, что существуют альтернативы управления трафиком на локальной машине под управлением операционной системы Linux, iptables является основным способом поэтапной обработки входящих и исходящих пакетов.
Правила фильтрации и модификации записываются в соответствующих таблицах с помощью определенных флагов. Хотя общая структура этих таблиц и правил не такая сложная, с iptables можно довольно гибко модифицировать трафик.
Скопировано из https://losst.pro/probros-portov-iptables-v-linux
Спасибо за замечание! Заберем на доработку, чтобы подготовить оригинальный и актуальный материал.