2012-11-25 96 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)) 

權後,我開始本地機器

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 

在聽第5000在服務器上,當我看到傳入UDP從(someIP, somePort)我發送響應相同someIPsomePort(使用相同的腳本與其他端口和地址)。但我從未在本地機器上收到過此回覆。爲什麼?

此外,當服務器位於本地網絡中時,此代碼正確工作。

+1

爲什麼你不使用相同的套接字? –

回答

1

問題是,你在NAT後面,你發送到服務器(NAT外部)的數據包將具有NAT服務器的源IP。外部服務器將發送的答覆將具有NAT的目標IP地址。當回覆到NAT時,它不知道如何處理該數據包,因爲沒有可用的地址/端口映射。
你應該創建NAT映射說出以下
NAT Address:5000 <---> localaddress:5000

在這種情況下,NAT就會知道,如果它在5000端口收到一個數據包,它必須是數據包發送到你的本地計算機。

+4

爲什麼出站數據報不會創建臨時地址/端口映射?這不是NAT僞裝總是如何工作的嗎? –

+1

@DavidSchwartz請參閱http://superuser.com/questions/456812/nat-and-udp-replies –

1

我一直處於類似的情況(沒有通過UDP從服務器獲取響應,而客戶端在NAT後面),並且在我的情況下幫助發送了請求的服務器的相同端口的響應被送到。不同類型的NAT工作方式不同,在我的情況下,路由器必須建立嚴格的映射client:CLIENT_PORT <---> server:SERVER_PORT,因此來自同一服務器的不同端口的「響應」被拒絕。也許你的情況。