Google Cloud Linux TCP连接被拒绝,是什么原因导致的?

我在Google Cloud中运行了一个VM实例“instance-1”(Linux实例-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的公共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”相同的子网中创建了另一个 Cloud 实例“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 Cloud 端防火墙规则,但是其中一个被接受而另一个被拒绝 . 我不太明白为什么 . 至于实例-1上的其他防火墙,我没有看到任何防火墙 .

什么可以拒绝我与instance-1之间的任何其他地方的连接?

回答(1)

3 years ago

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 . tomcat HTTP连接器使用address Connector parameter . 自己编码时,在套接字上调用 bind 时指定监听地址 .