VPN网关ECS反向代理方案

VPN网关ECS反向代理方案即通过阿里云私有网络(VPC)的VPN服务创建VPN并与本地IDC数据中心进行组网后,通过阿里云ECS云服务器反向代理至本地IDC数据中心的数据服务方式,进行Dataphin与数据源的连接。

方案说明

  • VPN连接方式可能会受到Internet抖动、阻塞等公网质量问题而中断。若业务对网络连接质量要求很高时,可以考虑阿里云高速通道接入,但因为采用专线的方式接入,成本较高。更多信息,具体参考专线连接介绍

  • VPN网关ECS反向代理方案只需要ECS和VPN带宽费用,不需要购买公网地址,成本较低。

网络架构

VPN网关ECS反向代理连接Dataphin的网络架构如下:

image

前提条件

使用IPsec-VPN功能建立VPC到本地数据中心的VPN连接前,需要确保满足以下条件:

  • 检查本地数据中心的网关设备。阿里云VPN网关支持标准的IKEv1和IKEv2协议。因此,只要支持这两种协议的设备都可以和云上VPN网关互连。例如,华为、华三、山石、深信服、Cisco ASA、Juniper、SonicWall、Nokia、IBM和Ixia等。

  • 本地数据中心的网关已经配置了静态公网IP。

  • 本地数据中心的网段和专有网络的网段不能重叠。

操作步骤

步骤一:开通ECS和VPC

准备资源

开通指引

开通并购买ECS。

说明

建议先选择按量付费的模式,确定连通后再转为包年包月。本文以ecs.c5.xlarge(计算型4C8G+40GB高效云盘)的ECS按量付费为例。

实例创建方式介绍

开通VPC。

创建和管理专有网络

步骤二:建立VPN连接

步骤1:建立VPC到本地数据中心的连接

本解决方案使用IPsec-VPN建立VPC到本地数据中心的VPN连接,从而实现本地数据中心与VPC的互通。

image

步骤2:创建专有网络

  1. 登录专有网络管理控制台

  2. 单击左侧导航栏专有网络

  3. 专有网络页面,单击创建专有网络。

  4. 创建专有网络页面,根据以下信息配置专有网络。

    参数

    描述

    专有网络

    地域

    根据Dataphin所在地域选择对应地域。例如,Dataphin所在地域为杭州,则私有网络地域选择杭州

    名称

    填写私有网络名称,128个字符以内,不能以http://https://开头。本文以本地数据中心上杭州VPC网络为例。

    IPv4网段

    填写私有网络的IPv4网段。建议您使用RFC私网地址作为专有网络的网段。例如,10.0.0.0/8172.16.0.0/12192.168.0.0/16,在多VPC互通场景或混合云场景中需确保地址规划不能冲突。本文以192.168.0.0/16为例。

    重要

    不能使用100.64.0.0/10224.0.0.0/4127.0.0.0/8169.254.0.0/16网段作为VPC的网段。

    IPv6网段

    系统为VPC分配的IPv6网段为全球单播地址段,VPC中的实例分配IPv6地址后可以通过IPv6网关连接互联网。本方案默认不分配

    描述

    填写私有网络的简单描述,256个字符以内。

    交换机

    为保证产品跨可用区的高可用性,需要创建两个不同可用区下的虚拟交换机。

    名称

    填写交换机名称,128个字符以内。本文以主交换机为例。

    可用区

    可用区是指在同一地域内,电力和网络互相独立的物理区域。同一可用区内实例之间的网络延时更小,其用户访问速度更快。本文以可用区H为例。

    IPv4网段

    交换机的网段必须是其所属VPC网段的真子集且掩码需在16位到29位之间,可提供8~65536个地址。本文以192.168.1.0/24为例。

  5. 单击确定,完成私有网络的创建。

