nginx를 사용하여 나가는 연결의 IP 주소 마스크

nginx를 사용하여 나가는 연결의 IP 주소 마스크

우리는 단일 IP 주소를 통해 여러 처리 서버에서 나가는 모든 연결을 채널링해야 하는 비즈니스 요구 사항이 있습니다.

우리의 설정은 다음과 같습니다:

들어오는 http 요청에 대한 로드 밸런서 역할을 하는 nginx 서버가 있습니다. 그런 다음 처리 서버에 연결되고 다시 고객 데이터베이스에 연결되는 여러 웹 서버가 있습니다.

클라이언트 --> 로드밸런서 --> 웹 서버 --> 프로세스 서버 --> 데이터베이스

클라이언트 <-- 로드 밸런서 <-- 웹 서버 <-- 프로세스 서버 <-- 데이터베이스

현재 우리는 고객에게 데이터베이스 화이트리스트에 추가해야 하는 IP 주소 목록을 제공합니다. 그러나 규모를 확장하면 이 화이트리스트가 길어지고 고객은 화이트리스트를 각각 다시 업데이트해야 합니다.

원하는 설정

이 문제를 해결하기 위해 우리는 처리 서버의 IP 주소를 마스킹하는 다른 nginx 서버를 통해 나가는 모든 연결을 채널링하려고 합니다. 결과적으로 이제 고객이 화이트리스트에 추가할 IP 주소는 하나만 갖게 됩니다.

클라이언트 --> 로드 밸런서 --> 웹 서버 --> 프로세스 서버 --> IP 마스킹 --> 데이터베이스

클라이언트 <-- 로드 밸런서 <-- 웹 서버 <-- 프로세스 서버 <-- IP 마스킹 <-- 데이터베이스

이것이 nginx에서만 가능합니까? 그렇다면 이를 달성하기 위해 어떤 조치를 취해야 합니까?

답변1

또 다른 가능한 해결책은 NAT를 사용하는 것입니다. 이 경우 마스킹 서버는 네트워크 주소 변환이 구성된 라우터가 됩니다. 이 경우 node.js 구성에서 고객 데이터베이스 IP를 변경할 필요는 없지만 네트워크를 변경해야 하며, 가능하면 모든 프로세스 서버의 라우팅 구성을 변경하고 NAT가 구성된 하나의 게이트웨이를 보유해야 합니다.

답변2

당신이 요청한 것은 nginx 버전 1.9.0부터 가능합니다. 그들은 tcp(http 아님) 프록시 지원을 추가했습니다. 1.9.13부터 UDP 프록시도 추가되었습니다. 읽다https://www.nginx.com/resources/admin-guide/tcp-load-balancing/#upstream 그리고https://nginx.ru/en/docs/stream/ngx_stream_proxy_module.html

까다로운 부분은 연결할 데이터베이스를 결정하기 위해 (IP 마스크 nginx)에서 들어오는 연결을 구별하는 것입니다. HTTP 프록시에서는 호스트 이름을 사용할 수 있습니다. TCP 프록시에서는 다른 포트나 다른 IP 주소에서 수신 대기해야 합니다. nginx.conf:

worker_processes  4;

error_log  /var/log/nginx/error.log;

events { worker_connections  1024; }
stream {
        server {
           listen 3307;
           proxy_pass client2.db.dev:3306;
           proxy_buffer_size 16k;
        }
        server {
           listen 3308;
           proxy_pass client1.db.dev:3306;
           proxy_buffer_size 16k;
        }
}

관련 정보