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