步骤3:创建VPN网关

  1. 单击左侧导航栏VPN->VPN网关

  2. VPN网关页面,单击创建VPN网关

  3. VPN网关购买页面,根据以下信息配置VPN网关。

    参数

    描述

    实例名称

    填写VPN网关的实例名称。

    资源组

    您可以选择已创建的资源组对云账号下的资源做分类分组管理,以组为单元进行权限管理、资源部署、资源监控等,而无需单独处理各个资源。例如,选择默认资源组

    地域和可用区

    确保VPC的地域和VPN网关的地域相同。选择华东1(杭州)

    网关类型

    选择普通型

    网络类型

    默认公网

    隧道

    默认双隧道

    VPC

    选择本地数据中心上杭州VPC网络。

    虚拟交换机1

    选择主交换机

    虚拟交换机2

    选择备交换机

    带宽规格

    选择一个带宽规格。带宽规格是VPN网关所具备的公网带宽。默认5Mbps

    IPsec-VPN

    选择开启IPsec-VPN功能。

    SSL-VPN

    SSL-VPN功能允许您从任何位置的单台计算机连接到专有网络。默认关闭

    计费周期

    选择购买时长默认一个月。

  4. 单击立即购买并完成支付,即可完成VPN网关的创建。

    说明

    VPN网关的创建一般需要1-5分钟。

步骤4:创建用户网关

  1. 单击左侧导航栏VPN->用户网关

  2. 用户网关页面,单击创建用户网关

  3. 创建用户网关抽屉页面,根据以下信息配置用户网关。

    参数

    描述

    名称

    输入用户网关的名称,100个字符以内。

    IP地址

    输入VPC要连接的本地数据中心网关设备的公网IP。

    自治系统号

    请输入0-4294967295的正整数,支持按照两段位输入,即:前16位比特,后16位比特,每个段位使用十进制输入。默认不填写

    描述

    填写用户网关的简单描述,100个字符以内。不能以http://https://开头。

    资源组

    您可以选择已创建的资源组对云账号下的资源做分类分组管理,以组为单元进行权限管理、资源部署、资源监控等,而无需单独处理各个资源。例如,选择默认资源组

    标签

    输入标签键和标签值。为用户网关绑定标签,便于后续基于标签进行管理。

  4. 单击确认,完成用户网关创建。

步骤5:创建IPsec连接

  1. 单击左侧导航栏VPN->IPsec连接

  2. IPsec连接页面,单击创建IPsec连接

  3. 创建IPsec连接页面,根据以下信息配置IPsec连接。

    参数

    描述

    名称

    输入IPsec连接的名称,100个字符以内。

    资源组

    您可以选择已创建的资源组对云账号下的资源做分类分组管理,以组为单元进行权限管理、资源部署、资源监控等,而无需单独处理各个资源。例如,选择默认资源组

    绑定资源

    选择VPN网关

    VPN网关

    选择已创建的VPN网关。

    路由模式

    如果选择目的路由模式,本端网段和对端网段均为0.0.0.0/0,需要在创建IPsec连接后再在VPN网关内手动添加策略路由或目的路由。

    立即生效

    • :配置完成后立即进行协商。

    • :当有流量进入时进行协商。

    用户网关

    选择要连接的用户网关。

    预共享密钥

    输入共享密钥,该值必须与本地网关设备的预共享密钥一致。

    启用BGP

    需要您的网关设备的品牌支持边界网关协议(BGP),如果您的客户网关设备不支持BGP,请不要开启BGP。默认关闭。

    加密配置健康检查高级配置

    本方案使用系统默认配置,无需修改。

    标签

    输入标签键和标签值。为IPsec绑定标签,便于后续基于标签进行管理。

  4. 单击确定,完成用户网关创建。

步骤6:在本地网关设备中加载VPN配置

  1. 单击左侧导航栏VPN->IPsec连接

  2. IPsec连接页面,选择创建的IPsec连接,然后单击操作列下的下载对端配置

  3. 根据本地网关设备的配置要求,将下载的配置添加到本地网关设备中。配置说明,请参见如何配置本地网关设备

    重要

    下载的配置中RemotSubnet和LocalSubnet与创建IPsec连接时的本端网段和对端网段相反。因为阿里云VPN网关对端是本地IDC的网段,本端是VPC网段;而本地网关设备,LocalSubnet就是指本地IDC的网段,RemotSubnet则是指阿里云VPC的网段。

