LINUX.ORG.RU

правила iptables для поддоменов

 ,


0

1

Всем привет! Итак, у меня открыты порты 80, 3000, 8000 и 25565. Есть домен name.net. Как сделать так, чтобы при обращении по этому домену при обращении на порт 80 редиректило на порт 3000, но при обращении к другим портам сбрасывало? Как я понял надо сделать как-то так:

sudo iptables -t raw -A PREROUTING -d name.net -j DROP

sudo iptables -t nat -A PREROUTING -d name.net -p tcp --dport 80 -j REDIRECT --to-port 3000

Ответ на: комментарий от Duck

Эти правила где настраиваешь? Редирект тебе для чего, может nginx сразу на 3000 порт повесить?

у меня на порт 25565 не http трафик идёт

Ну покажи что-ли секцию server из конфига nginx

pavel_l
()

Во-первых, ты пытаешься сделать какую-то чушь. Просто настрой прогу на 3000 порте чтобы слушала 80-й.

Во-вторых, iptables с доменами никак вообще не связано, оно оперирует только ip-адресами.

firkax ★★★★★
()
Ответ на: комментарий от Duck

имя домена появляется только в http. «ниже» ничего не знают про имена и работают с «цифровым ip».
что за протокол и как в нем прописан домен ??

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)
Ответ на: комментарий от Duck

Твоя задача не решается. Используй разные порты с одним адресом и доменом или используй несколько IP-адресов для нескольких доменов. iptables работает с IP-адресами, домены тут не при чём.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)

Зачем тебе редирект? Просто открой 80 (и пусть nginx или что там у тебя его слушает), дропай 8000 и 25565, а 3000 вообще закрой или тоже дропай — нафига он тебе?

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от vbr

Да нет, в частном случае задача вполне себе решается. Спец демон слушает соединение и если начало, это http, то кидает его на нжинкс или сразу на сервер, а если нет, то фаллбек на tcp сервер. Решение не лучшее, но вполне рабочее.

usermod
()
Ответ на: комментарий от vbr

И таки http это пример.

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

Такие есть для ssh, а в frp оно прямо развито и позволяет неплохо развести даже ssh по доменам.

usermod
()
Ответ на: комментарий от Duck

Ты не ответил, зачем тебе вообще редиректить. В чём сакральный смысл заставлять nginx (или что там у тебя) слушать 80 и редиректить на 3000, если можно сразу сказать ему слушать 3000? Ну или наоборот, смотря куда ты что редиректить собрался.

Остальных портов это вообще никак не касается.

CrX ★★★★★
()
Ответ на: комментарий от usermod

Это не отвечает на вопрос, зачем редирект. Если 80 заблочен с той стороны, и ты предлагаешь обращаться к 3000 — ну так можно и слушать сразу на 3000. Зачем слушать на 80 и редиректить с 3000 на 80?

И наоборот.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от Duck

Да. Ибо один работает на 3 уровне, где есть только ip-адрес, а другой на 7 уровне, где в заголовке http есть специальное поле Host.

Не думай, что nginx чем то умнее. Он тоже умеет пробрасывать tcp/udp потоки (tcp stream), но там нет поля Host и поэтому nginx точно также, как и iptables не сможет различать домены.

usermod
()
Ответ на: комментарий от CrX

Ты издеваешься?

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

А закрой 3000 порт и к тебе прибежит один полудурок в месяц, который и раф то никогда не купит, нищеброд и вообще мутный типок.

А если речь про корпорацию? Там просто закрыто все, кроме трех портов для почты, сайтов и все.

Поэтому современные реалии таковы, что весь входящий трафик идет через tls в одну дырку (443 порт) и там уже раскидывай куда надо.

Я уж и не знаю, как все это еще расписать.

usermod
()
Ответ на: комментарий от usermod

Ты издеваешься?

Я нет. У меня ощущение, что издеваешься ты.

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

Я не предлагаю закрывать 80 порт. Ровно наоборот, я предлагаю прямое решение вместо редиректа. Нафига демону слушать на 3000, а с открытого 80 жёстко редиректить на этот 3000, если можно сразу слушать на 80? В данной конфигурации этот 3000 вообще не нужен.

CrX ★★★★★
()

Я кажется все таки понял, с десятой попытки.

Простой ответ - нет, это невозможно.

В tcp/ip нет понятия домена. При отправке пакета на www.name.net это имя ресолвится в адрес 1.2.3.4 и туда отправляется пакет. Никаких доменов в пакете нет и быть не может.

В протоколе http клиент может указать переменную host. По умолчанию в ней передается хост, к которому обращается клиент. Но это только в http.

usermod
()
Ответ на: комментарий от usermod

Ещё в протоколе TLS (который используется в HTTPS и некоторых других протоколах) домен передаётся тоже в отдельном поле и также может быть использован для роута тем же nginx-ом. И в общем случае он может отличаться от домена в заголовке Host, ага.

vbr ★★★★
()
Ответ на: комментарий от vbr

Насколько я помню, там в составе сертификата передаются все возможные домены, на которые этот сертификат распространяется и предается это все в обратную сторону, от сервера к клиенту.

На стороне сервера этот список доменов и так известен.

usermod
()
Ответ на: комментарий от Duck

В первом приближении, в теории, да.

Потому что то, что ты задумал настолько странно, что даже для http трафика непонятно, чем бы это можно было решить. Реверс-прокси, nginx, например, могут отдавать несколько разных сайтов по именам, могу дефолтный сайт вернуть по любому имени, кроме нужного, редирект могут вернуть на другой сайт, протокол, могут 404 вернуть и все такое.

Именно сбрасывать соединение прокси не умеют. А есть ли алг для http в iptables или nft, это надо рыть.

В целом вся задача выглядит как ненужная ерунда, поэтому и решения скорее всего нет.

usermod
()