Python 在 GCE 上:连接失败,因为连接的主机未能响应
Python on GCE: connection failed because connected host has failed to respond
我一直在从事一个项目,该项目需要在服务器(托管在 GCE 上)和多个客户端之间建立一些网络。我创建了一个 Compute Engine 实例到 运行 一个 Python 脚本,如本视频所示:https://www.youtube.com/watch?v=5OL7fu2R4M8.
这是我的服务器端脚本:
server = socket.gethostbyname(socket.gethostname()) # 10.128.X.XXX which is the Internal IP
print(server)
port = 5555
clients = 0
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((server, port))
s.listen(2)
print("Waiting for connection...")
while True:
conn, addr = s.accept()
print("Connected to: ", addr)
conn.send(str.encode(f"{clients}"))
clients += 1
这是我的客户端脚本:
class Network:
def __init__(self):
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server = "10.128.0.2"
self.port = 5555
self.addr = (self.server, self.port)
self.id = int(self.connect())
def connect(self):
self.client.connect(self.addr)
return self.client.recv(2048).decode()
network = Network()
print(f"Connected as client {network.id}")
我知道这个脚本是有效的,因为我已经用我的计算机作为服务器和一个客户端,另一台计算机作为第二个客户端进行了测试。但是当我使用 GCE 作为服务器时,我在客户端脚本中得到这个错误:
TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
这会不会是因为我使用的是内部 IP 地址而不是外部 IP 地址?
在此之后,我尝试更改 GCE 的防火墙设置(添加 'python-socket'),这就是它们的样子:
但错误仍然存在...
正如 W_B 的回答,我尝试 运行 在我的 VM 上执行这些命令并得到以下输出:
从你的描述来看,很明显是连接问题。
首先你必须检查你创建的防火墙规则是否仍然存在。如果它“太宽泛”并且允许非常广泛的访问那么它可能会被自动删除即使你不知道。它在您的屏幕截图上,但请再次检查以确保确定。
如果它存在 select 您将要使用的协议(我假设它是 TCP)- some protocols are always blocked by default GCP(您不能更改它)所以创建一个规则与“允许的任何协议都是有风险的。此外 - 放置一个或两个目标 IP(并非全部在此 VPC 内) - 这不是必须的,但可以提高网络的安全性。
其次 - 确保您尝试连接的端口 5555 可以从其他计算机访问。您可以使用 nmap -p 5554 put.server.ip.here
扫描目标主机
您可以从 Internet 或同一 VPC 网络中的其他 VM 扫描它。
你应该得到这样的东西:
root@localhost:~$ nmap -p 443 192.168.1.6
Starting Nmap 7.70 ( https://nmap.org ) at 2020-06-25 17:12 UTC
Nmap scan report for 192.168.1.6
Host is up (0.00091s latency).
PORT STATE SERVICE
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
如果您看到 5555/tcp filtered freeciv
,这意味着有东西阻塞了端口。
运行 服务器上的 nmap(我假设你 运行 某个版本的 Linux),如果你不想安装任何非必要的软件,你可以使用 sudo netstat -tulpn | grep LISTEN
获取开放端口列表(5555 应该在列表中)。
还要确保您服务器上的防火墙没有阻止此端口。 You can use iptables
为此。
我一直在从事一个项目,该项目需要在服务器(托管在 GCE 上)和多个客户端之间建立一些网络。我创建了一个 Compute Engine 实例到 运行 一个 Python 脚本,如本视频所示:https://www.youtube.com/watch?v=5OL7fu2R4M8.
这是我的服务器端脚本:
server = socket.gethostbyname(socket.gethostname()) # 10.128.X.XXX which is the Internal IP
print(server)
port = 5555
clients = 0
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((server, port))
s.listen(2)
print("Waiting for connection...")
while True:
conn, addr = s.accept()
print("Connected to: ", addr)
conn.send(str.encode(f"{clients}"))
clients += 1
这是我的客户端脚本:
class Network:
def __init__(self):
self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server = "10.128.0.2"
self.port = 5555
self.addr = (self.server, self.port)
self.id = int(self.connect())
def connect(self):
self.client.connect(self.addr)
return self.client.recv(2048).decode()
network = Network()
print(f"Connected as client {network.id}")
我知道这个脚本是有效的,因为我已经用我的计算机作为服务器和一个客户端,另一台计算机作为第二个客户端进行了测试。但是当我使用 GCE 作为服务器时,我在客户端脚本中得到这个错误:
TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
这会不会是因为我使用的是内部 IP 地址而不是外部 IP 地址?
在此之后,我尝试更改 GCE 的防火墙设置(添加 'python-socket'),这就是它们的样子:
但错误仍然存在...
正如 W_B 的回答,我尝试 运行 在我的 VM 上执行这些命令并得到以下输出:
从你的描述来看,很明显是连接问题。
首先你必须检查你创建的防火墙规则是否仍然存在。如果它“太宽泛”并且允许非常广泛的访问那么它可能会被自动删除即使你不知道。它在您的屏幕截图上,但请再次检查以确保确定。
如果它存在 select 您将要使用的协议(我假设它是 TCP)- some protocols are always blocked by default GCP(您不能更改它)所以创建一个规则与“允许的任何协议都是有风险的。此外 - 放置一个或两个目标 IP(并非全部在此 VPC 内) - 这不是必须的,但可以提高网络的安全性。
其次 - 确保您尝试连接的端口 5555 可以从其他计算机访问。您可以使用 nmap -p 5554 put.server.ip.here
您可以从 Internet 或同一 VPC 网络中的其他 VM 扫描它。
你应该得到这样的东西:
root@localhost:~$ nmap -p 443 192.168.1.6
Starting Nmap 7.70 ( https://nmap.org ) at 2020-06-25 17:12 UTC
Nmap scan report for 192.168.1.6
Host is up (0.00091s latency).
PORT STATE SERVICE
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 0.04 seconds
如果您看到 5555/tcp filtered freeciv
,这意味着有东西阻塞了端口。
运行 服务器上的 nmap(我假设你 运行 某个版本的 Linux),如果你不想安装任何非必要的软件,你可以使用 sudo netstat -tulpn | grep LISTEN
获取开放端口列表(5555 应该在列表中)。
还要确保您服务器上的防火墙没有阻止此端口。 You can use iptables
为此。