특정 포트에 대한 수신 네트워크 요청을 다른 애플리케이션으로 라우팅

특정 포트에 대한 수신 네트워크 요청을 다른 애플리케이션으로 라우팅

포트에서 연결을 수신하는 애플리케이션이 있지만 가끔 업데이트 등을 위해 애플리케이션을 중단합니다. 해당 프로그램이 실행 중이면 해당 포트에 대한 요청이 애플리케이션으로 전송되지만, 실행 중이 아니면 요청이 다른 애플리케이션으로 전달되도록("일시적으로 사용할 수 없음" 오류가 반환될 수 있음) 시스템을 구성하는 방법을 원합니다. 메시지). 이를 달성하는 가장 쉬운 방법은 무엇입니까?

대상 컴퓨터에 대한 루트 액세스 권한이 없으므로 iptables. 다른 두 애플리케이션에 대한 연결을 라우팅하는 것 외에는 아무것도 수행하지 않는 도우미 애플리케이션을 고려했지만 더 쉬운 방법이 있기를 바랍니다.

답변1

귀하의 질문은 두 프로그램이 동일한 포트에 바인딩된 동일한 컴퓨터에서 교대로 실행된다는 것을 의미합니다. 이것은 나쁜 생각입니다. TIME_WAIT이것을 시도하면 (일명 2MSL) 문제가 발생하게 됩니다 .이 기사문제를 설명합니다. (Windows 중심이지만 여기서 말하는 내용의 대부분은 모든 TCP/IP 스택에 적용됩니다.)

BSD 소켓 API는 이 보호를 해제하는 방법( )을 제공 setsockopt(SO_REUSEADDR)하지만 이는 그렇게 하는 것이 정당한 경우 중 하나가 아닙니다.

대신 고가용성 담당자와 동일한 방식으로 문제를 해결하십시오.역방향 프록시세상과 "실제" 백엔드 서버 사이.

HTTP 세계에서 이 문제에 대한 인기 있는 솔루션 중 하나는 다음과 같습니다.nginx. 백엔드 서버가 작동 중지된 동안 클라이언트에 정적 콘텐츠를 제공하도록 구성할 수 있습니다. 프로토콜이 HTTP, IMAP 또는 POP와 같은 경우 nginx를 그대로 사용할 수 있습니다. 그렇지 않은 경우 사용자 정의 프록시 서버를 구축할 수 있습니다.

이것이 작동하려면 아마도 두 개의 TCP 포트가 필요할 것입니다. 프록시는 공용 IP의 공용 포트 번호에 바인딩됩니다. 백엔드 서버는 localhost 인터페이스에서만 보조 포트에 바인딩됩니다. 따라서 트래픽은 프록시를 통해서만 공용 네트워크에서 백엔드 서버로 이동할 수 있습니다.

두 프로그램 모두 이를 허용하도록 작성된 경우 두 프로그램을 동일한 포트에 바인딩하면 됩니다. 예를 들어, 공용 IP가 이고 1.2.3.4공용 서비스 포트가 인 경우 역방향 프록시가 IP에만 바인딩되고 "실제" 서버가 에만 바인딩 되면 2345두 프로그램 모두 포트에 바인딩될 수 있습니다 . 둘 중 하나가 (0.0.0.0)에 바인딩되면 다른 포트가 필요합니다.23451.2.3.4127.0.0.1INADDR_ANY

이는 클라이언트가 항상 동일한 프로그램인 프록시 서버와 통신하기 때문에 2MSL 문제를 해결합니다. 네트워크 스택은 2MSL 시간에 휩쓸린 길 잃은 패킷을 어떻게 처리할지 혼동하지 않습니다.

역방향 프록시의 변형은로드 밸런서, 여기서도 작동할 수 있습니다. 로드 밸런서는 지능적으로 트래픽을 다른 시스템으로 라우팅하도록 설계되었습니다. 언젠가 앱이 수평으로 확장되어야 한다고 생각한다면 이러한 종류의 프록시가 적합할 것입니다. 모든 일반 애플리케이션 서버가 다운될 때 특별한 "서비스 다운" 호스트로 트래픽을 보내는 방법을 알고 있는 로드 밸런서를 선택하게 됩니다.

로드 밸런서 솔루션 변형의 주요 문제점은 일반 로드 밸런서가 프록시하는 모든 백엔드 서비스가 동일한 포트 번호를 사용하고 IP만 다르다고 맹목적으로 가정할 수 있다는 것입니다. 하지만 보다 유연한 로드 밸런서를 얻거나 공유 서버에 대해 여러 IP를 얻을 수 있습니다.

관련 정보