여러 장치를 연결하는 클라이언트가 있습니다. 기기당 월별 고정 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에서는 iptables
NAT를 구성할 수 있습니다. 보다네트워크 필터 작동 방법또는 웹에 있는 다양한 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