nazarpc
@nazarpc
Open Source enthusiast

Как настроить Nginx reverse proxy для всех портов?

Ситуация такая:
* один физический сервер с выделенным IP
* несколько виртуальных машин

Нужно:
* в зависимости от домена проксировать на определённую виртуальную машину все порты (то есть example1.com:22 попадет на первую виртуалку, а example2.com:22 на вторую)
* проксирование должно быть невидимое для виртуалки (remote addr и подобное), чтобы ей казалось, будто она смотрит в мир напрямую

Поиск в основном выдает решение для другого рода задач.

Если ошибаюсь в чём-то - прошу поправить, главное решить задачу.
  • Вопрос задан
  • 10421 просмотр
Решения вопроса 1
nazarpc
@nazarpc Автор вопроса
Open Source enthusiast
С такой постановкой задачи не решается.
Так как на самом деле используются не виртуалки, а Docker контейнеры - решил с помощью reverse proxy для http/https, биндингом на другие порты ssh контейнеров где он есть, и выделенными IP для более сложных ситуаций.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
shurph
@shurph
Похоже, что проксировать все порты автоматически не получится. Для каждого порта нужно будет прописывать в конфиге строчки отдельно. Для вашего примера понадобится что-то такое:
server {
    listen 22;
    server_name example1.com;
    location / {
        proxy_pass http://192.168.1.1:22;
    }
}
server {
    listen 22;
    server_name example2.com;
    location / {
        proxy_pass http://192.168.1.2:22;
    }
}


про remote_addr почитайте вот это:
habrahabr.ru/post/177113
На сколько я понимаю, поместить в remote_addr адрес пользователя не получится на стороне nginx'а.

UPD (на основе дискуссии в комментариях):
у меня есть сомнения, что такое возможно настроить с помощью nginx (да и вообще — настроить).
Во первых, nginx — это http сервер и, соответственно, http прокси (разве что ещё почтовые протоколы он поддерживает). Если нужны другие протоколы, то и использовать стоит другие решения.

Во вторых, я очень не уверен, что при подключении по другим протоколам вы сможете определить, что пользователь подключается к домену example1.com, а не к example2.com.
Ведь как определяется домен в случае http? Браузер передаёт такой запрос на сервер, подключаясь к example1.com:

GET / HTTP/1.0
Host: example1.com
Ответ написан
Lynn
@Lynn
nginx, js, css
В такой постановке задача в принципе не решается.

Во-первых, nginx это http/mail сервер и проксировать произвольный протокол он не умеет. (Возможно кто-то написал модуль для балансировки MySQL, но это всё равно ещё один частный случай протокола, а не любой протокол).

Во-вторых, понятие домена есть только в http, а в том же ssh клиент подключается по паре IP:порт и никаких дополнительных данных не передаёт.

В-третьих, а зачем всё это? Обычно достаточно проксирования http (тут нормально работает определение по доменам) и проброс ssh с разделением по портам.
Ответ написан
Комментировать
opium
@opium
Просто люблю качественно работать
нгинкс не умеет проксировать ваш ссх
да и вообще по домену никто проксировать ссх не умеет, так как в нем не передается домен скорее всего.
купите айпишников и выдайте каждой виртуалке, стоит все копейки.
Ответ написан
Комментировать
Gasoid
@Gasoid
iptables решает в данном случае
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы