Bagaimana cara mengkonfigurasi NGINX sebagai proxy terbalik untuk nomor port yang berbeda?

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;
    }
}

Saya juga ingin mem-proxy permintaan ssh (Port 22). Dapatkah saya menambahkan blok server lain seperti ini ke file konfigurasi yang sama:

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;
    }
}

Sehingga hasil akhirnya adalah ini:

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;
    }
}

TIA,
Ole

Ole
sumber
2
nginxbertindak sebagai httpproxy. Jika Anda mengaturnya untuk membalikkan port proxy 22, itu tidak akan memungkinkan Anda untuk melewati lalu lintas SSH - hanya httplalu lintas ke server SSH, yang jelas akan gagal.
garethTheRed
Periksa HAProxy .

Jawaban:

13

The protokol ssh tidak didasarkan pada HTTP, dan, dengan demikian, tidak dapat proksi melalui reguler proxy_passdaringx_http_proxy_module

Namun, baru-baru ini, dimulai dengan nginx 1.9.0 (dirilis sebagai stabil dengan 1.10.0 pada 2016-04-26), nginx mendapatkan dukungan untuk melakukan proksi aliran TCP , yang berarti bahwa jika Anda memiliki versi nginx yang cukup baru, Anda dapat, pada kenyataannya, koneksi ssh proxy dengannya (namun, perhatikan bahwa Anda tidak akan dapat menambahkan hal seperti itu X-Real-IPke koneksi proksi, karena ini bukan berdasarkan HTTP).

Untuk informasi dan contoh lebih lanjut, lihat:

cnst
sumber
8

Sejak Nginx Versi 1.9.0, NGINX mendukung modul ngx_stream_core_module, itu harus diaktifkan dengan --with-stream. Ketika modul stream diaktifkan, mereka dimungkinkan untuk ssh proxy protokol 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/

Hendi Fauzi
sumber
Itu semua fitur bagus dari nginx - tetapi IMHO tidak berguna ketika Anda ingin memiliki proxy reverse nyata seperti nginx melakukan pekerjaan yang sempurna untuk HTTP. Masalahnya adalah pendekatan aliran NAT sederhana - jadi saya lebih suka melakukan tugas itu di tepi router. Apa yang ingin / ingin saya miliki di sini - adalah fitur yang sama persis dengan HTTP reverse proxy. Dengan kata lain, saya hanya memiliki satu alamat IP publik - dengan demikian port 22 hanya tersedia untuk satu mesin - tetapi jika ada cara untuk membedakan permintaan dalam bentuk ssh [email protected]dan ssh [email protected]- itu akan bagus. Ini adalah batasan protokol (SSH tidak akan memberikan penggunaan nama klien DNS)
stamster
@stamster, Anda sudah dapat melakukan hal yang hampir sama, dengan menggunakan nomor port yang berbeda (mis., 122 untuk srv1dan 222 untuk srv2), atau dengan menggunakan sesi ssh bersarang, di mana Anda pertama kali ssh ke server publik / IP, dan dari sana, ssh ke daun; misalnya ssh [email protected] 'ssh [email protected]',.
cnst
1
Tidak, persyaratan / ide adalah menggunakan port default (22 atau layanan lain ..) sebagai port tujuan, dan kemudian untuk merutekan lalu lintas tergantung dari nama DNS atau lebih. Sama seperti kita semua menggunakan nginx sebagai server proxy web http terbalik, sehingga setiap domain menargetkan port default 80, 443, dan kemudian nginx merutekan lalu lintas tergantung pada aturan proxy. Tentu saja klien memiliki HOSTtajuk sehingga mudah untuk membedakan situs mana yang ditargetkan ... Sesi SSH bersarang adalah semacam solusi tetapi berantakan - yang berfungsi sekalipun. Saya berakhir dengan port yang berbeda di jaringan tepi kami - NAT tua yang baik sebagai solusi yang paling KISS dan dapat diandalkan.
stamster