두 개의 들어오는 TCP 연결 바인딩

두 개의 들어오는 TCP 연결 바인딩

여러 장치를 연결하는 클라이언트가 있습니다. 기기당 월별 고정 IP 요금은 지불되지 않습니다. 구조를 변경할 계획입니다. 이 새로운 아키텍처에서는 장치가 서버에 연결됩니다. 서버를 작성하는 대신. 중간 솔루션을 찾고 있습니다.

현재 아키텍처:

--------------                           ------------
| POLLER APP | ------------------------> | DEVICE 1 |
--------------                           ------------
         |  |
         |  |                            ------------
         |  ---------------------------> | DEVICE 2 |
         |                               ------------
         |
         |                                   ...
         |
         |                               ------------
         ------------------------------> | DEVICE N |
                                         ------------

폴러 애플리케이션은 고정 IP를 통해 각 장치에 순차적으로 연결됩니다.

해결 방법 1:

--------------                           ------------
|   SERVER   | <------------------------ | DEVICE 1 |
--------------                           ------------
         A  A
         |  |
         |  |                            ------------
         |  ---------------------------  | DEVICE 2 |
         |                               ------------
         |
         |                                   ...
         |
         |                               ------------
         ------------------------------  | DEVICE N |
                                         ------------

(제가 좋아하지 않는) 이 솔루션에서는 동적 IP가 있는 장치용 서버 애플리케이션을 작성해야 합니다.

해결 방법 2(내가 찾고 있는 것):

                                         ------------
--------------                           |          |               ------------
| POLLER APP | ------------------------> |     X    | <------------ | DEVICE 1 |
--------------                           |          |               ------------
         |  |                            |          |
         |  |                            |          |               ------------
         |  ---------------------------> |          | <------------ | DEVICE 2 |
         |                               |          |               ------------
         |                               |          |
         |                               ------------
         |                               
         |                               ------------
         ------------------------------> | DEVICE S |
                                         ------------

X Box를 서버로 사용합니다. 원격 장치는 이 상자에 연결할 수 있으며폴러 애플리케이션로컬로 또는 Unix 도메인 소켓을 통해 서버에 연결할 수 있습니다. X Box는 로컬 연결에서 원격 장치로 메시지를 반복합니다.

내 질문은 다음과 같습니다이를 달성하는 데 도움이 될 수 있는 전체 또는 부분 솔루션이 있습니까? 들어오는 두 연결을 직접 쉽게 바인딩할 수 있나요?

답변1

폴러가 장치에 접촉하는 빈도에 따라 사용하기에 충분할 수 있습니다.동적 도메인 이름 확인. 동적 DNS를 사용하면 고정 IP 주소가 전혀 필요하지 않으며 동적 DNS를 지원하는 공급자가 제어하는 ​​도메인 이름만 있으면 됩니다. 장치가 (재)연결될 때마다 DNS 공급자에 연결하여 새 IP 주소를 요청합니다. 이 방법의 단점은 DNS 정보가 전파되는 데 몇 분이 걸리므로 IP 주소가 변경될 때마다 몇 분 동안 장치에 액세스할 수 없다는 것입니다.

고정 IP 주소가 있는 상자를 원할 경우 원하는 것은 다음과 같습니다.NAT(네트워크 주소 변환). 아이디어는 박스 X가 특정 포트에서 들어오는 TCP 연결을 수신할 때 테이블을 참조하여 연결을 전달할(또는 자체적으로 연결을 얻을) 장치를 결정한다는 것입니다. 이는 IP 패킷 및 TCP 연결 수준에서 발생하므로 폴러나 장치에 특별한 소프트웨어를 설치할 필요가 없습니다. 폴러가 동일한 IP 주소를 사용하도록 구성하지만 포트 번호는 다릅니다.

거의 모든 장치가 NAT를 지원합니다. 예를 들어, 홈 라우터는 인터넷 서비스 제공업체가 단일 IP 주소만 제공하더라도 여러 장치(컴퓨터, 전화 등)를 인터넷에 연결할 수 있도록 이 작업을 수행합니다. 이 경우 장치는 SNAT(소스 NAT)를 수행합니다. 즉, 라우터는 컴퓨터 대신 자체적으로 TCP 연결 소스를 수정합니다(반대로, 다른 방향의 패킷 대상을 수정합니다). 귀하의 경우에는 클라이언트→서버 방향의 패킷 대상과 서버→클라이언트 방향의 패킷 소스를 수정하는 대상 NAT(DNAT)가 필요합니다. 장치가 인터넷의 다른 컴퓨터에 연결해야 하는 경우 Box X가 DNAT와 SNAT를 모두 수행하도록 할 수 있습니다.

Linux에서는 iptablesNAT를 구성할 수 있습니다. 보다네트워크 필터 작동 방법또는 웹에 있는 다양한 Linux NAT 튜토리얼 중 하나를 참조하세요.

답변2

나는 이를 위해 Python 스크립트를 작성했습니다. 어쩌면 이것을 달성하는 더 짧은 방법이 있을 수도 있지만 찾을 수 없습니다. 내 스크립트는 1560 장치 연결을 수신하는 외부 서버 1개를 생성합니다. 모든 장치 연결에 대해 새로운 내부 서버가 생성됩니다. 금후. 일치하는 내부 연결과 외부 연결 간에 메시지를 전송합니다.

                  B I N D E R
                 -------------
                 | INT |  E  |                 ------------
-------> (60000) | SRV |  X  | (1560) <------- | DEVICE 1 |
                 |     |  T  |                 ------------
                 |-----|  E  |
                 | INT |  R  |                 ------------
-------> (60001) | SRV |  N  | (1560) <------- | DEVICE 2 |
                 |     |  A  |                 ------------
                 |-----|  L  |
                 | INT |     |                 ------------
-------> (60002) | SRV |  S  | (1560) <------- | DEVICE 3 |
                 |     |  E  |                 ------------
                 |-----|  R  |
                 | INT |  V  |                 ------------
-------> (60003) | SRV |  E  | (1560) <------- | DEVICE 4 |
                 |     |  R  |                 ------------
                 -------------

이 스크립트에는 python-twisted종속성이 필요합니다. 이를 위해 github 저장소를 만들었습니다.github.com/codvio/binder

관련 정보