开发的小程序使用的redis和mysql我都部署了在云主机的 2个docker容器里,然后我把docker容器的3306和6379端口和宿主机 做了mapping。

因为站点部署在宿主机的tomcat下,都是内部访问,所以我想将这2个端口对外关闭,但是在关闭0.0.0.0/0 6379,3306这个规则后,导致redis无法访问,mysql也无法访问。

程序中 是以127.0.0.1:3306  127.0.0.1:6379访问的  ,按理说不应该会触发安全组的 规则。因为安全组 对外网访问走网卡才会触发,但是我内部访问为什么也会触发呢?

 最后验证的错误是比较低级的 很尴尬(小程序启动时调用的 api 是旧主机的地址,旧主机相对于本主机虽然是在同一网段一个内网中,但是出了本台服务器 走了网卡就会触发安全组规则)。

但是过程中学到了 云主机的一些知识 有了一些了解和排错方法。同时也很感谢腾讯云工程师的耐心指导和排错服务。

 

腾讯云工程师有以下回复 作参考:

腾讯云工程师 : 2018-01-26 10:02:12 您好,是的。因为您3306与6379 均是指定ip访问的。您的tomcat去访问,不是您指定的ip,所以无法访问。 跟防火墙规则是一样的,还请您理解。 若想正常对外访问,只能写成0.0.0.0/0 呢。 我: 2018-01-26 10:26:58 你好,按照里的说法,我在安全组中配置了127.0.0.1 是可以访问这2个端口的。然后我在宿主机中的tomcat里配置了 jdbc 127.0.0.1:3306数据源,这其实是相当于访问本机端口,按照道理应该可以的,为啥也不行?

腾讯云工程师 : 2018-01-26 14:20:28 您好,跟您确认下,您的意思是,在安全组设置允许所有的IP访问3306 和6379端口,您的tomcat就能访问对应的docker服务,而不放通就不能访问。是这样吗? 理论上127.0.0.1:6379 这样的访问是不会出机器,安全组是不起作用的。 您将127.0.0.1:6379 改成172.17.xxx.11:6379 试试(该地址是云主机内网地址)


我 : 2018-01-26 15:02:38 Hi 工程师, 您的理解没有错, 我改了172.17.16.11 也不行,换成122.152.196.93这个公网本身IP也不行。唯一能成功地就是开放0.0.0.0/0 TCP:3306,6379规则,宿主机的 tomcat 就能访问 docker 里的redis和mysql 真是匪夷所思.....我相信我这种情况肯定很常见的,不可能相对私密的常用端口 暴露出去的。还请您多分析分析,是哪里可能出现的问题,麻烦您了。


腾讯云工程师 : 2018-01-26 15:48:12
您好,这边进去确认了下,访问的这些信息是不走网卡出去的,所以跟安全组关系不大,内网telnet测试也是OK的。

您那边tomcat上的业务逻辑是什么样的?需要外网转发吗?

我: 2018-01-26 17:32:02
您好,我没太明白 您的 “ 需要外网转发“的意思。

  我的tomcat 业务背景:我在 Tomcat 安装目录   下的 myapp 目录下部署了一个微信小程序后端的站点(springboot), 该程序有提供一系列api接口给微信小程序调用。 程序当中 用了redis 和mysql,   redis和mysql都部署在我买的这台服务器上的 docker 容器中。
docker 里面的容器ip是在172.18网段,容器的3306 和6379端口是和这台云服务器 宿主机做映射的。  我现在遭遇的问题是不开放 0.0.0.0/0 TCP:3306,6379   我在手机中打开小程序 ,小程序就访问不到数据,提示redis和mysql不可访问。
 但是我一旦在安全组开放0.0.0.0/0 TCP:3306,6379这条规则,我的小程序就可以加载到数据。 这么说不知您是否明白了我的问题。



腾讯云工程师 : 2018-01-26 17:34:08
您好,我理解您的意思,但是安全组是只控制台出网卡后的数据请求,所以我想您那边抓包确认下,tomcat的请求到底有没有走网卡出去。

腾讯云工程师 : 2018-01-28 15:54:54
您好,安全组限制的是公网和内网访问,并不会限制本台服务器上的两个程序互相访问,这里您限制了安全组之后无法访问,说明了小程序的站点是经过了网络访问数据库的,不知道这里您连接数据库的地址是如何填写的,能否提供一下?


我 :2018-01-29 11:08:52


 jdbc.driver=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://127.0.0.1:3306/starball?characterEncoding=utf-8
 
访问redis也是相同 127.0.0.1:6379


我 : 2018-01-29 11:11:29 宿主机创建的docker 里的mysql容器IP地址是172.18.x.x 端口3306 是mapping到宿主机的3306 所以我程序用127.0.0.1:3306 相当于访问本机 端口


腾讯云工程师 : 2018-01-29 11:21:19 这里看起来您的调用都是在本机上进行的,并不能达到触发安全组的限制条件,您是否还有其他的配置? 或者您当时反馈的【为什么我在安全组的入站规则中 关闭了 外面任意IP访问这2个端口的权限 ,会导致 宿主机 中tomcat里部署的 网站 不能访问该宿主机里docker容器中这两个端口?】这里您是怎么判断tomcat不能访问端口的?


