一、问题描述
本地使用Cavicat连接阿里云服务器的postgresql,提示连接超时
二、原因
服务器防火墙策略,默认不允许连接 (如何确认是否是防火墙原因导致的?可见本章第四点)
三、解决方案
方案:设置对应的防火墙规则,放行相应连接的包。
1、在阿里云平台设置防火墙规则,允许postgresql、redis的连接。
这里仅做示例使用,所以简单粗暴的放行对应端口的包(如放行postgresql端口5432,redis端口6379的包)
2、在阿里云平台放行对应端口的包,发现仍然连接不上,登录服务器查看iptables,发现iptables也没有放行该包,设置对应的规则放行。 如执行以下命令
iptables -I INPUT -j ACCEPT
注:这里仅做示例使用,简单粗暴的放行了所有的包,实际使用中应配合安全防范要求,配置对应的安全策略,如只放行对应端口的包等
iptables -I INPUT -j ACCEPT -p tcp --dport 5432
四、如何确认是否是防火墙原因导致的?
1、先ping下远程服务器ip,看链路是否是通的(前提是服务器允许ping)
本地收到来自服务器的ping包回复,就说明链路的通的
2、本地连接服务器,则在服务器用tcpdump抓包,看是否收到了来自本地的连接请求包。
以eth0网口5432端口的包为例:
sudo tcpdump -i eth0 port 5432 -n
3、开启抓包后,在本地触发连接请求,在服务器查看是否收到了对应的包
看到如下内容则说明抓到了对应的请求包,连接不上就可能是服务器的某些防火墙设置导致的。
看到如下内容则说明没抓到对应的包。
我这边是后者,没抓到对应的5432端口的包。由于阿里云轻量应用服务器默认设置了一些防火墙规则,默认只允许指定的几个端口包(见下图),所以要先在阿里云平台先添加规则以允许对应的包。
4、在阿里云平台上添加防火墙规则后,再去抓到,这次抓到了来自本地的连接包。
虽然抓到了来自本地的连接包,但是Cavicat仍然连不上服务器的postgresql。此时应该是服务器内部的防火墙设置了一些规则,可查看防火墙规则。
5、查看防火墙规则 可使用以下命令查看防火墙规则:
iptables -nvL
查看filter表的INPUT链
这里配置了一条防火墙的默认拒绝策略,不符合前面规则的包默认都被丢弃了,包括我们预期的postgresql端口5432的连接包,所以需要显式的设置规则来允许目标包。