다른 포트 번호에 대해 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
nginxhttp프록시 역할을합니다 . 프록시 포트 22를 역방향으로 설정하면 SSH http트래픽을 SSH 서버 로 전달할 수 없으며 SSH 서버 로만 트래픽이 전달 됩니다.
garethTheRed

HAProxy를 확인하십시오 .

답변:


13

SSH 프로토콜은 같은 정규 통해 프록시 할 수 없으므로, HTTP를 기반으로되지 않으며, proxy_passngx_http_proxy_module

그러나 최근 nginx 1.9.0 (2016-04-26에서 1.10.0으로 안정적으로 출시됨)부터 nginx는 TCP 스트림 프록시 수행을 지원했습니다 . 이는 최근에 충분한 버전의 nginx를 사용하는 경우, 실제로 프록시 ssh 연결을 사용할 수 있습니다 (단, 다음과 같은 것을 추가 할 수는 없습니다.X-Real-IP 프록시 기반 연결에는 HTTP를 기반으로하지 않기 때문에 프록시 연결 는 없습니다.

자세한 내용과 예는 다음을 참조하십시오.


8

Nginx 버전 1.9.0부터 NGINX는 ngx_stream_core_module 모듈을 지원하므로 --with-stream으로 활성화해야합니다. 스트림 모듈이 활성화되면 프로토콜 TCP 프록시를 ssh 할 수 있습니다

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 리버스 프록시와 정확히 동일한 기능 세트입니다. 따라서 포트 (22)는 하나의 기계 소용입니다 - - 즉, 나는 단지 하나의 공인 IP 주소를 가지고 있지만,이 형태로 요청을 구별 할 수있는 방법 인 경우 ssh me@srv1.my.netssh me@srv2.my.net- 그것은 좋은 것입니다. 그것은 프로토콜 제한입니다 (SSH는 DNS 이름 클라이언트 사용을 제공하지 않습니다)
stamster

@stamster, 다른 포트 번호 (예 : 122 srv1및 222 srv2)를 사용하거나 중첩 된 ssh 세션 (공용 서버 / IP에 먼저 ssh)을 사용하여 거의 동일한 작업을 수행 할 수 있습니다 . 나뭇잎에 ssh; 예를 들어, ssh user@example.org 'ssh user@192.168.5.1'.
cnst

1
아니요, 요구 사항 / 아이디어는 기본 포트 (22 또는 다른 서비스 ..)를 대상 포트로 사용하고 DNS 이름 등에 따라 트래픽을 라우팅하는 것입니다. 우리 모두가 역방향 웹 http 프록시 서버로 nginx를 사용하는 것처럼 각 도메인은 기본 포트 80, 443을 대상으로 한 다음 nginx는 프록시 규칙에 따라 트래픽을 라우팅합니다. 물론 클라이언트에는 HOST헤더가 있으므로 어떤 사이트를 대상으로하는지 쉽게 구별 할 수 있습니다. 중첩 된 SSH 세션은 일종의 솔루션이지만 지저분한 작업입니다. 에지 네트워크에서 다른 포트를 사용하게되었습니다. 가장 오래된 KISS이자 안정적인 솔루션 인 오래된 NAT입니다.
stamster
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.