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
时指定监听地址。
我在 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
时指定监听地址。