Настроить проброс портов локально с порта 80 на порт 8080 линукс

Обновлено: 06.07.2024

С увеличением количества компьютеров, необходимое количество IP адресов увеличивалось и диапазона IPv4 начало не хватать. Тогда была разработана технология NAT, которая позволяет нескольким компьютерам объединяться в локальную сеть и быть доступными из внешней сети по IP адресу маршрутизатора.

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

Как работает NAT?

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

Недостаток в том, что инициировать подключение извне нельзя, потому что маршрутизатор просто еще не знает к кому обращаются. Тут на помощь приходит проброс портов. Мы можем сказать роутеру: при поступлении пакетов на порт 80 перенаправлять их на порт 80 компьютера 192.168.1.2. Теперь адрес отправителя и порт будет заменяться на указанный нами и пакет будет передан туда, куда нужно. Если на маршрутизаторе установлен Linux, то все это можно настроить с помощью iptables.

Проброс портов в iptables

Первое что нужно сделать, это включить переадресацию трафика на уровне ядра, если это еще не сделано. Для этого выполните:

echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward

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

sudo sysctl -w net.ipv4.ip_forward=1

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

Настройка прохождения пакетов

Сначала мы рассмотрим как разрешить прохождение пакетов через маршрутизатор. Для этого в брандмауэре есть цепочка FORWARD. По умолчанию для всех пакетов применяется правило DROP, которое означает что все нужно отбросить. Сначала разрешим инициализацию новых соединений, проходящих от eth0 до eth1. Они имеют тип contrack и представлены пакетом SYN:

sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT

Действие ACCEPT означает, что мы разрешаем это соединение. Но это правило разрешает только первый пакет, а нам нужно пропускать любой следующий трафик в обоих направлениях для этого порта (80). поэтому добавим правила для ESTABLIHED и RLEATED:

sudo iptables -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
$ sudo iptables -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Дальше явно установим что наша политика по умолчанию - DROP:

sudo iptables -P FORWARD DROP

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

Модификация пакетов в iptables

Правила DNAT настраиваются в цепочке PREROUTING, в таблице NAT. Эта операция изменяет адрес назначения пакета чтобы он достиг нужной нам цели, когда проходит между сетями. Клиенты будут отправлять пакеты нашему маршрутизатору, и им не нужно знать топологию внутренней сети. Пакет автоматически будет приходить нашему веб-серверу (192.168.1.2).

С помощью этого правила мы перенаправляем все пакеты, пришедшие на порт 80, к 192.168.1.2 опять же на порт 80:

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

sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.168.1.2 -j SNAT --to-source 192.168.1.1

sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 192.168.1.2 -j SNAT --to-source 192.168.1.1:8080

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

sudo iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 1000:2000 -d 192.168.1.2 -j SNAT --to-source 192.168.1.1

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

Сохранение настроек iptables

Теперь, когда все настроено, нужно сохранить этот набор правил, чтобы он загружался автоматически при каждом старте. Для этого выполните:

sudo service iptables-persistent save

Готово. Теперь проброс портов iptables ubuntu будет работать так, как нужно.

Выводы

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

На завершение, видео о том, что такое NAT:

image

Порты позволяют сетевым и подключенным к интернету устройствам взаимодействовать через указанные каналы. Хотя серверы с назначенными IP адресами могут подключаться к интернету напрямую и делать порты публично доступными, система, находящаяся за роутером в локальной сети, может оказаться недоступной из интернета. Технология проброса портов (port forwarding) позволяет преодолеть это ограничение и сделать устройства доступными публично.

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

Ниже представлены наиболее распространенные порты:

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

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

Шаг 1. Выяснение IP адреса роутера

В Линуксе та же самая задача решается при помощи утилиты netstat. Откройте терминал и введите следующую команду для выяснения IP адреса подключенного роутера.

В macOS используется та же самая команда:

Шаг 2. Доступ к конфигурационной панели роутера

После выяснения локального IP адреса роутера вы можете получить доступ к конфигурационной панели, если введете адрес в браузере, как и в случае с обычным URL (у некоторых роутеров, например, предусмотрено мобильное приложение, и задача упрощается).


Рисунок 2: Форма авторизации конфигурационной панели роутера

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

Хотя у разных роутеров панель управления может отличаться, в целом процедура настройки примерно одинаковая. После авторизации зайдите в раздел «Advanced» или найдите, где находится раздел «Port Forwarding». В нашем случае соответствующий раздел называется «Advanced Port Forwarding Rules».


