3

ポート変換について読んだことがあるので、それをテストしたいと思います。

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))

その直後、ローカル マシンで 5000 番目をリッスンし始めます

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

サーバー上で受信 UDP が表示されると(someIP, somePort)、同じものに応答を送信します (他のポートとアドレスで同じスクリプトを使用します)。しかし、ローカル マシンでこの応答を受け取ることはありません。なんで?someIPsomePort

また、サーバーがローカルネットワークにある場合、このコードは正しく機能します。

4

2 に答える 2

1

問題は、NAT の背後にいることです。サーバー (NAT の外部) に送信するパケットには、NAT サーバーのソース IP が含まれます。外部サーバーが送信する応答には、NAT の宛先 IP が含まれます。応答が NAT に届くと、利用可能なアドレス/ポート マッピングがないため、NAT はそのパケットをどう処理するかわかりません。
次のように言って、NAT でマッピングを作成する必要があります。
NAT Address:5000 <---> localaddress:5000

この場合、NAT は、ポート 5000 でパケットを受信した場合、そのパケットをローカル マシンに送信する必要があることを認識します。

于 2012-11-25T16:47:45.100 に答える
1

私は同様の状況にありました(クライアントがNATの背後にある間、UDP経由でサーバーから応答を取得していません)、私の場合に役立ったのは、要求が送信されたサーバーの同じポートから応答を送信することでした。さまざまなタイプの NAT の動作は異なります。私の場合、ルーターは厳密なマッピングを構築している必要があるclient:CLIENT_PORT <---> server:SERVER_PORTため、同じサーバーの別のポートからの「応答」は拒否されました。多分あなたの場合も。

于 2014-11-24T14:04:59.853 に答える