步骤7:配置VPN网关路由

  1. 单击左侧导航栏VPN->VPN网关

  2. VPN网关页面,选择目标VPN网关并单击实例ID/名称列下的实例ID。

  3. 目的路由表页签,单击添加路由条目

  4. 添加路由条目页面,根据以下信息配置目标路由。

    参数

    描述

    目标网段

    填写本地IDC数据中心的私有网络网段。

    下一跳

    选择IPsec连接实例。

    发布到VPC

    选择是否将新添加的路由发布到VPC路由表。本例选择

    权重

    选择权重值。本例选择100

  5. 单击确定,完成VPN网关路由配置。

步骤三:VPN连接测试

  1. 登录到阿里云VPC内一台无公网IP的ECS实例,并通过ping命令ping本地IDC数据中心内一台服务器的私网IP地址,验证通信是否正常。

    若统计结果的packet loss为0%,rtt avg在10ms以内,证明网络情况良好。

    [root@iZuf61cvux96rhus9ufhq0Z conf]# ping -c 100 xxx.xxx.xxx.xxx
    64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=61 time=7.52 ms
    64 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=61 time=7.38 ms
    64 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=61 time=7.10 ms
    64 bytes from xxx.xxx.xxx.xxx: icmp_seq=4 ttl=61 time=7.55 ms
    64 bytes from xxx.xxx.xxx.xxx: icmp_seq=5 ttl=61 time=7.11 ms
    ........
    --- xxx.xxx.xxx.xxx ping statistics ---
    100 packets transmitted, 100 received, 0% packet loss, time 99121ms
    rtt min/avg/max/mdev = 6.999/7.454/8.415/0.267 ms
  2. 使用telnet命令确定后端服务器接口情况。若出现以上响应信息,表示端口已经处于监听的状态。

    [root@iZuf61cvux96rhus9ufhq0Z conf]# telnet xxx.xxx.xxx.xxx 1521
    Trying xxx.xxx.xxx.xxx...
    Connected to xxx.xxx.xxx.xxx.
    Escape character is '^]'.

步骤四:反向代理数据源服务与keeplive配置

