我有一个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。
我很茫然,我们非常感谢您解决此问题的任何帮助。
答案 0 :(得分:1)
Ubuntu的默认配置(至少)16.04更喜欢通过ipv6而不是ipv4进行连接。这是在here解释的文件/etc/gai.conf
中配置的。
这意味着默认情况下,未明确选择要绑定的地址的进程将绑定到ipv6名称空间中的任何地址,但ipv4地址空间中的不是,这会阻止ipv4连接箱子外面。这可以通过编辑文件/etc/gai.conf
添加以下行来更改:
precedence ::ffff:0:0/96 100