前言:

最近一直在搞政务云,私有云的项目,基本100%有这样的问题,数据库都在内网服务器上,无法公网访问,又或者有设置限定ip地址的问题;与此同时,申请下来的ECS服务器却可以拥有公网IP地址,可以暴露一些端口在公网。针对以上问题,这边给出以下两种解决方案。

起因:

写这篇博客的起因其实很简单,被坑了,正好在搞政务云的RDS问题,讲个不争的事实,政务云每个区甚至是每个县级城市,所用的政务云体系,都有可能是不一样的,所以也提醒一下各位奋战在一线运维或开发工程师,有些方法(偏方)可能在上一个项目能用,下一个项目突然GG。就好比如下错误:

这个问题对应的处理方法见下面(三、问题

又或者,给你分配的公网ip,与你linux服务器本机公网ip不是同一个:检测指令:curl icanhazip.com ,这个原因简单来说就是,他们给你分配的ip,是与你内网ip端口相对应与映射,可能吧,这个3306端口是给你这台服务器的,6379给了其他内网ip

总结来说,一个萝卜一个坑,走一步看一步,先记录一下


一、前提准备

  1. ECS(假设:CentOS7)一台(有内网ip,且内网ip有映射公网ip)

  2. ECS公网ip端口开放一个(假设:3250端口)

  3. 端口开放协议为TCP协议,端口开放协议为TCP协议,端口开放协议为TCP协议(重要的事情说三遍,要记住是TCP,是不HTTP等等)

  4. RDS(假设:Mysql)一台,有内网ip且与ECS处于同一个内网环境(或相互之间可以ping通),并开放3306端口给ECS

二、方案

1. Nginx Stream

说明:推荐使用yum直接安装nginx,如果yum安装报错如下

[root@155 ~]# yum install -y nginx
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirror.lzu.edu.cn
 * extras: mirror.lzu.edu.cn
 * updates: mirror.lzu.edu.cn
没有可用软件包 nginx。
错误:无须任何处理

原因是nginx位于第三方的yum源里面,而不在centos官方yum源里面

解决方法安装 epel-release

# 安装第三方源
[root@155 ~]# yum install epel-release -y

# 更新(更新时间稍微长一些,耐心等待)
[root@155 ~]# yum update -y
  1. 安装Nginx(直接使用yum)

# 安装nginx 1.20.1
[root@155 ~]# yum install -y nginx

# 验证验证
[root@155 ~]# nginx -v
nginx version: nginx/1.20.1
  1. 安装Nginx的Stream模块

# 安装stream模块
[root@155 ~]# yum install -y nginx-mod-stream

# 或者安装所有的动态模块
[root@155 ~]# yum install -y nginx-all-modules

# 安装完成后检查stream是否安装成功
[root@155 ~]# ls /usr/lib64/nginx/modules
ngx_stream_module.so
  1. 在 /etc/nginx/nginx.conf 里面新增配置(配置与http处于同一等级)

# 配置如下
stream {

       upstream cloudsocket {
               hash $remote_addr consistent;
               server rds内网ip:3306 weight=5 max_fails=3 fail_timeout=30;
       }
       
        server {
                listen 3250;
                proxy_connect_timeout 10s;
                proxy_timeout 300s;
                proxy_pass cloudsocket;
        }
        
}

2. Socat (英文全拼:Socket CAT)

  1. 简介
    这边不详细描述了,有兴趣的可以去官网 http://www.dest-unreach.org/socat/

  2. 安装socat

[root@155 ~]# yum install socat -y
  1. 配置指令

# 测试运行
[root@155 ~]# nohup socat TCP-LISTEN:3250,fork TCP:rds内网ip:3306 >> socat3306.log 2>&1

# 后台运行
[root@155 ~]# nohup socat TCP-LISTEN:3250,fork TCP:rds内网ip:3306 >> socat3306.log 2>&1 &
  1. 检查是否正常运行

[root@155 ~]# ps -ef | grep socat
root     20155 20134  0 10:00 pts/0    00:00:00 socat TCP-LISTEN:3250,fork TCP:rds内网ip:3306
root     20179 20134  0 10:01 pts/0    00:00:00 grep --color=auto socat

三、问题

  1. Navicat连接提示 2013,检查:开放的端口是否是 TCP 协议

不为明天而烦恼,不为昨天而叹息,只为今天更美好