You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的网络配置把公网流量导进来。

  1. 修改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,不会再抛出验证错误。

  2. 配置Azure网络安全组(NSG)
    登录Azure门户,找到你的VM对应的NSG,添加一条入站规则:

    • 优先级:设置一个比默认规则高的数值(比如100)
    • 源:Any(或者根据需求限制特定IP)
    • 目标端口范围:填写你websocket服务用的端口(比如8080)
    • 协议:TCP(WebSocket基于TCP协议)
    • 动作:允许
  3. 开放VM本地防火墙端口
    如果你的VM是Windows系统,打开「Windows Defender防火墙」→「高级设置」,添加一条入站规则,允许对应端口的TCP流量;如果是Linux系统,用ufw或者iptables开放端口。

  4. 测试连接
    客户端直接用公网IP加端口连接即可,比如ws://<你的公网IP>:8080,Azure会自动把公网流量转发到VM的私网IP对应的端口上,你的websocket服务就能正常接收连接了。

内容的提问来源于stack exchange,提问作者Mason Wheeler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:06:01