如何在gcloud实例上打开端口?

时间:2018-06-05 02:33:44

标签: google-cloud-platform google-compute-engine

我有一个GCE实例,它使用terraform配置启动。实例旋转得很好,我可以SSH到它。我有一个防火墙规则来访问TCP端口9090:

gcloud compute firewall-rules list
NAME                    NETWORK  DIRECTION  PRIORITY  ALLOW                         
DENY
allow-http              default  INGRESS    1000      tcp:8080
default-allow-icmp      default  INGRESS    65534     icmp
default-allow-internal  default  INGRESS    65534     tcp:0-65535,udp:0-65535,icmp
default-allow-rdp       default  INGRESS    65534     tcp:3389
default-allow-ssh       default  INGRESS    65534     tcp:22
fitnesse                default  INGRESS    1000      tcp:9090

但我无法从外部访问在端口9090上运行的任何服务器。

$ curl http://a.b.c.d:9090
curl: (7) Failed to connect to a.b.c.d port 9090: Connection refused

我尝试删除实例和规则上的所有标记都无济于事。我为另一个端口(8080)创建了另一个规则,它也是无法访问的。

我在实例上检查了iptables -L -nv并且我有这个INPUT链规则对我来说似乎很好:

Chain INPUT (policy ACCEPT 163 packets, 26970 bytes)
 pkts bytes target     prot opt in     out     source               destination
72510 1208M sshguard   all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy DROP 0 packets, 0 bytes)

我虽然它可能来自一个docker问题,因为该服务是一个带有映射端口的docker容器,但它不能用nc -l 9090 ...

更新

我已将端口映射从9090更改为80,现在可以正常工作:我可以从外部访问服务器。

netstat -lntp给了我以下内容:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      864/systemd-resolve
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1774/sshd
tcp6       0      0 :::80                   :::*                    LISTEN      19537/docker-proxy
tcp6       0      0 :::18001                :::*                    LISTEN      12754/docker-proxy
tcp6       0      0 :::5778                 :::*                    LISTEN      13837/docker-proxy
tcp6       0      0 :::18002                :::*                    LISTEN      12903/docker-proxy
tcp6       0      0 :::18003                :::*                    LISTEN      16534/docker-proxy
tcp6       0      0 :::18004                :::*                    LISTEN      16546/docker-proxy
tcp6       0      0 :::22                   :::*                    LISTEN      1774/sshd

这似乎将问题指向ipv4 / ipv6问题,其中docker代理仅绑定到ipv6。

我很茫然,我们非常感谢您解决此问题的任何帮助。

1 个答案:

答案 0 :(得分:1)

Ubuntu的默认配置(至少)16.04更喜欢通过ipv6而不是ipv4进行连接。这是在here解释的文件/etc/gai.conf中配置的。

这意味着默认情况下,未明确选择要绑定的地址的进程将绑定到ipv6名称空间中的任何地址,但ipv4地址空间中的不是,这会阻止ipv4连接箱子外面。这可以通过编辑文件/etc/gai.conf添加以下行来更改:

precedence ::ffff:0:0/96 100