Google Cloud + Linux TCP连接被拒绝,是什么原因造成的?

Google Cloud + Linux TCP connection refused, what causes it?

我在 Google 云中有一个虚拟机实例 "instance-1" 运行 (Linux instance-1 3.16.0-4-amd64 #1 SMP Debian 3.16.43 -2+deb8u5 (2017-09-19) x86_64 GNU/Linux).

我在 1234 端口有一个服务,当 "instance-1" 本身请求时:

curl localhost:1234

产生预期的响应。

我设置了防火墙规则:

my-service Ingress  Apply to all     IP ranges: 0.0.0.0/0 tcp:1234   Allow 1000

除端口号和优先级外,这与 default-allow-http 规则相同。

但是当从互联网尝试时(aa.bb.cc.dd 表示实例 1 的 public ip 地址):

curl aa.bb.cc.dd:1234 --> curl: (7) Failed to connect to aa.bb.cc.dd port 1234: Connection refused

但是

curl aa.bb.cc.dd:80

给出了预期的响应(与我在 1234 上想要的响应不同)

作为实验,我在与 "instance-1" 相同的子网中创建了另一个云实例 "instance-2"。它应该被默认规则覆盖:

default-allow-internal Ingress  Apply to all     IP ranges: 10.128.0.0/9 tcp:0-65535, udp:0-65535, 1 more    Allow 65534

但它与 instance-1:1234 的连接也被拒绝。即使删除了我的自定义规则。

我认为这不是实例 1 上的本地防火墙问题:

xxx@instance-1:~/.ssh$ sudo iptables -L Chain INPUT (policy ACCEPT) target     prot opt source               destination          Chain FORWARD (policy ACCEPT) target     prot opt source               destination          Chain OUTPUT (policy ACCEPT) target     prot opt source               destination

所以,我为 2 个不同的端口设置了相同的 google 云防火墙规则,但一个被接受,另一个被拒绝。我不太明白为什么。至于实例 1 上的其他防火墙,我没有看到。

除了 instance-1 本身以外,什么地方拒绝我与 instance-1 的连接?

linux 上的服务可以选择他们监听的地址。如果服务在 127.0.0.1 上侦听,那么它将 接受本地连接,即使没有防火墙。为了接受任何接口上的连接,服务应该监听 0.0.0.0.

要对此进行测试,运行 sudo netstat -lntp,并查看您的服务正在侦听哪个地址。如果它显示 127.0.0.1:1234,那么您将需要更改它的监听地址。如果它说 0.0.0.0:1234,那就是另一个问题。

不同的软件需要不同的步骤来改变监听地址。 Apache 使用 Listen directive. The tomcat HTTP connector uses the address Connector parameter。自己编码时,在套接字上调用bind时指定监听地址。