我 : 2018-01-29 11:32:20 没有别的限制了。程序部署很简单,tomcat部署在宿主机,mysql和redis部署在docker的容器里。 判断也很简单:规则开放,我小程序立即就可以从mysql里获取数据,并保存到redis ,操作都是成功的。 我规则关闭 刷新小程序 立马就加载不到数据并且redis 返回的错是 redis can not get resource from pool. 所以很 头疼, 不晓得你们的安全组应用 对宿主机 上docker这种虚拟主机容器 是怎样的应用原理



腾讯云工程师 : 2018-01-29 11:54:08 您好,目前与您电话沟通解释了下,这里安全组不会对服务器上系统内的规则进行限制的,怀疑您这里小程序和数据库通信存在走公网行为。目前建议您这边使用如下两种方法来定位问题: 1、在小程序正常和数据库通信的时候,在系统中执行netstat -ano | grep 3306或者6379,确认下系统中的端口是否和外部进行通信 2、如果上面的方法没有信息显示的话,麻烦您这里在系统中使用tcpdump在正常通信的时候抓取一段数据包,这里给您核实一下,命令如下:tcpdump -i eth0 -w data.cap



tcpdump 命令 可以在正常通信期间抓取数据包并分析 ,存储路径可以指定,此处是默认云主机root目录



腾讯云工程师 : 2018-01-29 16:30:31 您好,麻烦您这里ctrl + C终止抓包,然后提供下数据包文件到工单中,这里分析一下。



我 : 2018-01-29 22:06:50 你好 ,请看附件,cap文件不准许上传 ,所以压缩成rar了。麻烦了,谢谢。 这个数据包是我请求数据正常访问期间 抓取的。 100002781903_456264_1517234752327.rar


腾讯云工程师 : 2018-01-29 22:56:47 您好,这边查了一下您安全组设置,发现有些地方可能太严格了; 首先,您云服务器出站,建议全放比较好,不用控制您服务器访问外网可能会影响业务,比如说如果服务器不放 tcp/udp 53就不能用解析功能,而不用解析功能您服务器就不能通过 域名这种方式连接外部资源了; 通常只对入方向做限制,如果您需要您的 3306 和6379 被外界访问,那添加安全组设置的时候,需要放行客户端的IP对这些端口的访问,而国内家用用户上网通常是通过拨号获取动态地址来上网的,所以地址经常变动,所以有时候设置了安全组但还是不生效,因为没有对应上具体的ip,对应您可以通过 ip138.com ip.cn myip.ipip.net 这些都看看,看看具体您这次拨号的真实IP是什么;


此处回答的可能不是之前同一人,还没明白我问题是什么。

 


我 : 2018-01-30 15:21:24 您这边 不是同一个人回复我的问题的把? 你的意思我很清楚,如果家用电脑客户端 连接 ,我可能需要每次确认下IP,但我现在问题是并不是我在家里 电脑访问redis或者mysql不行 ,这个逻辑清楚吗? 是我买的云主机 不能访问主机内部容器的 端口,除非开放0.0.0.0规则。 我是访问的微信小程序 ,小程序 访问tomcat部署的后台 API服务器,所在服务器去请求redis 和mysql, 服务器的 ip是固定的。 腾讯云工程师 : 2018-01-30 16:28:53 您好,您反馈的这个问题是经过验证的,服务器访问内部容器是不会受安全组策略限制的,包括访问本机的内网地址或本地回环地址也不会被安全组策略限制,需要您从业务层面排查如端口转发和iptables策略 我 : 2018-01-30 16:51:35 能否说具体点,哪里的端口转发和 iptables策略? 我总共只买了这么一台服务器。服务器上的 端口转发都在安全组里,iptables没有改过。 腾讯云工程师 : 2018-01-30 17:00:53 您好,上条回复说的是指您自建的docker容器与宿主机之间的通信,是否规则有错误需要您自行确认,意思就是只要您的请求没有出这台服务器,安全组是限制不到机器内部的连接的 我 : 2018-01-30 17:13:43 我宿主机部署的程序有访问 微信小程序 官方api地址 这会触发安全组规则吗?即使触发安全组规则,我程序本身用 127.0.0.1:6379访问 redis 怎么可能会走外网?开放0.0.0.0规则后 数据访问就正常了,然后按照你们的建议抓取了数据包,并上传给你们了,你们可以根据数据包分析访问本机redis前 是否有外网连接活动。



腾讯云工程师 : 2018-01-30 17:43:50 您好,程序访问微信小程序官方API地址,这个确实会触发安全组规则 从您提供的抓包信息中看到有到服务器访问了 172.17.16.11 这个地址,这个地址是您的docker 容器 ip吗?请参考截图都是能访问到的



docker无法访问tcp6 docker无法访问宿主机文件_网络

docker无法访问tcp6 docker无法访问宿主机文件_docker无法访问tcp6_02



我 : 2018-01-31 09:39:15 172.17.16.11 这个地址是我买的这个 云主机的 内网地址,您根据我的 实例id应该可以看见 。我docker容器的ip 是172.18开头的。但是您的截图里没看见, 我在 程序中 是以127.0.0.1 访问docker redis和mysql的,因为他们端口 我做了mapping 118.89.184.15不清楚 也没注意是哪的网络ip。



 

118.89.184.15后来排查 该ip是另外一个旧的即将过期的小程序服务器,我在上面也部署了小程序springboot服务端做测试。 如果不是通过抓包分析,根本没想到有个配置地址错了。很是尴尬。
同时也说明了,配置文件统一配置的重要性,开发阶段 为了方便没做统一处理,导致给自己挖了个坑。