Як налаштувати NGINX як зворотний проксі для різних номерів портів?


15
I have NGINX configured like this as a reverse proxy for http requests:

server {
    listen 80;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:3000;
    }
}

Я також хочу прокси-ssh (порт 22) запитів. Чи можу я додати інший подібний блок сервера до цього ж файлу конфігурації:

server {
    listen 22;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:22;
    }
}

Такий, що кінцевий результат такий:

server {
    listen 80;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:3000;
    }
}
server {
    listen 22;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:22;
    }
}

ТІА,
Оле


2
nginxвиступає як httpпроксі. Якщо встановити його на зворотний порт проксі-сервера 22, він не дозволить вам передавати трафік SSH - лише httpтрафік на SSH-сервер, що, очевидно, не вдасться.
garethTheRed

Перейдіть на перевірку HAProxy .

Відповіді:


13

Протокол SSH не грунтується на HTTP, і, як такі, не може бути проксіровать через регулярні proxy_passзngx_http_proxy_module

Однак останнім часом, починаючи з nginx 1.9.0 (випущений як стабільний з 1.10.0 за 2016-04-26), nginx отримав підтримку для проходження протоколу TCP-потоку , а це означає, що якщо у вас є досить недавня версія nginx, насправді ви можете зв’язати з ним проксі-з'єднання (однак зауважте, що ви не змогли б додати нічого подібного X-Real-IPдо проксі-з'єднання, оскільки це не засновано на HTTP).

Для отримання додаткової інформації та прикладів подивіться:


8

Оскільки Nginx версії 1.9.0, NGINX підтримує модуль ngx_stream_core_module, його слід включити за допомогою --with-stream. Якщо модуль потоку увімкнено, можна ssh протоколу tcp-проксі

stream {
    upstream ssh {
        server 192.168.1.12:22;
    }
        server {
        listen        12345;
        proxy_pass    ssh;

    }

}

https://www.nginx.com/resources/admin-guide/tcp-load-balancing/


Це все приємна особливість nginx - але IMHO марно, коли ви хочете мати реальний зворотний проксі, наприклад, nginx виконує ідеальну роботу для HTTP. Справа в тому, що підхід потоків - це простий NAT - тому я вважаю за краще виконати це завдання на крайовому маршрутизаторі. Що я хотів би / хотів би мати тут - це точно такий же набір функцій, як і зворотний проксі HTTP. Іншими словами, у мене є лише одна загальнодоступна IP-адреса - таким чином, порт 22 доступний лише для однієї машини - але якби був спосіб розрізнити запити за формою ssh me@srv1.my.netі ssh me@srv2.my.net- було б чудово. Це обмеження протоколу (SSH не видасть імен DNS, який використовує клієнт)
stamster

@stamster, ви вже можете зробити те ж саме, використовуючи різні номери портів (наприклад, 122 для srv1і 222 для srv2), або використовуючи вкладені сеанси ssh, де ви спершу ssh на загальнодоступний сервер / IP, а звідти, сш в листя; наприклад, ssh user@example.org 'ssh user@192.168.5.1'.
cnst

1
Ні, вимога / ідея полягає в тому, щоб використовувати порт за замовчуванням (22 або будь-яку іншу службу ..) як порт призначення, а потім маршрутизувати трафік залежно від імені DNS або близько того. Як і всі ми використовуємо nginx як зворотний проксі-сервер веб-http, так кожен домен орієнтований на порти за замовчуванням 80, 443, а потім nginx маршрутизує трафік залежно від правил проксі. Звичайно, клієнт має HOSTзаголовок, тому легко відрізнити, на який сайт він націлений ... Вкладені сесії SSH є своєрідним рішенням, але брудним - це працює. Я опинився з різними портами нашої крайової мережі - старий добрий NAT, як найбільш KISS і надійне рішення.
stamster
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.