[英]Google Cloud + Linux TCP connection refused, what causes it?
我有一个在Google Cloud中运行的VM实例“实例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”相同的子网络中创建了另一个云实例“ 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的连接也被拒绝。 即使删除我的自定义规则。
我认为这不是instance-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 Firewall规则,但是它们被接受而另一个被拒绝。 我不太明白为什么。 至于实例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
指令 。 Tomcat HTTP连接器使用address
连接器参数 。 在编写自己的代码时,请在套接字上调用bind
时指定侦听地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.