2013-05-02 4 views
1

NAT 뒤에 간단한 P2P 애플리케이션을 구현해야합니다. 신뢰할 수 있고 안전한 연결을 통해 데이터를 전송해야합니다 (TCP를 통한 암호화 된 데이터). 이론적 배경에서 여러 RFC (5389, 5769 및 5780)에 설명 된 NAT 트래버 설 기술 (예 : NAT 용 세션 통과 유틸리티)이 있음을 알고 있습니다.P2P 연결을위한 NAT 트래버스 구현

실제로 (필자는 C++ 프로그래밍 언어로) 이러한 시스템을 구현하는 데 필요한 도구/라이브러리를 찾을 수 없지만 실제로는 그렇습니다. 내가 이미 맹목적으로 주위에 인터넷 검색에 의해 발견 : ICE 것은 TURN, 이미지 아래 libnice, libjingleSTUNTMAN

는 어떻게 보일지에 대해 설명합니다. 유효한 IP 주소를 가진 VPS, NAT 뒤에있는 PC 및 다른 NAT 뒤에있는 센서가 있습니다. 그들은 개인 IP를 가지고 있습니다. 내 센서를 서버에 연결하고 모니터를 찾고 연결 요청을 보내주기를 원합니다. 연결 설정 후 릴레이 서버는 데이터 트래픽을 지시하는 데 사용되어서는 안됩니다.

Sensor <--> AP0 <--> R3 <--> {THE INTERNET} <--> R2 <--> Monitor 

현재 모든 데이터가 VPS를 통해 전송 : 나는 의사 소통을 내 센서를 원하고이 경로를 사용하는 모니터

Sensor <--> AP0 <--> R3 <--> {THE INTERNET} R1 <--> 
VPS <--> R1 <--> {THE INTERNET} <--> R2 <--> Monitor 

Network

+0

물어 보지 않아도되지만 포트 포워딩이나 UPnP 지원에 문제가 있습니까? –

+0

@AnthonyAccioly 아니요 방금 언급 한 것을 잊어 버렸습니다. 나는 완전히 혼란스러워. 내 머리를 돌려서 시작점을 찾을 수 없다. –

답변

2

기본적으로 사용자가 port forward 일 수 있다면 프로그래밍보다 인프라 문제가 더 중요합니다. 공용 IP/포트에서 개인 IP/포트로 트래픽을 보내도록 라우터를 구성하면됩니다.: 당신이 멋진 싶어하고 라우터 UPnP을 지원하는 경우

R2: Port 500 - TCP -> Laptop-PT - Port 500 
R3: Ports 16000/16500 - TCP/UDP -> PDA-PT - Port 16000/16500 

, 그냥 구현하는 라이브러리에 리조트 IGD protocol (예를 들어, MiniUPnP), 응용 프로그램이 포트 매핑을 제어하기 위해서이다. This article은 몇 가지 샘플 코드와 함께 좋은 출발점을 제공합니다 (물론 튼튼한 라이브러리를 권하고 싶지만).

+0

라우터 구성에 액세스해야합니까? –

+0

예. UPnP 라이브러리를 통해 UPnP를 지원하고 UPnP를 지원하는 경우 (수동으로 @hris가 지적한대로) 관리 인터페이스를 통해 라우터를 구성합니다. 내 대답에있는 기사를 보아라, 나는 그것이 일을 분명히 할 것이라고 생각한다. –

+0

나는 그 기사를 읽었다. 이제 UPnP를 사용한 포트 포워딩에 대해 생각해 볼 수 있습니다. 그렇다면 라우터는 어떻게 현실 세계에 있습니까? 데이터 경로의 모든 라우터에서 UPnP 지원이 부족하다는 것에 대해 걱정해야합니까? –

2

당신이 궁극적으로 원하기 때문에 릴레이 서버를 완전히 제거하고 모니터와 엔드 포인트가 직접 통신하기를 원합니다 - 직접 통신의 문제를 해결하려고합니다. NAT 뒤의 두 서버 간 통신.

1) 감시 시스템의 공용 IP 어드레스를 획득하기 위해 센서를 허용 :

하고 있으므로 해결하기 두 가지 문제점이있다.

2) TCP 연결에 대한 SYN 패킷이 라우터 -PT R2의 NAT를 통해 모니터로 전달되도록 허용합니다.

릴레이가 도움을 줄 수있는 첫 번째 문제 : TURN을 사용하여 서버를 통해 메시지를 중계하여 모니터의 공용 IP 주소를 센서에 전달할 수 있습니다.

그러나 두 번째 문제는 라우터의 구성에 실제로 영향을 주므로 일반화 된 솔루션을 알지 못합니다. 라우터는 SYN을 전달할 NAT 뒤에있는 많은 시스템을 알아야합니다. 모든 사람에게 전달할 수는 없습니다. 모두 응답합니다.

대부분의 NAT 사용 가능 라우터에는 들어오는 패킷을 라우팅 할 호스트를 구성 할 수있는 구성 설정이 있습니다. 랩톱 모니터링 시스템을 DMZ로 만들거나 특정 TCP 포트의 트래픽을 원하는 시스템으로 보내십시오. 그러나 각 라우터는이 구성을 다르게 처리합니다. 내가 알고있는 그 구성의 표준화가 없다.

희망이 있습니다.

+1

예,하지만 TCP 연결이 지점 간 연결이기 때문에 해당 데이터를 릴레이 서버를 통해 전달하지 않으려면 연결 설정에 도움이되지 않습니다. (내가 말했듯이, 모니터의 공개 IP 주소를 얻는 것을 제외하고) – chris

+1

다른 말로하자면, 릴레이는 TCP 연결 설정을위한 매개 변수 통신에 도움이 될 수 있지만 실제 TCP 연결에 대한 데이터 전송에는 도움이되지 않습니다. 가장 어려운 부분 - TCP 연결을 위해 전송되는 첫 번째 패킷 : SYN 패킷. – chris