我们有一个 Azure VM,我们需要从该计算机的特定端口发送 UDP 消息。我们使用 .NET 类 UdpClient 进行通信。
如果我们尝试在同一虚拟网络中的计算机之间发送消息,接收方计算机将显示正确的源主机和端口。
如果我们跨公共(public) VIP(在不同虚拟网络中的虚拟机或本地监听器之间),源端口将显示 1024 及以上的端口,而不是所选的源端口。
发件人:1.2.3.4:5000
接收器:5.6.7.8:5001 -> 表示从 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 网络是否始终在公共(public)网关之外的出站通信上转换源 UDP 端口。
我们确实需要在我们的平台中保留目的地的源端口信息,因为我们在互联网上有数千台设备仅监听指定的 IP:UDPPort 组合。
提前致谢,
安东尼奥·桑切斯
亚特兰蒂斯全局系统
最佳答案
我们一直在与 Azure 支持人员交谈,他们告诉我们,当您跨越虚拟网络边界时,源端口会被转换。
他们给我们的解决方案是在一台虚拟机中使用 PIP(实例级公共(public) IP 地址)。这样,源端口是使用 UDPClient 维护的,并且不应用 SourceNAT。这种公共(public) IP 处于预览状态,需要使用 powershell 才能配置它。
PIP信息和配置:PIP MSDN
谢谢!
安东尼奥·桑切斯
亚特兰蒂斯全局系统
关于azure - 跨越 Azure VM 上的公共(public) VIP 时,出站 UDP 指定源端口发生更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25681747/