Python套接字绑定失败:AWS EC2上OSError Errno99问题求助
解决AWS EC2上Python Socket服务端绑定失败&连接超时问题
核心问题原因
EC2实例的公网IP是AWS通过NAT技术映射的,实例本身网卡并不持有公网IP,直接绑定公网IP必然报错Cannot assign requested address;而绑定内网IP/127.0.0.1会导致远程客户端无法访问,出现连接超时。
分步解决方案
1. 修正服务端绑定地址
服务端必须绑定0.0.0.0,这个地址表示监听实例所有可用网卡(包括内网网卡)的请求,AWS的NAT会自动把公网IP的流量转发到实例的内网IP上。
修改后的服务端初始化代码示例:
import socket import threading class Server: def __init__(self, ip_addr, port): self.my_port = port self.my_ip_addr = ip_addr self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 关键修改:绑定0.0.0.0而非公网IP self.server.bind((self.my_ip_addr, self.my_port)) self.server.listen() # 后续接受连接的代码示例 print(f"服务端已启动,监听 {self.my_ip_addr}:{self.my_port}") client_socket, client_addr = self.server.accept() print(f"已连接客户端 {client_addr}") # 收发消息逻辑...
启动服务端时,输入0.0.0.0作为绑定IP,端口保持55555即可。
2. 配置EC2安全组(必做)
EC2的安全组是第一道防火墙,必须开放对应端口的入站流量:
- 进入EC2控制台,找到目标实例的安全组
- 添加入站规则:
- 类型:自定义TCP
- 端口范围:55555
- 源:如果客户端是另一台EC2,填该EC2的公网IP/内网IP;测试阶段可以填
0.0.0.0/0(允许所有IP访问,生产环境请限制IP范围)
3. 客户端连接正确姿势
客户端连接时,必须使用服务端EC2的公网IP和端口55555,示例代码:
import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 替换为服务端EC2的公网IP client.connect(("12.345.678.90", 55555)) # 收发消息逻辑 client.send("Hello from client".encode()) response = client.recv(1024).decode() print(f"收到服务端消息: {response}")
4. 验证服务端监听状态
在服务端EC2上执行命令,确认服务端是否正常监听:
ss -tulpn | grep 55555
如果输出包含0.0.0.0:55555,说明监听成功。
常见坑点排查
- 不要尝试绑定EC2的公网IP:实例内部没有这个IP,绑定必然失败
- 不要只依赖关闭实例防火墙:EC2安全组的优先级更高,必须配置入站规则
- 客户端不要连接服务端的内网IP:内网IP仅在VPC内部可访问,外部客户端无法连接
内容的提问来源于stack exchange,提问作者user21338291
相关产品推荐
相关产品推荐

