文/陈国良 巫园芬
在高校,信息化和数字化早已渗透到学校教学、科研、管理等各方面,数字化校园成为学校教学和科研的有力支持。基本上每个二级单位都建设了数个信息系统,如果为众多信息系统提供互联网服务对高校网络中心而言将是巨大的挑战。
高校通常自建校园网及IDC,所有校内的信息系统都运行在IDC 中。在单一互联网出口的网络架构中,由于路由简单,问题的焦点落于IP 地址匮乏上;在多个互联网出口的网络架构中,除匮乏的IP 地址,还将存在复杂路由、源进源出、智能DNS 等问题。
复杂路由和源进源出可通过路由设备解决,智能DNS 则可通过配置view zone 解决多运营商互联网出口用户访问优化问题,但匮乏的IP 地址致使无法为每个信息系统配备公网IP,虚拟主机、反向代理技术可以较好地解决IP 地址匮乏问题。
信息系统提供互联网服务无非为实例主机或虚拟主机。实例主机即每个信息系统对应一个公网IP,对于IPv4 地址已经分配完毕但仍未过渡到IPv6 网络期间,显然会占用过多的IPv4 地址。在多出口校园网环境中非主要出口所分配到的IPv4 地址通常只有64 个甚至更少。实例主机方式显然不适合。
暨南大学
虚拟主机的技术实现则有两种方式。第一,使用同一IP 地址但不同端口,由此,每个IP 地址可以支持超过6 万个虚拟主机即运行超过6 万个信息系统。在数量上确实能满足为高校信息系统提供互联网服务,但信息系统的承载是http 或https 协议,这两者都有其默认服务端口80 和443。使用同一IP 地址但不同端口做虚拟主机服务意味着需要改变服务端口,即用户访问该信息系统时需要在域名或IP 地址后面加上端口号以便映射到相应的信息系统,大大降低了用户友好度。
第二,使用同一IP 地址同一端口,根据不同主机名即域名来区分信息系统。如此,每个IP 地址可以支持趋近无限个信息系统,且用户只需输入域名作为信息系统的识别即可访问到相应的信息系统,大大提高了用户友好度。
采用主机名虚拟主机方式可实现区分无限个信息系统,但一台物理主机的性能终归是有限的,而且信息系统的编程语言不一、技术架构参差不齐,亦不可能运行在同一台服务器中。因此,中间件和负载均衡是不得不考虑的问题。
业界解决此类问题的方案不少,考虑到在实际的网络环境中,部分二级单位的服务器并非统一托管到网络中心机房,因此选用反向代理的方案。
对用户而言,反向代理服务器就是信息系统,用户访问反向代理服务器,反向代理服务器接收到用户的请求,接着向真实服务器请求相应的数据,收到真实服务器返回的数据后再将数据返回给用户。反向代理服务器终止了用户的TCP 连接,所以用户不必与真实服务器跟帖可达,用户只需能访问反向代理服务器即可,代理服务器可以通过私有网络向真实服务器请求数据。此架构可节省公网IP 地址,保护真实服务器不受互联网攻击,信息系统数量不受服务器性能限制,优点显著,如图1 所示。
在反向代理软件的选择上,主要考虑三款主流的开源软件,Squid、Varnish 和Nginx。
图1 反向代理原理
Squid,有一定历史的反向代理软件,其功能有传统代理、身份验证、URL 过滤、连接管理等。目前广泛应用于各CDN 上做反向缓存代理服务器。
Varnish 则较为年轻,设计简单,数据主要缓存在内存上,响应更快,更符合目前高速交付的需求,但重启后数据将消失,更适合做网络加速用途。
Nginx 具有高并发的优点,支持http、https、pop、smtp、imap 等多种协议,广泛应用于各大型网站中。
近年来,信息安全事件频出,随着信息安全形势日益严峻,全网使用ssl 安全连接被提上了日程,全网使用https 协议也即将实现,支持反向代理部署的全网https 协议方案必然要求反向代理软件支持SNI,SNI 即服务器名称指示(Server Name Indication),是TLS 协议的扩展,用于指示和哪些主机名服务端来握手连接。这使得一台服务器上相同的IP 地址和端口允许使用多张证书,从而允许多个安全的站点(https 站点)在相同的IP 地址上,不需要使用相同的SSL 证书。这相当于允许虚拟主机用于https。Nginx 较其他软件更好地支持SNI,能够更好地满足需求。
Nginx 除了能实现反向代理功能外,其实还是一款优质的负载均衡软件,它可以做应用层的负载均衡,支持热备、轮询等模式并可灵活配置真实服务器检活机制。然而仅使用Nginx 来实现负载均衡容易出现单点故障,同时单台服务器性能有限,无法很好支持逐年增长的庞大数量的信息系统。
LVS+HA+Ldirectord 可以很好地解决单点故障,从网络层进行负载均衡,具体功能实现如下:
LVS 提供虚拟IP 接收业务请求,并将请求按设定算法调度到真实服务器,工作在OSI 四层以下,通过IP、端口处理业务流量。
HA 是双机高可用,即协商两台服务器,在其中一台服务器上运行LVS,若该服务器出现故障无法运行LVS 则会切换到另一台服务器运行LVS,实现虚拟IP 高可用。
Ldirectord 主要用于检测后端服务器的服务状态,一旦检测到后端服务器下线,则把该服务器从LVS 服务器列表中剔除,避免LVS 把用户请求转发到故障服务器中。
如图2 所示,用户请求www、news、net 等站点,LVS 将用户请求调度到各反向代理服务器,反向代理服务器再根据用户请求连接到真实服务器。
图2 反向代理负载均衡原理
显而易见,信息系统服务器将存在单点故障风险,部分重点服务器无法得到保障。在此情况下,Nginx 的应用负载均衡则可以很好地补充反向代理对真实服务器的负载均衡,实现反向代理负载均衡体系的高可用,如图3 所示。
1.安装
采用内核版本为2.6.x 的Linux 操作系统,以更好地支持LVS。采用源码方式安装ipvsadm-1.26、Heartbeat-3、ClusterLabsresource-agents 和Reusable-Cluster-Components-glue。
图3 高可用反向代理负载均衡原理
2.配置
ha.cf 指定双机均衡对端,关键配置如下:
ucast eth0 192.168.0.121
auto_failback off
node lvsweb48a lvsweb48b
authkeys 配置使用md5 加密验证方法:
auth 3
3 md5 lvsweb48
haresources 配置运行的资源:
lvsweb48b lvsadm ldirectord
ldirectord.cf 关键配置:
virtual=192.168.0.48:80
real=192.168.0.106:80 gate
……
fallback=192.168.0.100:80
service=http
scheduler=lc
lvsadm 配置LVS 初始运行:
#!/bin/bash
RWEBCACHE11=192.168.0.102
……
VWEBCACHE1=192.168.0.48
ogateway=192.168.0.123
……
VHWaddr0=00:CA:74:00:30:00
……
VIPaddr0=192.168.0.48
RIPaddr0=192.168.0.122
# 以下为优化内容一
/sbin/ifconfig eth0 down
/sbin/ifconfig eth0 hw ether $VHWaddr0
/sbin/ifconfig eth0 up
/sbin/ifconfig eth1 down
/sbin/ifconfig eth1 hw ether $VHWaddr1
/sbin/ifconfig eth1 up
……
# 以下为优化内容二
ping -c 3 -i 1 $ogateway
ping -c 3 -i 1 $igateway
ping -c 3 -i 1 $vogateway1
ping -c 3 -i 1 $vogateway2
#以下省略正常配置
#Clear IPVS table
#Set LVS
#Run LVS
3. 优化
上述LVS+HA+Ldirectord 体系配置是经优化后的最终配置,主要体现在:
(1)自编程初始配置,其中将VIP 的MAC 地址统一为双机一致,即LVS 双机进行故障切换时,保持网关设备的arp 表不变,将切换控制在2~3 个ping 包内。若不对此进行优化,刚故障切换时网络中断时间更长,或者需要网关设备调整arp 老化时间,从而影响设备性能。
(2)切换时增加ping 网关等操作,进一步提升网络自愈能力。
(3)使用双网卡路由配置可自由区分内外网流量。
4.增强自愈能力
通过配置监控脚本,实现双活、双宕机等异常情况的自愈。主要原理为通过ping 测LVS 真实IP 与虚拟IP 监控LVS 是否存活,如双宕机则相继重启服务器。设置监控网卡,LVS 生效与失效会改变监控网卡的MAC,通过ping 测监控网卡,分析MAC是生效前或后的值即可判断LVS 是否存在双活异常,如是则相继重启服务器。脚本关键内容如下:
system ("ping -c 4 $virtual_ip > $status_file") &&
printf "Can not run ping command! ";
open(pid_f,$status_file) || die ("Could not open file");
while ($line=
chomp $line;
$cmd_line = $line;
if ( index($cmd_line,$cmd_v) > 0 ) {
$run_v=0;
}
}
close(pid_f);
……
if ( $run_v > 0 ) {
system ("echo $time restart no service>> $fail_
log");
system ("init 6 ") && die "Can not run SH! ";
}
elsif ( $arp_r == $arp_l ) {
system ("echo $time restart both service>> $fail_
log");
system ("init 6 ") && die "Can not run SH! ";
}
exit;
效果较显著,能确保LVS 正常服务,见
日志记录:
201905132015 restart both service
201905190533 restart no service
201905200533 restart both service
……
格式为“日期 操作 原因”,其中“both service”为双活异常,“no service”为宕服务异常。从日志可看出监控脚本可有效维持LVS 正常服务。
1.安装
采用Freebsd 操作系统,源码方式安装nginx-1.10.2。
2.配置
配置nginx.conf 实现反向代理功能,关键配置如下:
server {
listen 80;
server_name *.test.edu.cn;
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_
x_forwarded_for;
proxy_buffering off;
}
}
server {
listen 443 ssl;
server_name *.test.edu.cn;
ssl_certificate test.edu.cn.crt;
ssl_certificate_key test.edu.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://$host;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_
x_forwarded_for;
proxy_buffering off;
}
}
}
include upstream.conf;
include server80.conf;
include server443.conf;
3.优化
上述配置为Nginx 的主配置,做了几点优化,主要体现在:
(1)优化日志记录格式,既考虑到更详尽地记录访问日志,又兼顾安全部门溯源的需要。详尽的日志记录,可以通过分析各响应时间,得出不同站点不同节点的访问时延,进一步有针对性地优化。
(2)主配置与站点个性化配置分离,以便更好地管理,站点个性化配置通过include 方式加载。
(3)对部分重要信息系统需要应用层负载均衡的,通过“include upstream.conf;”,设置upstream 服务器即可实现。
经实验验证并在生产环境稳定运行数年,高可用反向代理体系运行情况良好。实现了校园网的信息系统统一向各互联网出口提供服务,解决了校园网信息系统数量多而各互联网出口IP 不足的问题,减轻了网络管理员的管理工作。通过优化,极大提升了反向代理体系的高可用性。
随着信息技术的发展,信息系统基础重点从简单提供服务到规范代码编写、从简单网络连通到网络安全、从信息发布到信息安全转变,反向代理体系从提供服务的角度解决了高可用,但无法阻挡恶意攻击、无法很好地解决安全问题,这需要进一步的研究与探索。