Рисунок 3: Раздел с настройкой проброса портов

Шаг 3. Настройка правил проброса портов

Для демонстрации правил проброса портов рассмотрим простейший случай, когда у пользователя есть устройство Raspberry Pi, подключенное домашнему сетевому роутеру. На Pi запущена служба SSH, позволяющая залогиниться на устройстве при наличии корректного имени пользователя и пароля. Текущий IP адрес устройства Raspberry Pi - 192.168.0.105.

Правило было названо как «RBPi SSH» с целью упрощения идентификации в будущем. В целом имя правила полностью зависит от ваших личных предпочтений и не влияет на используемые порты.

Диапазон параметра Public Port (иногда именуемого как Source Port) установлен от 22 до 22 (стандартный порт протокола SSH). Этот порт роутер сделает доступным через интернет. Через этот же порт пользователь будет подключаться к Raspberry Pi.

Параметр Private Port (иногда именуемый как Destination Port) установлен как 22, поскольку демон SSH на устройстве Pi работает на 22 порту.

Параметр Traffic Type установлен как TCP, поскольку по протоколу SSH передается TCP трафик.

Параметр IP Address соответствует IP адресу устройства Pi в локальной сети (192.168.0.105).

Наконец, слева от правила отмечен флажок, чтобы правило стало активным.

У вашего роутера интерфейс может отличаться, но в целом суть настроек остается неизменной.


Рисунок 4: Настройки правила проброса портов для авторизации через протокол SSH

Вышеуказанное правило означает, что пользователь может подключаться по IP адресу роутера по протоколу SSH через интернет и впоследствии будет перенаправлен на сервер устройства Raspberry Pi. Эту схему можно использовать для создания веб-сервера, работающего на 80 порту, или, например, для прикрепления сервера видеоигр к указанному порту. Учитывайте, что у некоторых провайдеров есть правила, касательно хостинга и другого контента, которые нужно учитывать перед тем, как сделать доступным сервер из локальной сети.

Шаг 4. Защита от сканирования портов и атак

Одна из проблем, возникающая во время открытия портов в интернете при помощи проброса – порты становятся доступными для сканирования. Злоумышленники в интернете могут использовать автоматизированные средства для сканирования диапазонов IP адресов или утилиты навроде Shodan для поиска потенциально уязвимых устройств с определенными активными портами. Порты протокола SSH являются основной целью, поскольку дают доступ к шеллу, при помощи которого можно украсть данные или установить вредоносное приложение.

В случае проброса портов для защиты от сканирования может оказаться полезным поменять публичный или исходный порт в настройках роутера. Вместо распространенного порта 22, на который настроены все сканеры, можно указать нестандартный порт (например, 9022).


Рисунок 5: Настройка SSH на нестандартный порт

После смены порта клиент при подключении к устройствам через SSH из интернета должен будет указать порт 9022. Попытка подключиться к порту 22 извне окажется неудачной, поскольку проброс будет идти от порта 9022, а не от порта 22.

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

Проброс портов в Линуксе на системном уровне

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

Схожим образом, что и порт роутера связывается с указанным портом устройства внутри локальной сети, один порт можно связать с другим для упрощения использования. Например, при установке ханипота Cowrie демон SSH перемещается от порта 22 на порт 9022. Затем порт 2222, где работает ханипот, перенаправляется на порт 22, который будет доступен в интернете и, как следствие, с высокой степенью вероятности просканирован и атакован.

Для конфигурирования локального проброса портов в Линуксе вначале нужно выполнить следующую команду с целью установки в параметр ip_forward значения 1 (в этом случае проброс портов активируется на уровне операционной системы):

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

Наконец, для включения локального проброса портов, можно воспользоваться iptables. Команда ниже перенаправляет запросы с порта 22 на порт 2222, где эти запросы обрабатывает ханипот.

Другие сферы, где используется проброс портов

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

linux-logo

Начальные данные

У нас имеется компьютер под управлением linux, выступающий в роли маршрутизатора с одним внешним интерфейсом enp0s3 для доступа в Интернет (80.81.82.83) и внутренним enp0s8 интерфейсом Локальной сети (10.0.7.1). Требуется пробросить tcp порт (2222) с белого ip-адреса на серый ip-адрес Локальной сети порт (22).

