Локально настроить переадресацию портов с порта 80 на порт 8080 linux
Обновлено: 21.11.2024
scene
Если вы отлаживаете веб-программу с помощью Resins, вам необходимо часто перезапускать Resin. Эта веб-программа должна быть открыта на порту 80, а Linux ограничивает порты ниже 1024, чтобы иметь права root. Но вы не хотите всегда открывать корневой терминал при отладке программ. В этом случае можно открыть Res на порту 8080 по умолчанию, а затем с помощью iptables добиться того же эффекта, что и при открытии сервиса на порту 80.
Способ
Перенести TCP-соединение с порта 80 на локальный порт 8080. Технология DNAT (преобразование сетевых адресов назначения) может удовлетворить это требование. Поскольку iptables по-разному обрабатывает локальные и удаленные соединения, их необходимо обрабатывать отдельно. Предположим, что IP-адрес этой машины — 192.168.4.177.
Удаленное подключение
Под удаленным подключением понимается подключение другой машины к этой машине. Подключенные пакеты в iptables сначала будут проходить через цепочку маршрутизации, поэтому в цепочке маршрутизации требуется только DNAT.
Код выглядит следующим образом:
Локальное подключение
Локальное подключение — это порт на локальном компьютере, который использует 127.0.0.1 или локальный IP-адрес для доступа к локальному порту. Пакеты, подключенные локально, не будут проходить через сетевую карту, а будут обрабатываться ядром и отправляться непосредственно в локальный процесс. В iptables такие пакеты проходят только через цепочку вывода, а не через цепочку маршрутизации. Следовательно, DNAT необходим в выходной цепочке. Помимо 127.0.0.1, доступ к локальному IP-адресу (192.168.4.177) также является локальным подключением.
Код выглядит следующим образом:
Вопросы, требующие внимания
Возможно, вам потребуется включить IP-переадресацию с помощью следующей команды:
Код выглядит следующим образом:
Во время эксперимента, если вы хотите сбросить настройки iptables, вам нужно сначала очистить таблицу NAT
Код выглядит следующим образом:
Операция экземпляра
Здесь перенаправляем порт 3389 локального интерфейса IP 61.144. А.Б. к 3389 из 116.6. КОМПАКТ ДИСК. (если вы в основном подключаетесь к порту 3389 из 61.144.A.B., вы перейдете на 3389 из 116.6.C.D.)
1. Первое, что нужно сделать, это /etc/sysctl.conf Конфигурационный файл net.ipv4 .ip_ Forward=1, по умолчанию 0, что разрешает iptalbes forward.
2. Служба iptables останавливается, чтобы отключить брандмауэр
3. Перенастроить правила
Код выглядит следующим образом:
iptables -t nat -A PREROUTING –dst 61.144.ab -p tcp –dport 3389 -j DNAT –to-destination 116.
6.cd:3389
iptables -t nat -A POSTROUTING –dst 116.6.cd -p tcp –dport 3389 -j SNAT –to-source 61.144.ab
сервис iptables сохранить
Сохраните текущее правило в /etc/sysconfig/iptables
Если вы знакомы с этим файлом, прямое изменение содержимого здесь также эквивалентно правилам ввода из командной строки.
5. Запустить службу iptables, запустить службу iptables
Это можно прописать в скрипте, и устройство запустится автоматически;
Код выглядит следующим образом:
iptables -F -t nat
iptables -t nat -A PREROUTING –dst 61.144.ab -p tcp –dport 3389 -j DNAT –к месту назначения 116.6.cd:3389
iptables -t nat -A POSTROUTING –dst 116.6.ab -p tcp –dport 3389 -j SNAT –to-source 61.144.cd
~
——————————————— —————-
TCP
iptables -t nat -A PREROUTING –dst 61.144.ab -p tcp –dport 9304 -j DNAT –to-destination 10.94.ab:9304
iptables -t nat -A POSTROUTING –dst 10.94.ab – p tcp –dport 9304 -j SNAT –к источнику 61.144.ab
UDP
iptables -t nat -A PREROUTING –dst 61.144.ab -p udp –dport 9305 -j DNAT –to-destination 10.94.ab:9305
iptables -t nat -A POSTROUTING – dst 10.94.ab -p udp –dport 9305 -j SNAT –к источнику 61.144.ab
Расположение файла конфигурации iptables /etc/sysconfig/изменения адреса внешней сети iptables можно изменить в файле конфигурации.
До сих пор он работал нормально, но совсем недавно я заметил, что порт 8080 также остается широко открытым, поэтому любые запросы, нацеленные на порт 80 или 8080, будут получать одинаковый ответ. Дело в том, что мне нужен только порт 80, чтобы быть доступным извне, потому что каким-то образом мой провайдер считает, что порт 8080 остается открытым, что-то вроде потенциального злоупотребления? В любом случае, я не хочу, чтобы внешние запросы, направленные на порт 8080, получали ответ, его должны получать только те, кто нацелен на порт 80.
На данный момент мой файл конфигурации для iptables выглядит следующим образом:
Я попытался удалить правило, открывающее порт 8080, но после перезагрузки iptables сервер также не отвечал на запросы с порта 80. Совсем недавно я думал о том, чтобы добавить еще одно правило перенаправления, которое изменит исходный IP-адрес на что-то конкретное, чтобы принять его через порт 8080, но я не уверен, что это сработает. Мне нужно руководство здесь.
Примечание. Я не очень хорошо разбираюсь в этом инструменте, и это главный источник моих сомнений.Кроме того, возможно, я упускаю некоторые правила, которые могут быть полезны, поэтому любые предложения по новым правилам в комментариях ниже будут оценены.
3 ответа 3
Эта схема должна помочь вам понять, как выполняется обработка пакетов:
Правила filter/INPUT видят пакеты только после того, как они прошли NAT в nat/PREROUTING, поэтому по умолчанию нельзя определить разницу между получением пакета на порту 8080, потому что клиент отправил его туда напрямую , от получения пакета на порт 8080, потому что клиент отправил его на порт 80, который затем был перенаправлен на порт 8080. В обоих случаях они видят пакет, прибывающий на порт 8080. Поэтому вам нужна дополнительная информация, чтобы иметь возможность сказать этим двум случаях отдельно.
Прежде всего: это правило следует удалить, поскольку оно бесполезно:
Вы можете использовать conntrack match iptables, который запрашивает систему отслеживания соединений netfilter и, таким образом, имеет доступ к недостающей информации: в этом случае, является ли текущий входящий пакет частью соединения, которое подверглось преобразованию DNAT или нет, используя --ctstate DNAT (REDIRECT — это частный случай DNAT, точно так же, как MASQUERADE — это частный случай SNAT). Существуют и другие параметры для этого совпадения, такие как --ctorigdstport и т. д., которые, вероятно, могут дать аналогичные результаты.
Я приведу только важные правила этого случая, а не все, чтобы проиллюстрировать объяснение. Просто используйте их, когда это необходимо, в нужном месте.
вероятно, сразу после универсального . УСТАНОВЛЕНО,СВЯЗАННО -j ПРИНЯТЬ строку:
(или не добавляйте это последнее правило DROP, если позже появится универсальное правило удаления).
Первое правило INPUT будет сопоставлять трафик, прибывающий на порт 8080, который был ДНКТирован (здесь из первоначального поступления на порт 80), а второе правило отбрасывает то, что осталось на порту 8080: попытки прямого подключения.
Примечание: если вам интересно, почему совпадение состояния и совпадение conntrack выглядят одинаково, это состояние было заменено conntrack . На самом деле, внутри модуль ядра xt_conntrack.ko обрабатывает сопоставление состояния в дополнение к сопоставлению conntrack для обратной совместимости.
Еще один способ передачи этой информации — использование метки пакета. Это более общий метод, который можно применять во многих других случаях. Это произвольное число, которое будет маркировать пакет (только в ядре, а не в сети) и может использоваться в нескольких местах, включая совпадение меток iptables для изменения решений. Поскольку цель MARK не является завершающим правилом, ее можно использовать перед фактическим правилом REDIRECT. Поскольку они отображаются в шестнадцатеричном формате, я установил их также в шестнадцатеричном формате. Значение зависит от вас, чтобы выбрать, что оно означает. Здесь 0x80 (десятичное число 128) само по себе будет передавать информацию «попал на порт 80 и был перенаправлен на порт 8080», поэтому нет необходимости повторно проверять порт позже, проверка отметки подтверждает все. Как обычно, учитывается первый пакет соединения: каждый второй пакет этого соединения обрабатывается общим правилом conntrack с отслеживанием состояния. УСТАНОВЛЕНО,СВЯЗАННО -j ПРИНЯТЬ .
После общего . УСТАНОВЛЕНО,СВЯЗАННО -j ПРИНЯТЬ строку:
Я также должен предупредить вас об опасности использования правила REJECT без предварительного отбрасывания (а не отклонения) пакетов состояния INVALID. Это может вызвать проблемы со случайным сбросом соединения в некоторых редких случаях перегрузки, когда TCP-пакеты поступают в неправильном порядке. Соответствующая документация по этой проблеме в настоящее время рассматривается для добавления:
Переадресацию портов SSH часто называют туннелированием SSH, и эти два термина взаимозаменяемы.
Зашифрованный «туннель» SSH служит сосудом для передачи различных данных и их безопасной доставки в удаленную систему. Этот метод регулярно используется для обхода стандартных протоколов безопасности брандмауэра. Переадресация портов является компонентом большинства клиентских и серверных программ SSH.
Узнайте, как использовать OpenSSH для Linux и клиент Windows PuTTY для включения локальной, удаленной или динамической переадресации портов SSH.
- Клиент/сервер SSH по вашему выбору (OpenSSH или PuTTY)
- Доступный IP-адрес или имя удаленного/локального сервера
Как использовать переадресацию локального порта
К ценным сетевым ресурсам обычно не допускается удаленный доступ по SSH. Это было бы серьезным ограничением в современной распределенной среде. Организации обычно решают эту проблему, настраивая промежуточный SSH-сервер для приема удаленных SSH-подключений.
Ваш локальный SSH-клиент устанавливает соединение с удаленным SSH-сервером.Затем соединение перенаправляется на ресурс внутри доверенной внутренней сети. Устанавливаются соединения SSH, и усилия по обеспечению безопасности могут быть сосредоточены на промежуточном сервере SSH, а не на отдельных ресурсах в сети.
Переадресация локального порта с помощью OpenSSH
Чтобы использовать туннелирование SSH в Linux, необходимо предоставить клиенту номера исходного и целевого портов, а также расположение целевого сервера. Местоположение может быть либо IP-адресом, либо именем хоста.
Основной синтаксис команды переадресации локального порта прост:
⦁ ssh — запускает клиентскую программу SSH на локальном компьютере и устанавливает безопасное соединение с удаленным сервером SSH.
⦁ -L local_port:destination_server_ip:remote_port — локальный порт локального клиента перенаправляется на порт целевого удаленного сервера.
⦁ ssh_server_hostname — этот элемент синтаксиса представляет имя хоста или IP-адрес удаленного SSH-сервера.
Практический пример команды переадресации порта SSH может иметь следующую форму:
В приведенном выше примере весь трафик, отправленный на порт 5901 на вашем локальном хосте, перенаправляется на порт 4492 на удаленном сервере, расположенном по адресу 188.17.0.5.
Переадресация локального порта с помощью PuTTY
PuTTY — это удобный SSH-клиент для Windows. Настройте локальное туннелирование SSH, выполнив следующие действия:
- При запуске приложения PuTTY на экране «Сеансы» можно ввести имя хоста или IP-адрес и номер порта целевого SSH-сервера (пример: [email protected] и номер порта 22).
- Используйте список категорий слева, чтобы перейти к Соединение > SSH > Туннели.
- Выберите «Локальный», чтобы определить тип переадресации порта SSH.
- Введите номер своего локального порта в поле Исходный порт.
- Введите адрес назначения и номер порта в поле «Назначение». Используйте следующий формат: IP-адрес_сервера_назначения:удаленный_порт.
(например, исходный порт: 5901, целевой: 188.17.0.5:4492) - Убедившись, что введенная информация верна, нажмите "Добавить".
- Теперь все параметры соединения установлены. Параметр «Открыть» инициирует локальную переадресацию портов SSH.
Примечание. Если вы используете Ubuntu, обратитесь к нашему руководству Как установить PuTTY в Ubuntu.
Как использовать удаленную переадресацию портов
Целью удаленной переадресации является предоставление удаленному серверу доступа к ресурсам на вашем локальном компьютере. Удаленная переадресация представляет собой инверсию процесса локальной переадресации, который мы рассмотрели ранее.
Переадресация удаленного порта с помощью OpenSSH
Основной синтаксис для команды переадресации удаленного порта следующий:
Пользователи, имеющие доступ к SSH-серверу, теперь могут получать доступ к ресурсам на вашем локальном компьютере.
Переадресация удаленного порта с помощью PuTTY
- Запустите приложение PuTTY. Начальный экран «Сеансы» позволяет указать IP-адрес и номер порта целевого SSH-сервера.
- Используйте список категорий слева, чтобы перейти к Соединение > SSH > Туннели.
- Выберите «Удаленный», чтобы определить тип переадресации порта SSH.
- Введите номер удаленного порта в поле Исходный порт (например, 8080).
- Введите адрес назначения и номер порта в поле "Назначение", используя следующий формат: локальный_хост:локальный_порт (например, localhost:5534).
- Убедившись, что введенная информация верна, нажмите "Добавить".
- Выберите «Открыть», чтобы установить удаленную переадресацию портов SSH.
В приведенном выше примере пользователи и приложения могут подключиться к порту 8080 на удаленном сервере SSH, а затем получить доступ к локальному компьютеру, используя порт 5534.
Как использовать динамическую переадресацию портов
Динамическое перенаправление портов не так хорошо известно, как два предыдущих варианта.Большинству пользователей проще использовать переадресацию локальных портов для достижения аналогичных результатов. Динамическое перенаправление портов может обеспечить большую гибкость, поскольку вам больше не нужно использовать предопределенный удаленный порт и сервер.
Примечание. При использовании динамической переадресации портов необходимо настроить отдельные программы для использования прокси-сервера SOCKS.
Динамическая переадресация портов с помощью OpenSSH
С помощью команды ssh и аргумента –D вы можете использовать SSH-клиент для создания прокси-сервера SOCKS на локальном компьютере.:
Следующая команда открывает прокси-сервер SOCKS через порт 5534 на вашем локальном компьютере:
Теперь вы можете настроить локальный ресурс, например браузер, на использование порта 5534. Весь трафик, исходящий от этого ресурса, направляется через соединения SSH, установленные для определенного порта.
Динамическая переадресация портов с помощью PuTTY
- Введите имя хоста или IP-адрес и номер порта SSH-сервера назначения на главном экране PuTTY Sessions.
- Используйте список категорий, чтобы перейти к Соединение > SSH > Туннели.
- Выберите «Динамический», чтобы определить тип переадресации порта SSH.
- Введите номер динамического порта в поле Исходный порт (например, 5534). Прокси-сервер SOCKS на вашем локальном компьютере будет использовать этот порт для динамической пересылки трафика.
- Убедившись, что введенная информация верна, нажмите "Добавить".
- Теперь все параметры соединения установлены. Выберите параметр «Открыть», чтобы начать динамическую переадресацию портов SSH.
Для динамической переадресации необходимо настроить и включить каждое приложение для прокси-сервера SOCKS.
В этом руководстве представлены три различных типа переадресации портов SSH, команды, которые необходимо использовать, и способы их реализации в вашей системе.
Переадресация портов SSH — это мощная функция, и ее нужно тщательно администрировать. На протяжении всего процесса следует поддерживать высокие стандарты безопасности.
Я хотел бы ненадолго принять подключения для разработки, когда у меня есть NAT, и поэтому я пытаюсь сделать следующее:
Что не удается, поскольку я пытаюсь привязать порт с низким уровнем:
Итак, я обнаружил, что могу использовать setcap 'cap_net_bind_service=+ep' /my/application, чтобы он мог прослушивать порты ниже 1024. Итак, у меня есть это в моем suders crontab:
Но он по-прежнему не позволяет мне подключиться к порту 80. Что я делаю неправильно? Я просто собираюсь использовать nginx для проксирования на 8080 или iptables или что-то в этом роде, но мне все еще любопытно, почему то, что я пытался сделать, не сработало.
@Gilles Я использую ext4, это образ Ubuntu по умолчанию вне AWS, и я не делал с ним ничего особенного.
Похоже, вы являетесь пользователем root на коробке. Может быть, я невежествен, но не должен ли простой запуск первой строки от имени пользователя root решить вашу проблему?
@Christian Вы не можете привязываться к sudo по умолчанию. Например, вы не можете apt-get установить foo без предварительного выполнения sudo .
@KitSunde Да, root — это не-Ubuntuic способ сказать sudo . Это пользователь со всеми привилегиями, которые обычный пользователь получает только при выполнении sudo . root также иногда называют суперпользователем. Итак, в основном мой вопрос к вам был таким: кажется, вы можете выполнять sudo на коробке, почему вы не можете в этом случае?
6 ответов 6
Если вам интересно, pw имеет тип struct passwd * и в Linux определяется в /usr/include/pwd.h
Это отличный вариант использования socat .
Сначала выполните удаленную переадресацию на порт 8080 (или любой другой разрешенный порт) удаленной машины:
Затем на удаленном компьютере сопоставьте порт 80 с портом 8080:
Примечания:
Как предложил Дирк Хоффман, эти две команды можно объединить в одну строку:
(-t необходим, если вам нужен интерактивный терминал для ввода пароля sudo.)
также можно выполнить оба в одной команде, например: ssh -t -i ~/.ssh/id_rsa -R 0.0.0.0:8080:0.0.0.0:8080 user@remoteMachine -- "sudo socat TCP-LISTEN: 80,разветвить TCP:localhost:8080"
Привет, @Anu, я предполагаю, что другая служба (например, Apache или nginx) уже использует порт 80. Я бы проверил, какая программа использует порт, и, если это не обязательно, отключил бы ее.
Я столкнулся с похожей проблемой, поэтому в итоге я решил добавить правило DNAT в цепочку OUTPUT таблицы nat:
Это правило фактически заменяет порт назначения 80 на 8080 для всех локально сгенерированных пакетов TCP.
Если вы хотите также разрешить переадресацию любых входящих соединений, добавьте одно дополнительное правило в цепочку PREROUTING nat:
где 10.0.0.200 — это IP-адрес интерфейса, который должен перенаправлять входящие подключения к вашему веб-сервису
С клиентской стороны вы можете запустить ssh через sudo:
Это работает, хотя я, по общему признанию, не уверен в последствиях для безопасности вашей локальной системы.
Разрабатывая решение Бена Мареса, приведенное выше,
ниже показан один вкладыш, который:
открывает два удаленных перенаправления портов:
1. удаленный порт 8888 на локальный порт 80
2. удаленный порт 8443 на локальный порт 443
на удаленной машине socat ничего не подключает
1. поступающие на порт 80 для потоковой передачи на порт 8888,
который затем туннелируется на порт 80 локального хоста,
2. поступающие на порт 443 для потоковой передачи на порт 8443,
который затем туннелируется на порт 443 локального хоста
поэтому, если вы выполняете команду, вы должны указать свой корневой пароль удаленной машины (чтобы иметь возможность просматривать порты 80/443), а затем (пока туннель установлен) все, что приходит на порт 80 или 443 удаленного хоста, будут туннелироваться на порты вашего локального компьютера 80 или 443 соответственно.
помните!!
для возможности привязки ко всем сетевым интерфейсам (0.0.0.0) вам необходимо отредактировать ваши удаленные машины /etc/ssh/sshd_config и установить GatewayPorts clientspecified или GatewayPorts yes
вы можете проверить это на удаленной машине с помощью команды netstat -tlpn | grep -E '8888|8443', который должен показывать:
Читайте также: