BCLinux YUM源同步手册


  • BCLinux Developers

    大部分数据中心的主机是不能访问外网的,所以数据中心中需要部署一台YUM源服务器,用于产品的批量部署以及后期的软件包更新。

    BCLinux对外提供了一个官方的YUM源服务器,其中软件包会不定期更新。为了使用BCLinux提供的订阅服务,数据中心的YUM源服务器需要与官方的服务器做同步。

    如果数据中心本地的YUM源服务器可以访问外网,则可以直接与官方服务器做同步。但是大部分情况下,本地服务器没有访问外网权限。本文档提供一种方案,用于解决本地YUM源的同步问题,主要解决如何在无外网访问权限的情况下,实现本地YUM源服务器的同步。

    下面将根据本地YUM源服务器是否有权限访问外网分别阐述。

    注: 在使用下面的同步脚本之前,请先联系BCLinux获取rsync服务认证信息。

    一、有外网访问权限

    这种情况比较简单,只需下载我们的同步脚本,按照下面的步骤操作即可。

    1. 登入本地YUM源服务器:

    以root用户SSH登入本地YUM源服务器,进入BCLinux YUM源所在目录,本文假设YUM源所在目录是/var/www/html/:

    [root@promote html]# pwd
    /var/www/html
    

    2. 下载同步脚本并解压:

    [root@promote html]# wget http://mirrors.bclinux.org/bclinux/public/yum-sync-scripts.tar.gz
    [root@promote html]# tar zxvf yum-sync-scripts.tar.gz 
    ./conf/
    ./conf/rsyncd.secrets
    ./conf/bclinux.file
    ./conf/exclude.file
    ./history/
    ./logs/
    ./mirror2usb.sh
    ./usb2local.sh
    ./version
    [root@promote html]# rm -f yum-sync-scripts.tar.gz 
    

    3. 执行同步脚本,等待同步完成:

    [root@promote html]# ./mirror2usb.sh 
    receiving incremental file list
    bigcloud/
    bigcloud/2016.01/
    bigcloud/2016.01/base/
    bigcloud/2016.01/base/extras/
    ...
    

    二、无外网访问权限

    由于本地YUM源服务器没有外网访问权限,不能直接与BCLinux官方YUM源服务器进行同步,所以这种情况下同步操作相比第一种情况更加复杂。下面提供两种方法应对此种情况。

    外部磁盘

    在数据中心的DMZ区选择一台有外网访问权限的主机,通过同步脚本将BCLinux官方YUM源同步到主机的外挂磁盘上。外挂磁盘容量必须足够大,最小容量要求是40G。同步结束后将外挂磁盘拔出,然后将其插在本地YUM源服务器上,通过同步脚本将其同步至本地YUM源服务器上。

    具体的操作步骤如下:

    1. 将磁盘外挂在DMZ区主机上

    假设磁盘为sdb,将其挂载在/mnt目录下:

    [root@promote mnt]# mount /dev/sdb /mnt
    

    2. 下载同步脚本,执行并等待同步结束

    [root@promote html]# wget http://mirrors.bclinux.org/bclinux/public/yum-sync-scripts.tar.gz
    [root@promote html]# tar zxvf yum-sync-scripts.tar.gz 
    ./conf/
    ./conf/rsyncd.secrets
    ./conf/bclinux.file
    ./conf/exclude.file
    ./history/
    ./logs/
    ./mirror2usb.sh
    ./usb2local.sh
    ./version
    [root@promote html]# rm -f yum-sync-scripts.tar.gz 
    [root@promote html]# ./mirror2usb.sh 
    

    3. 将磁盘外挂在本地YUM源服务器

    假设磁盘设备名为/dev/sdb,挂载在/mnt目录下:

    [root@promote ~]# mount /dev/sdb /mnt
    

    4. 调用同步脚本,等待同步结束

    由于sdb中已经包含了最新YUM源,只需将其与本地的YUM源做同步即可,假设本地YUM源存放在目录/var/www/html下,执行如下命令:

    [root@promote mnt]# ./usb2local.sh /var/www/html/
    

    等待同步结束。

    VPN和SSH隧道

    为了便于后期对产品的维护,数据中心一般都会开通4A,研发人员可以通过VPN远程连接至数据中心堡垒机,再通过堡垒机连接至其他主机。下面首先介绍一下SSH隧道的原理,然后分析如何通过SSH隧道实现本地YUM源的同步。
    SSH提供了两种隧道,一种是本地转发隧道,另一种是远程转发隧道。

    1. 本地转发隧道

    建立本地转发隧道命令如下:

    ssh -N -f -L [bind_address:]port:host:hostport [user@]remotehost
    

    其中:

    -N:这个连接只做端口转发用,不执行任何命令。
    -f:SSH客户端在后台执行。
    -L:做本地的端口映射,将本地port端口映射至远端机器host的hostport端口,bind_address可以指定该端口的监听范围。

    假设本地节点是A,中间节点为B,目标节点为C。

    这条命令执行后首先会在本地节点A上开通一个监听端口,然后会触发一个SSH连接请求至中间节点B,此时需要对SSH连接做认证。

    当有请求连接监听端口时,SSH会将数据通过SSH加密隧道转发至中间节点B。中间节点B收到SSH请求数据后,会尝试与C建立连接,并将C返回的数据通过SSH隧道返回至本地节点A。这样就实现了本地节点A,通过与中间节点B建立的SSH隧道,访问目标节点C指定端口的目的。

    这种类型的隧道一般用于A无法直接访问C,但是B可以访问C,而且A和B之间可以建立SSH连接的情况。由于SSH协议提供了数据加密服务,可以保证通信的机密性。

    在本地YUM源服务器上通过本地转发隧道实现YUM源的同步。

    2. 远程转发隧道

    建立远程转发隧道的命令如下:

    ssh -N -f -R [bind_address:]port:host:hostport [user@]remotehost
    

    -R:做远程的端口映射。将remotehost所指机器的port端口映射至远端机器host的hostport端口。

    这种隧道用于A不能直接访问C,但是B与A之间可以建立SSH连接的情况下。上述命令需要在中间节点B上执行,此时会在A和B之间建立了SSH连接,但是B是客户端A是服务端。

    当有连接请求节点A的port端口时,会通过A和B之间的SSH加密隧道,将数据转发至中间节点B。再由中间节点B向目标节点C发出连接请求,目标节点C的应答数据包也通过这条隧道返回到A节点,从而实现了A与C之间的通信。

    这种隧道与本地隧道的区别体现在监听端口的位置不同,本地转发隧道将在本地开启端口,并且主动与中间节点建立SSH连接隧道,适用于需要通过本地节点外出的场景。而远程转发隧道将在中间节点开启端口,并建立SSH连接,适用于希望外部流量进来的场景。

    注:

    1. 中间节点B和目标节点C可以是一个节点。
    2. 如果本地开的端口属于privileged ports(<1024),则必须有管理员权限。
    3. 对于本地转发隧道:如果未指定bind_address,则默认根据GatewayPorts的配置选择绑定地址,为no则只绑定本地地址,yes则会绑定外部地址。对于远程转发隧道:如果GatewayPorts选项为no,则只能绑定本地地址,不能绑定外部地址。

    上面介绍了SSH的两种隧道,下面将介绍如何通过这两种隧道实现本地YUM源的同步。

    基于SSH隧道实现同步

    1. 本地隧道实现YUM源同步

    前面说过本地隧道用于实现本地到外部的连接隧道,所以必须在数据中心内部建立本地隧道才可以。我们本机一般使用Windows系统连接堡垒机,所以在堡垒机上做本地隧道不可行。这里我们在数据中心YUM源服务器上建立本地隧道,堡垒机节点作为中间节点,而本地主机作为目标节点。由于本地主机并不是官方的YUM源服务器,没有端口监听过来的同步请求,所以还需要在本地主机上做端口映射。

    1.1 本地主机端口映射

    Windows系统中有很多工具可以实现端口映射,本文采用了比较简单易用的CCProxy。具体配置方法如下:

    • 打开CCProxy,选择"Options"。
      0_1481263047202_upload-2713d86f-e07b-4560-b5fa-e9a8761f310e

    • 选中“Port Map”,然后点击后面的“E”按钮。
      0_1481263126627_upload-a1cbc8e6-8d31-4682-94d8-77d131ff10eb

    • 添加本地监听端口以及转发的远程主机和端口号。
      0_1481263251831_upload-ac75cf90-6c2d-49ba-b9ed-d614b1f52558
      这样之后,所有连接本机873端口的连接,都会被转发至mirrors.bclinux.org的873端口上。

    1.2 关闭本机防火墙

    由于Windows系统防火墙的限制,可能会导致进来的流量被拦截。为了防止此类事情发生,我们建议先临时关闭本机的防火墙。

    • 关闭防火墙
      0_1481263644757_upload-13cc81d7-9be8-4724-8ff5-270da1619066

    1.3 配置SSH本地隧道

    通过数据中心的VPN服务登录到堡垒机中,并通过堡垒机登录至数据中心YUM源服务器,在其中执行如下命令建立SSH隧道,VPN为本机分配的IP地址是10.8.10.5,堡垒机的IP地址是172.20.137.102:

    [root@promote ~]# ssh -N -f -L 10873:10.8.10.5:873 xxxx@172.20.137.102
    

    xxxx为堡垒机中的用户,命令执行过程中会提示输入该用户在堡垒机的密码。执行成功后,确认端口是否监听:

    [root@promote ~]# ss -tln | grep 10873
    LISTEN     0      128               127.0.0.1:10873                    *:*     
    LISTEN     0      128                     ::1:10873                   :::*     
    

    1.4 测试隧道连通性

    [root@promote ~]# telnet localhost 10873
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
    @RSYNCD: 30.0
    

    看到RSYNCD字符串说明SSH隧道连通性正常。

    1.5 修改同步脚本中配置

    我们需要连接到本机的10873端口,而不是官方的YUM服务器,所以需要修改同步脚本中的服务器地址和端口号,修改后的结果如下:

    MIRRORS=localhost
    PORT=10873
    

    1.6 执行同步脚本,等待同步结束

    [root@promote html]# ./mirror2usb.sh
    

    2. 远程隧道实现YUM源同步

    在连接堡垒机时,设置开启SSH远程隧道。本文以xshell客户端为例,其他客户端的设置方法类似。

    2.1 设置SSH远程隧道

    • 打开SSH连接的属性页,选择‘Tunneling’。

    • 在‘TCP/IP Forwarding’配置项中选择'ADD’,添加远程隧道如下:
      0_1481251349756_upload-88fefe46-b5a0-407f-9871-600797ab14b8
      上面配置的结果是,在堡垒机中开启监听端口10873,所有连接此端口的请求都通过SSH隧道转发至本地主机,由本地主机连接BCLinux 官方YUM源服务器的873端口。这里使用的是YUM源服务器的内网地址10.254.8.8,如果本地主机不能访问内网,需要修改为域名:mirrors.bclinux.org

    2.2 测试隧道连通性

    登录至数据中心YUM源服务器,使用telnet测试SSH隧道的连通性,假设堡垒机IP地址是10.1.1.10:

    [root@promote ~]# telnet 10.1.1.10 10873
    Escape character is '^]'.
    @RSYNCD: 30.0
    

    看到RSYNCD字符串说明SSH隧道连通性正常。

    2.3 修改同步脚本中配置

    我们需要连接到堡垒机的10873端口,而不是官方的YUM服务器,所以需要修改同步脚本中的服务器地址和端口号。假设堡垒机IP地址是10.1.1.10,则修改后的结果如下:

    MIRRORS=10.1.1.10
    PORT=10873
    

    2.4 执行同步脚本,等待同步结束

    [root@promote html]# ./mirror2usb.sh
    

    使用这种方法需要满足几个条件:

    • 堡垒机中GatewayPorts配置项需为yes。
    • 数据中心YUM源服务器需可以访问堡垒机中的指定端口。

登录后回复
 

与 BC-LINUX 的连接断开,我们正在尝试重连,请耐心等待