前言:
最近一直在搞政务云,私有云的项目,基本100%有这样的问题,数据库都在内网服务器上,无法公网访问,又或者有设置限定ip地址的问题;与此同时,申请下来的ECS服务器却可以拥有公网IP地址,可以暴露一些端口在公网。针对以上问题,这边给出以下两种解决方案。
起因:
写这篇博客的起因其实很简单,被坑了,正好在搞政务云的RDS问题,讲个不争的事实,政务云每个区甚至是每个县级城市,所用的政务云体系,都有可能是不一样的,所以也提醒一下各位奋战在一线运维或开发工程师,有些方法(偏方)可能在上一个项目能用,下一个项目突然GG。就好比如下错误:
这个问题对应的处理方法见下面(三、问题)
又或者,给你分配的公网ip,与你linux服务器本机公网ip不是同一个:检测指令:curl icanhazip.com
,这个原因简单来说就是,他们给你分配的ip,是与你内网ip端口相对应与映射,可能吧,这个3306端口是给你这台服务器的,6379给了其他内网ip
总结来说,一个萝卜一个坑,走一步看一步,先记录一下
一、前提准备
ECS(假设:CentOS7)一台(有内网ip,且内网ip有映射公网ip)
ECS公网ip端口开放一个(假设:3250端口)
端口开放协议为TCP协议,端口开放协议为TCP协议,端口开放协议为TCP协议(重要的事情说三遍,要记住是TCP,是不HTTP等等)
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
安装Nginx(直接使用yum)
# 安装nginx 1.20.1
[root@155 ~]# yum install -y nginx
# 验证验证
[root@155 ~]# nginx -v
nginx version: nginx/1.20.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
在 /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)
简介
这边不详细描述了,有兴趣的可以去官网 http://www.dest-unreach.org/socat/安装socat
[root@155 ~]# yum install socat -y
配置指令
# 测试运行
[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 &
检查是否正常运行
[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
三、问题
Navicat连接提示 2013,检查:开放的端口是否是 TCP 协议