Azure VM公网IP未在Dns.GetHostAddresses显示且绑定websocket-sharp失败
这个问题我之前在Azure上部署服务时也碰到过,核心原因是Azure VM的公网IP机制和你想的不一样,咱们一步步拆解解决:
首先得搞清楚Azure公网IP的本质:Azure VM的公网IP并不是直接分配给VM网卡的本地IP,它是Azure平台提供的一个NAT地址,所有发往这个公网IP的流量会被Azure的网络组件转发到VM的私网IP上。所以你用System.Net.Dns.GetHostAddresses()只能拿到VM本地网卡的私网IP,公网IP根本不会出现在这个结果里——这就是为什么你的代码验证失败的根源。
而websocket-sharp的绑定逻辑会检查你指定的主机是否是本地可解析的主机名/本地IP,公网IP不在本地网卡上,自然通不过这个验证,就抛出了the host part isn't a local host name的错误。
解决思路很简单:不要直接绑定公网IP,而是绑定本地的监听地址,再通过Azure的网络配置把公网流量导进来。
修改websocket-sharp的绑定代码
把原来绑定公网IP的代码,改成绑定0.0.0.0(监听VM所有本地网络接口)或者VM的私网IP:// 方式1:监听所有本地接口(推荐) var wsServer = new WebSocketServer("ws://0.0.0.0:8080"); // 方式2:监听指定的私网IP(你可以在VM的网卡设置里找到这个IP) var wsServer = new WebSocketServer("ws://10.0.0.4:8080");这样websocket-sharp就能成功绑定本地存在的IP,不会再抛出验证错误。
配置Azure网络安全组(NSG)
登录Azure门户,找到你的VM对应的NSG,添加一条入站规则:- 优先级:设置一个比默认规则高的数值(比如100)
- 源:Any(或者根据需求限制特定IP)
- 目标端口范围:填写你websocket服务用的端口(比如8080)
- 协议:TCP(WebSocket基于TCP协议)
- 动作:允许
开放VM本地防火墙端口
如果你的VM是Windows系统,打开「Windows Defender防火墙」→「高级设置」,添加一条入站规则,允许对应端口的TCP流量;如果是Linux系统,用ufw或者iptables开放端口。测试连接
客户端直接用公网IP加端口连接即可,比如ws://<你的公网IP>:8080,Azure会自动把公网流量转发到VM的私网IP对应的端口上,你的websocket服务就能正常接收连接了。
内容的提问来源于stack exchange,提问作者Mason Wheeler

