我们有一个Azure VM,我们需要从这台机器的特定端口发送UDP消息。我们使用.NET Class UdpClient进行通信。
如果我们尝试在同一虚拟网络中的计算机之间发送消息,则接收方计算机会显示正确的源主机和端口。
如果我们跨越公共VIP(在不同虚拟网络中的VM或onPremises侦听器之间),源端口将显示1024及以上的端口,而不是选定的源端口。
发件人:1.2.3.4:5000
接收方:5.6.7.8:501 - >说从1.2.3.4:1025收到的数据 - > 1025源端口应为5000
VB.NET示例:
'Sending
Private Sub Send()
Dim data() As Byte = System.Text.Encoding.Unicode.GetBytes("Data")
Dim client As UdpClient = New UdpClient(5000)
client.Send(data, data.Length, "5.6.7.8", "5001")
client.Close()
End Sub
'Recieving
Private Sub Recieve()
While True
Dim remoteIPEndPoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 5001)
Dim content() As Byte = udpClient.Receive(remoteIPEndPoint)
If content.Length > 0 Then
Dim message As String = Encoding.ASCII.GetString(content)
message &= remoteIPEndPoint.Address.ToString & " " & remoteIPEndPoint.Port & " " & message & vbCrLf
End If
End While
End Sub
我已经阅读了一些关于SNat(源NAT)的内容,我想知道Azure网络是否总是在公共网关之外的外向通信上转换源UDP端口。
我们确实需要在我们的平台中保留目的地的源端口信息,因为我们在Internet上有数千个设备只能侦听指定的IP:UDPPort组合。
提前致谢,
Antonio Sanchez
亚特兰蒂斯全球系统答案 0 :(得分:1)
我们一直在与Azure支持人员交谈,他们告诉我们,当您跨越虚拟网络边界时,源端口会被翻译。
他们给我们的解决方案是在一个VM中使用PIP(实例级公共IP地址)。这种方式使用UDPClient保存源端口,并且不应用SourceNAT。这种公共IP处于预览状态,需要使用powershell才能对其进行配置。
PIP信息和配置:PIP MSDN
谢谢!
Antonio Sanchez
亚特兰蒂斯全球系统