BCLinux YUM源同步手册
-
大部分数据中心的主机是不能访问外网的,所以数据中心中需要部署一台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连接,适用于希望外部流量进来的场景。
注:
- 中间节点B和目标节点C可以是一个节点。
- 如果本地开的端口属于privileged ports(<1024),则必须有管理员权限。
- 对于本地转发隧道:如果未指定bind_address,则默认根据GatewayPorts的配置选择绑定地址,为no则只绑定本地地址,yes则会绑定外部地址。对于远程转发隧道:如果GatewayPorts选项为no,则只能绑定本地地址,不能绑定外部地址。
上面介绍了SSH的两种隧道,下面将介绍如何通过这两种隧道实现本地YUM源的同步。
基于SSH隧道实现同步
1. 本地隧道实现YUM源同步
前面说过本地隧道用于实现本地到外部的连接隧道,所以必须在数据中心内部建立本地隧道才可以。我们本机一般使用Windows系统连接堡垒机,所以在堡垒机上做本地隧道不可行。这里我们在数据中心YUM源服务器上建立本地隧道,堡垒机节点作为中间节点,而本地主机作为目标节点。由于本地主机并不是官方的YUM源服务器,没有端口监听过来的同步请求,所以还需要在本地主机上做端口映射。
1.1 本地主机端口映射
Windows系统中有很多工具可以实现端口映射,本文采用了比较简单易用的CCProxy。具体配置方法如下:
-
打开CCProxy,选择"Options"。
-
选中“Port Map”,然后点击后面的“E”按钮。
-
添加本地监听端口以及转发的远程主机和端口号。
这样之后,所有连接本机873端口的连接,都会被转发至mirrors.bclinux.org的873端口上。
1.2 关闭本机防火墙
由于Windows系统防火墙的限制,可能会导致进来的流量被拦截。为了防止此类事情发生,我们建议先临时关闭本机的防火墙。
- 关闭防火墙
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’,添加远程隧道如下:
上面配置的结果是,在堡垒机中开启监听端口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源服务器需可以访问堡垒机中的指定端口。