Чаще всего проброс трафика используется, если мы находимся в локальной сети и от внешнего мира отделены шлюзом. Для того, чтобы открыть доступ для локальных служб (ssh, web, ftp и т.д.), нам необходимо пробросить порты. Поскольку в качестве шлюза мы будем использовать сервер на Linux, то осуществлять данные действия будем с помощью утилиты iptables.

Алгоритм проброса портов в iptables.

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

Настройка port forwarding на Linux

Итак, приступим. Для выполнения поставленной задачи, перенаправление порта 2222 на порт 22 другой машины, необходимо добавить следующие правила iptables:

Это правило разрешает прохождение входящих пакетов внутрь сети.

Теперь опишем форвардинг (forwarding) пакетов:

  • Первая строка подменяет IP адрес приемника (белый IP) на внутренний (серый IP)
  • Вторая адрес отправителя (серый IP) на внешний (белый IP).
  • 10.0.7.2 — IP адрес машины в локальной сети, на который перенаправляет трафик.
  • 80.81.82.83 — внешний IP адрес нашего сервера.
  • 22 — внутренний порт локальной машины
  • 2222 — внешний порт для подключения.

Перенаправления всего трафика

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

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

содержимое файла по первому примеру:

Далее открываем файл interfaces

И добавляем в конце следующую строчку:

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

Как посмотреть правила iptables

Посмотреть текущие правила iptables можно с помощью команды:

Вот и все, на этом рассмотрение проброса портов в операционных системах под управлением Linux с помощью iptables завершено.

Если есть вопросы, то пишем в комментариях.

Также можете вступить в Телеграм канал, ВК или подписаться на Twitter. Ссылки в шапки страницы.
Заранее всем спасибо.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Проброс портов в локальную сеть с помощью iptables

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

Описание задачи

Допустим, есть у вас компьютер с операционной системой Linux на борту, который еще выступает в качестве шлюза (роутера) в вашей локальной сети. Есть у вас другой компьютер, на котором, допустим, крутится сайт, к которому нужно обеспечить доступ из внешнего мира. Задача я думаю ясна - нужно пробросить 80 порт с шлюза до компьютера внутри локальной сети.

Статья предполагает, что у вас уже разрешен IP Forwarding на вашем устройстве под управлением Linux. Если же нет, то прочитать о том, как включить IP Forwarding в Linux можно по этой ссылке.

Пусть шлюз будет иметь ip адрес 192.168.1.1, а компьютер с сайтом - 192.168.1.10. Внешний адрес шлюза пусть будет 123.123.123.123. Пробрасывать, повторюсь, будем 80 порт. Во внешний мир смотрит интерфейс eth0, в локальную сеть - eth1.

Решение

После выполнения этой команды, все что приходит на адрес 123.123.123.123 по 80 порту будет передаваться на адрес 192.168.1.10:

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

Теперь любой из внешней сети, набрав в адресной строке ip адрес 123.123.123.123, или связанное с ним доменное имя попадет на 80 порт компьютера 192.168.1.10, который находится внутри локальной сети.

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

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

Была ли эта статья Вам полезна?
Что в статье не так? Пожалуйста, помогите нам её улучшить!

Комментарии к статье (2)

Долго искал способ проброса портов WhatsApp. Спасибо автору - решение в этой статье. А именно:

Мне кажется в этой строке ошибка:

Думаю что строка должна иметь следующий вид:

То есть пакет посланный машиной внутри сети на внешний адрес веб сервера подвергнется следующим изменениям:
1. Подмена получателя(dst) в заголовке пакета . То есть внешнего адреса сервера(123.123.123.123) на внутренний(192.168.1.10).
2. Подмена источника(srс) в заголовке пакета. Скажем внутренняя машина имеет адрес 192.168.1.40. Так вот 192.168.1.40 заменяется на 192.168.1.1(внутренний адрес шлюза). Дело в том что если не делать эту подмену то на сервер придет пакет в котором в source будет адрес 192.168.1.40. Сервер отправит ответный пакет именно на этот адрес. Внутренняя машина отбросит этот пакет так как она не знает внутренний адрес сервера, она отправляла пакет на адрес 123.123.123.123. Поэтому делается замена адреса source чтобы ответный пакет пришел на шлюз, а он в свою очередь в соответствии с таблицей NAT отправит этот пакет на внутреннюю машину.

Читайте также: