.NET 8.0.6在Garuda Linux下出站连接超时问题求助
.NET 8.0.6 在 Garuda Linux 下出站连接持续超时排查方案
问题背景
- 系统:基于Arch的Garuda Linux(全新重装,未部署Docker,默认防火墙配置)
- .NET版本:8.0.6
- 开发工具:JetBrains Rider
- 核心现象:
HttpClient发起的HTTP/HTTPS请求均超时(抛出TaskCanceledException),ASP.NET启动序列、独立控制台应用中均复现- 非HTTPS地址同样失败,仅超时无连接拒绝提示
- 生产服务器上代码正常运行,本地
curl命令可正常访问目标地址 - 已尝试操作:重装系统、手动设置
SecurityProtocol为Tls12、wtrace跟踪(仅发现无关的程序集加载错误,请求阶段无有效线索)
测试代码示例
var website = "https://perdu.com"; Console.WriteLine($"Querying {website}..."); using var client = new HttpClient(); client.Timeout = TimeSpan.FromSeconds(5); var value = await client.GetStringAsync(website); Console.WriteLine(value);
排查步骤
强制禁用.NET代理配置
即使系统无代理设置,可能.NET残留了旧配置,可在代码中强制关闭代理:using var handler = new HttpClientHandler { UseProxy = false }; using var client = new HttpClient(handler);运行代码验证是否恢复正常。
验证DNS解析一致性
在代码中手动解析域名,对比系统工具的解析结果:var ipAddresses = await Dns.GetHostAddressesAsync("perdu.com"); foreach (var ip in ipAddresses) { Console.WriteLine($"Resolved IP: {ip}"); }同时执行
nslookup perdu.com或dig perdu.com,若.NET解析结果与系统不一致,检查/etc/resolv.conf是否被.NET覆盖,可尝试显式指定DNS服务器:var dnsEndPoint = new DnsEndPoint("8.8.8.8", 53); var ipAddresses = await Dns.GetHostAddressesAsync("perdu.com", dnsEndPoint);修复TLS/SSL证书与协议配置
- 显式指定所有支持的TLS版本:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; - 确认.NET使用系统CA证书池,设置环境变量后再运行程序:
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt dotnet run
- 显式指定所有支持的TLS版本:
跟踪系统级网络调用
用strace查看程序网络调用的具体阶段,定位超时环节:strace -f -e trace=network dotnet run重点关注
connect、sendto、recvfrom等调用的返回值,判断是连接建立超时还是数据接收超时。重新安装.NET运行时
排查.NET运行时是否损坏,执行重装:sudo pacman -R dotnet-runtime dotnet-sdk sudo pacman -S dotnet-runtime dotnet-sdk验证安装完整性:
dotnet --info,确认版本和依赖路径正常。切换HTTP客户端实现测试
用HttpWebRequest替代HttpClient,判断问题是否局限于HttpClient:var request = (HttpWebRequest)WebRequest.Create("https://perdu.com"); request.Timeout = 5000; using var response = (HttpWebResponse)request.GetResponse(); using var reader = new StreamReader(response.GetResponseStream()); Console.WriteLine(reader.ReadToEnd());
内容的提问来源于stack exchange,提问作者Etienne Charland
相关产品推荐
相关产品推荐

