【问题标题】:Python on GCE: connection failed because connected host has failed to respondGCE 上的 Python:连接失败,因为连接的主机未能响应
【发布时间】:2020-06-25 05:46:16
【问题描述】:

我一直在从事一个需要在服务器(托管在 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}")

我知道这个脚本可以工作,因为我已经用我的计算机作为服务器和 1 个客户端以及另一台计算机作为第二个客户端对其进行了测试。但是当我使用 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 上运行这些命令并得到以下输出:

【问题讨论】:

    标签: python sockets networking google-compute-engine firewall


    【解决方案1】:

    从你的描述可以看出是连接问题。

    首先您必须检查您创建的防火墙规则是否仍然存在。如果它“太宽泛”并且允许非常广泛的访问,那么即使您不知道它也可能会被自动删除.它在您的屏幕截图上,但请再次检查以确定。

    如果存在,请选择您要使用的协议(我假设它是 TCP) - GCP 的 some protocols are always blocked by default(您无法更改此设置),因此创建允许“任何协议”的规则是有风险的。另外 - 放置一个或两个目标 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

    【讨论】:

    • 所以我已将 python-socket 规则限制为仅 TCP 5555 和我的计算机的 IP,并且它显然已启用。当我运行 nmap 命令时,它说 5555 端口已关闭。然后,如果我运行 netstat 命令,它不会显示 5555 端口(仅显示 2、tcp 0 和 tcp6)。我还使用了 iptables 命令允许打开 5555,但错误并没有消失。
    • 现在,我只是将我的笔记本电脑用作服务器,这有点不太方便......但是哦,好吧。还是谢谢!
    • 你能把nmap和netstat命令的输出粘贴到这里吗?
    • 是的,我会附上问题的截图
    • 我还补充说,我正在使用 VM 的内部 IP 地址与套接字连接,因为一旦我尝试使用外部 IP 地址,就会收到此错误:OSError: [Errno 99] Cannot assign requested地址
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2018-02-10
    相关资源
    最近更新 更多