步骤1:安装Nginx并反向代理数据源服务

  1. 使用SSH命令登录ECS云服务器。示例命令如下:

    ssh root@192.168.***.1   //root为登录ECS云服务器的用户名,同时需要将192.168.***.1修改为ECS云服务器IP地址。
  2. 在Shell的命令终端下,按照以下命令编译安装Nginx。

    mkdir -p /usr/local/src && cd  /usr/local/src //创建src目录并切换
    
    wget https://nginx.org/download/nginx-1.16.1.tar.gz   //下载Nginx
    
    tar zxvf nginx-1.16.1.tar.gz &&  cd /usr/local/src/nginx-1.16.1  //解压安装包
    
    um install  lrzsz python-devel gcc gcc-c++ pcre  pcre-devel   patch   unzip   zlib  zlib-devel  openssl openssl-devel  git  jemalloc -y         //安装依赖包
    
    ./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx  --with-http_v2_module  --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-pcre-jit --with-pcre --with-stream      //编译nginx,注意一定要安装stream用于四层代理
    
    make && make install  //安装nginx
  3. 安装Nginx成功后,根据以下步骤配置Nginx反向代理数据源服务。

    1. 备份nginx.conf配置文件。

      cd  /usr/local/nginx/conf/ && cp nginx.conf nginx.conf.bak 
    2. 使用vim nginx.conf编辑配置文件并替换为以下配置。

      user  nobody;
      worker_processes  8;
      events {
          worker_connections  1024;
      }
      stream {
          server{
              listen 61521 so_keepalive=on;       ##配置监听端口和socket连接的keepalive,否则无法支持长连接。
              proxy_pass xxx.xxx.xxx.xxx :1521;    ##配置本地IDC数据中心需要反向代理的数据库服务ip和端口,ip端口请根据数据库服务的端口自行替换。
              proxy_timeout 72h;           ## 配置代理的超时时间,建议配置为72小时。
          }
      }
    3. 使用vim /etc/init.d/nginx编辑并配置Nginx开机自启。

      #!/bin/sh
      #
      # nginx - this script starts and stops the nginx daemon
      #
      # chkconfig:   - 85 15
      # description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
      #               proxy and IMAP/POP3 proxy server
      # processname: nginx
      # config:      /etc/nginx/nginx.conf
      # config:      /etc/sysconfig/nginx
      # pidfile:     /var/run/nginx.pid
      # Source function library.
      . /etc/rc.d/init.d/functions
      # Source networking configuration.
      . /etc/sysconfig/network
      # Check that networking is up.
      [ "$NETWORKING" = "no" ] && exit 0
      nginx="/usr/local/nginx/sbin/nginx"
      prog=$(basename $nginx)
      NGINX_CONF_FILE="//usr/local/nginx/conf/nginx.conf"
      [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
      lockfile=/var/lock/subsys/nginx
      make_dirs() {
         # make required directories
         user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
         if [ -z "`grep $user /etc/passwd`" ]; then
             useradd -M -s /bin/nologin $user
         fi
         options=`$nginx -V 2>&1 | grep 'configure arguments:'`
         for opt in $options; do
             if [ `echo $opt | grep '.*-temp-path'` ]; then
                 value=`echo $opt | cut -d "=" -f 2`
                 if [ ! -d "$value" ]; then
                     # echo "creating" $value
                     mkdir -p $value && chown -R $user $value
                 fi
             fi
         done
      }
      start() {
          [ -x $nginx ] || exit 5
          [ -f $NGINX_CONF_FILE ] || exit 6
          make_dirs
          echo -n $"Starting $prog: "
          daemon $nginx -c $NGINX_CONF_FILE
          retval=$?
          echo
          [ $retval -eq 0 ] && touch $lockfile
          return $retval
      }
      stop() {
          echo -n $"Stopping $prog: "
          killproc $prog -QUIT
          retval=$?
          echo
          [ $retval -eq 0 ] && rm -f $lockfile
          return $retval
      }
      restart() {
          configtest || return $?
          stop
          sleep 1
          start
      }
      reload() {
          configtest || return $?
          echo -n $"Reloading $prog: "
          killproc $nginx -HUP
          RETVAL=$?
          echo
      }
      force_reload() {
          restart
      }
      configtest() {
        $nginx -t -c $NGINX_CONF_FILE
      }
      rh_status() {
          status $prog
      }
      rh_status_q() {
          rh_status >/dev/null 2>&1
      }
      case "$1" in
          start)
              rh_status_q && exit 0
              $1
              ;;
          stop)
              rh_status_q || exit 0
              $1
              ;;
          restart|configtest)
              $1
              ;;
          reload)
              rh_status_q || exit 7
              $1
              ;;
          force-reload)
              force_reload
              ;;
          status)
              rh_status
              ;;
          condrestart|try-restart)
              rh_status_q || exit 0
                  ;;
          *)
              echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
              exit 2
      esac
    4. 增加至开机自启。

      chmod a+x /etc/init.d/nginx && chkconfig --add /etc/init.d/nginx   
    5. 重新启动Nginx。

      service nginx status && service nginx restart

步骤2:测试反向代理是否生效

使用netstat命令查看端口是否监听。以下61521端口已监听。

root@iZuf61cvux96rhus9ufhq0Z conf]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:61521           0.0.0.0:*               LISTEN      1333/nginx: master
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1346/sshd

步骤3:添加Dataphin至ECS安全组

在阿里云ECS安全组内,添加Dataphin的IP段。Datapin出网IP地址,请参见Dataphin出网IP地址

步骤4:测试反向代理端口是否连通

在任意非Nginx代理服务器中使用telnet命令至Nginx代理服务器,确认接口情况。以下61521端口可以连通。

 lxxxx@liaxxxxxook-Pro: telnet xxx.xxx.xxx.xxx 61521
Trying xxx.xxx.xxx.xxx...
Connected to xxx.xxx.xxx.xxx.
Escape character is '^]'.

步骤五:测试代理的服务数据源与Dataphin是否连通

在Dataphin上创建数据源时,类型选择ECS(VPC)自建数据库,配置连接信息并单击测试连接进行连通性测试,如果连通性测试成功则表示能正常连接,反向代理配置成功。