2012-11-25 4 views
3

port translation에 대한 내용을 읽었습니다. 이제 테스트하고 싶습니다.NAT 라우터 뒤에 UDP 패킷을 수신 할 수 없습니다.

NAT 라우터 및 외부 IP 주소가있는 서버 뒤에 로컬 컴퓨터가 있습니다.

내 컴퓨터의 5000 번째 포트에서 서버의 4000 번째 포트로 패킷을 보내는 방법입니다.

import socket 
import sys 

UDP_IP = #external server IP address 
UDP_PORT = 4000 
MESSAGE = "Hi!" 

sock = socket.socket(socket.AF_INET, # Internet 
        socket.SOCK_DGRAM) # UDP 
sock.bind(('0.0.0.0', 5000)) 
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) 

오른쪽 그 후 나는 내가 응답을 보내 (someIP, somePort)에서 들어오는 UDP를 볼 때 서버에서 로컬 컴퓨터

import socket 
import sys 

UDP_IP = #my ip address in the local network 
UDP_PORT = 5000 

sock = socket.socket(socket.AF_INET, # Internet 
        socket.SOCK_DGRAM) # UDP 
sock.bind((UDP_IP, UDP_PORT)) 

while True: 
    data, addr = sock.recvfrom(1024) 
    print "received message:", data 

에 5,000 번째를 듣고 시작 같은 someIPsomePort (와 같은 스크립트를 사용하여 다른 포트 및 주소). 하지만 내 로컬 컴퓨터에서이 응답을받지 못했습니다. 왜?

또한이 코드는 서버가 로컬 네트워크에있을 때 올바르게 작동합니다.

+1

왜 같은 소켓을 사용하지 않으시겠습니까? –

답변

1

문제는 NAT 뒤에 있기 때문에 서버에 보내는 패킷 (NAT 외부의 패킷)에 NAT 서버의 원본 IP가 있습니다. 외부 서버가 보내는 응답에는 NAT의 대상 IP가 있습니다. NAT에 응답이 오면 주소/포트 매핑을 사용할 수 없으므로 해당 패킷을 어떻게 처리해야하는지 알 수 없습니다.
당신은 NAT가 포트 5000에서 패킷을 수신하면, 당신 로컬 컴퓨터에 그 패킷을 전송한다는 것을 알 것이다이 경우 다음
NAT Address:5000 <---> localaddress:5000

말 NAT에 대한 매핑을 만들어야합니다.

+4

아웃 바운드 데이터 그램이 임시 주소/포트 매핑을 생성하지 않는 이유는 무엇입니까? NAT 매스 쿼 레이 딩이 항상 어떻게 작동합니까? –

+1

@DavidSchwartz http://superuser.com/questions/456812/nat-and-udp-replies를 참조하십시오. –

1

비슷한 상황 (클라이언트가 NAT 뒤에있는 동안 클라이언트가 UDP를 통해 서버로부터 응답을받지 않음)에 있었고, 내 경우에 도움이 된 것은 같은 포트 요청에서 응답을 보냈습니다. 에 보냈습니다. 서로 다른 유형의 NAT가 다르게 작동하며 내 경우 라우터가 엄격한 매핑 client:CLIENT_PORT <---> server:SERVER_PORT을 작성해야하므로 동일한 서버의 다른 포트에서 "응답"이 거부되었습니다. 어쩌면 네 사건일지도 모르지.