Инструкция обновлена 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 можно довольно гибко модифицировать трафик.
Скопировано из https://losst.pro/probros-portov-iptables-v-linux
Спасибо за замечание! Заберем на доработку, чтобы подготовить оригинальный и актуальный материал.