AWS EKS部署的.NET5服务调用SmtpClient触发Cannot assign requested address错误
排查思路
SocketException (99): Cannot assign requested address对应Linux内核错误码EADDRNOTAVAIL,本质是TCP连接建立阶段,内核无法分配符合要求的源IP或源端口,你可以按照以下顺序排查:
- 优先验证SMTP端口连通性
AWS默认封禁所有EC2实例(包括EKS工作节点)的25端口出站流量,如果你使用25端口对接第三方SMTP服务器,首先在问题Pod内执行命令验证连通性:
如果25端口不通,可以更换为465/587端口尝试,或向AWS提交工单申请解封25端口。nc -zv <你的SMTP服务器地址> <SMTP端口> # 常用端口:25、465(SMTP over SSL)、587(SMTP over TLS) - 检查IP协议栈匹配问题
若Pod未分配IPv6地址,但SMTP服务器域名解析返回了AAAA(IPv6)记录,.NET默认会优先尝试用IPv6建立连接,此时内核找不到可用的IPv6源地址就会抛出该错误。你可以给Pod添加如下环境变量禁用.NET的IPv6支持验证:env: - name: DOTNET_SYSTEM_NET_DISABLEIPV6 value: "1" - 检查临时端口占用情况
进入Pod执行以下命令查看临时端口范围和连接状态:
若TIME_WAIT连接数接近临时端口范围上限,说明端口耗尽。你可以开启端口复用:给Pod添加sysctl配置# 查看当前临时端口范围 sysctl net.ipv4.ip_local_port_range # 统计当前TCP连接数 ss -s # 查看TIME_WAIT状态的连接数量 ss -ant | grep TIME_WAIT | wc -lnet.ipv4.tcp_tw_reuse=1,同时优化代码复用SmtpClient实例,避免每次发邮件新建连接,或改用支持连接池的邮件库(如MailKit)。 - 检查Pod网络配置
若Pod配置了多网卡、HostNetwork模式,或自定义了源IP绑定规则,可执行ip addr查看Pod的IP地址,确认代码中SmtpClient没有显式绑定不存在的本地IP。同时检查EKS节点安全组、网络策略,确认出站到SMTP服务器对应端口的流量未被拦截。
内容的提问来源于stack exchange,提问作者Nathan A
相关产品推荐
相关产品推荐

