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 为此。