Sep 182009
 

前两天在delphij老大的blog中看到了一篇《使用DSR模式实现单IP服务冗余》,觉得很有意思,因为这个实现方式与我以往所见到的有些不同,通过关闭ARP响应来解决虚拟IP在负载均衡设备和服务器上可能冲突的问题。随即提问了一下我所熟悉方式的实现是否可行,勤恳的delphij竟然又写了一篇来解释这个问题。不过这篇的思路似乎与我原来的想法有点出入,所以仔细又思考了一下,最终决定还是要完整的阐述一下我的思路。

我虽然见过一些DSR的实现方式,然而只不过是阅读架构文档而已,想当然来的东西跟最后实际实施出来的东西肯定有差距,所以把自己认为的设计思路记录下来,看看最终是否可行。

首先是拓扑图:

DSR

介绍一下简单的信息:

  • Public VLAN直连Internet,LB和Router分别有一个网卡接口连在这里,用于承载Internet的虚拟IP自然也就是绑在LB连在Public VLAN的NIC上了,方便起见,随便起个IP: 202.96.100.100(202.96段是中国电信骨干IP段,很多坏事都是这里发生的:D)
  • Internal VLAN是放服务器集群的网段,当然就用私有地址,就用典型的192.168.1.0/24吧,这里的Server使用IP 192.168.1.101

首先从数据流角度来看(红色箭头上的标号):

  1. 客户发起到请求: 61.152.X.X:1025 –> 202.96.100.100:80
  2. 负载均衡设备通过匹配包,发现目的IP为虚拟IP,根据Load balance算法挑选一台Server,将数据报直接路由到这台Server,不做任何修改(减TTL不算)61.152.X.X:1025 –> 202.96.100.100:80
  3. Server看到数据报的目的IP是虚拟IP,并发现虚拟IP绑定在自己的lo上,认为目的地是自己,OS派发到应用层Web Server处理Request并生成结果,结果数据包变为 202.96.100.100:80 –> 61.152.X.X:1025
  4. 数据报发往路由器,路由器看到目的地为客户IP,路由到Internet去。

这个过程与传统NAT方式的Load Balance的区别在于,LB不修改目的地址,直接将数据报通过路由的方式转发给服务器集群。然而这里的难点就在于:如果不修改目的IP,那必须让Server能够对发往虚拟IP的请求做出响应,那就必须要把虚拟IP绑定在Server端,因此虚拟IP就同时出现在了两个地方:LB和Server,解决这个冲突就是完成DSR的关键所在。对于此点引用delphij的原话:

实现DSR结构的关键是,通往Internet路由器的那个网络上,只有负载平衡设备在网络上宣示虚拟出来的那个IP的MAC地址,这样,当请求进来的时候,数据会发到负载平衡设备,而不是某一台服务器上。

Delphij采用的方法是,将服务器上网卡的ARP功能关闭,这样服务器虽然绑定了虚拟IP,但不会对外界对于虚拟IP的MAC地址解析请求做出响应,所以完美解决了IP重复的问题。缺点是ARP一关Server自己会找不到Router或者网络内的其他服务器,因此需要手工维护一个静态ARP表。

而我所采用的方式,是不将虚拟IP绑定在实际网卡上,只是绑定在Server的还回(lo)上,这样依旧可以起到缩减ARP响应域的作用。

Delphij认为这样会需要一个额外的Public IP,不过我认为如果Server放在私有地址VLAN的话,应该是不需要额外的IP,在如图的这种拓扑中应该可以完美的工作。只要LB和Server中作出如下配置(红色罗马数字):

I.  Load Balancer要特别设置的地方有:

  • 需要有合适的负载均衡算法以便于把流量分发给不同的Server。
  • 对于TCP这种有状态的服务,需要使用较为宽松的状态机制来维持会话。

这里引用delphij的pf命令为例,如下,round-robin是负载均衡算法,keep-state(slopppy)是宽松状态匹配,这一点对于DSR也是尤为重要,因为DSR的特点就是从Server发回的响应不经过LB,LB看不见回去的响应包,所以Session track必须能容忍这种半吊子连接。而且这里似乎也必须修改Session的timeout时间,否则会有问题,这里无关者略过:

    FreeBSD pf规则举例:pass in on em0 route-to { em1 内网IP1, em1 内网IP2, em1 内网IP3 } round-robin proto tcp from any to 公网IP port http keep state (sloppy)

II.  Server端需要的设置:

  • 在lo上绑定虚拟IP 202.96.100.100,这样Server才会认为目的地是自己。
  • Web Server本身要使用虚拟IP作为监听IP,比如Apache配置Virtualhost的话这样用:<VirtualHost 202.96.100.100:80> ,如此以来Web server会对到虚拟IP的请求做出响应,且响应的源地址也是虚拟IP而不是自己网卡上的私有IP。
  • Server将默认网关设置为Router的IP,这样对于请求的响应就会发往Router而不会返回LB了。

III. Router上应该不需要什么特殊设置,知道把发往Internet的包路由出去就行

这样整个DSR就应该能走通了,不过这个玩法我也只是想出来而已,还没有经过实践,当初看到过F5的nPath实现,应该就是这么种玩法,不过估计实际应用时应该会有我这里没有想到得地方,所以有时间的话,最好还是找几个设备搭一下看看吧,先把设想架构放这儿,改天回来验证。说实话,delphij指出这里必须要有一个额外的公网IP才能保证知道出去的包怎么走,我这点还是没有想通。不管怎样,写出来让大家指正吧,至少在写这篇的过程中,我已经将自己以前没考虑到得一些细节补充完整了,对于自己来说,也算是不小的收获。

Nov 222007
 

昨天给2号机cvsup了RELENG_7的最新代码,决定在Current还没有清晰的新目标前,暂且老老实实呆在RELENG_7一阵子吧。

看了一下版本号,没想到已经是beta3了,这应该是Release前最后一个beta了吧,难道传说的这个Release不会跳票真的实现了?? XD

接下来要做的是将一部分陈旧资料(其实主要是电影存档)搬到ZFS去,然后是恐怖的gnome升级至2.20,希望顺利。时间上就凭一个破P4已经没什么奢望了,做好长期开机build的准备。

另外今天make world时发现有一个变量是可以不让make delete-old时老提示是否删除的,记录之

make BATCH_DELETE_OLD_FILES=YES delete-old

亏得以前按到手软…..

Nov 012007
 

取自FreeBSD HandBook第14.4小节,刚才回顾手册时看到的。

 用 MD5 散列加密的密码通常要比用 DES 散列得到的长一些, 并且以 $1$ 字符开始。 以 $2a$ 开始的口令是通过 Blowfish 散列函数加密的。 DES 密码字符没有任何可以用于鉴别的特征, 但他们要比 MD5 短, 并且以不包括 $ 在内的 64 个可显示字符来表示,因此相对比较短的、没有以美元符号开头的字符串很可能是一个 DES 口令。

Sep 102007
 

摘抄编译自 http://blogs.techrepublic.com.com/security/?p=283

对于一个Sysadmin来说,如何加固系统是一个长盛不衰的话题。然而再坚固的系统也有失守的时候,有时就可能因为非常细小的一点疏漏,导致整个系统被攻破。所以对于Sysadmin来说,尽可能地保证系统安全是其一,其二还要会更快速有效地发现系统被入侵或者控制这种行为。因此完善的日志体系是必要的。然而还有很多日志无法记录的入侵和破坏行为,这就要求从其他方面想办法。对于Windows操作系统,从Win2k起就有一个SFC系统,一旦系统核心文件被更改,就会提醒管理员并生成审计日志。这玩艺在Win2003又进一步发展,不过貌似也是非常不好用。MS在即将发布的Windows 2008里面建立了一种名为Trusted Platform的框架,进一步完善了SFC,其原理大体应该也是核心部件的数字签名以及认证机制,只不过做的更完善一些了。我现在的PC就是因为某P2P网络电视修改了tcpip.sys导致不断生成这个模块的error日志,大体说明这玩艺还是堪用的。不过Windows更难于发现的破坏行为大多在注册表而不是文件系统,所以此方面恐怕还要更为复杂一些。

扯远了,对于unix类操作系统来说,这方面就没有那么复杂了,因为一个系统本身设计哲学的原因:一切皆是文件。因此,只要能有效监控文件系统的更改,就可以抓住一切针对系统的不良行为。以前有过不少人写过Linux系统可以对整个根做md5sum来实现,这个对于其他Unix类系统也适用。然而对于FreeBSD来说,有一个更为方便的工具–mtree。

其实mtree这东西本来是用于安装系统或软件时预先创建目录树的,因为其有散列计算以及权限对比等能力,将其作为一个文件系统完整性审计工具也是刚好。另外还有一个很重要的原因是这个工具为基本发行版所附带,属于随手拈来的东西。假使系统被入侵,基础命令集像ps,top被替换地乱七八糟,也很少会有人想到在mtree上动手脚。即使为了万全的可信任概率考虑,也可以使用rescue CD里的这个工具,还有它依赖的运行库也是非常之少,甚至临时从其他系统cp一个来用也完全可以。
说了这么多废话,其实用法非常简单,如下:

mtree -c -K sha256digest -p / > mtree.txt

-c代表输出至stdout,然后用转向定位到文件。

-K代表使用的散列方法,sha256可谓足够安全了吧。

-p代表要做mtree的目录,指定根自然是对整个文件系统做了。如果按照实际使用需求,其实不应该包含入一些被更改频率很高的目录,例如/var/log等。想做得更完善一点就可以写个脚本读取某文件里的目录列表挨个mtree了。

完成后mtree.txt里面就是我们要获取的审计信息了。
根据mtree.txt再来对照文件系统来检查更改情况则用以下命令:

mtree -f /path-to-mtree.txt -K sha256digest -p /

无输出则表示文件系统没更改,如果有输出,应该是以下类型的结果:

. changed

 modification time expected Mon Sep 10 13:40:01 2007 found Mon Sep 10 14:08:21 2007

mtree.txt changed

 size expected 0 found 24407

 modification time expected Mon Sep 10 14:08:09 2007 found Mon Sep 10 14:08:11 2007

 SHA-256 expected e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 found cb61a409d5e71a69ebbaa713e6d752db275a04f1629b86c4e52a835c70c422df

xxx extra

yyy missing

changed代表文件有变动,extra则代表为新建的文件,missing自然是代表文件没了。一目了然。

这样我们所要做的就是定期为文件系统做一个mtree.txt并妥善保管好,并在系统疑似出问题时拿出它来检查了。

Aug 072007
 

前几天Linus决定用CFS替换掉O(1)的时候就引发了一场flame war,然而除了几个当事人之外,其他人也仅仅能从使用体验上提出一些意见或者benchmark数据。更因为这些schedulers都没有经过长期考验,没有经验性数据,一堆各个领域的用户都七嘴八舌得参与进来,进而这场大讨论又闹到Server VS Desktop,Scientific Computing VS Gaming等等等等。谁让scheduler本身就是一个牵一发而动全身的关键组件呢,动这玩艺就相当于给人换大脑一样。

这次论战现在又有学院派的高人卷进来了,恰逢FreeBSD的ULE调度器3.0发布不久,所以ULE的作者Jeff Roberson (jeffr)也写了一篇文发表了自己的看法,见此:http://jeffr-tech.livejournal.com/12933.html

 jeffr的文章是从设计角度来讨论了这三个调度器实现的不同点,基本上也就是使用的数据结构和算法不同带来的性能影响,有兴趣可以仔细看看,比起LKM那些论战来,不需要懂得那几个大牛之间的前恩宿怨,应该要好看一些。

另外看看用户而不是开发者的comments也是挺好玩的:http://osnews.com/comment.php?news_id=18401

不过毕竟是看过代码才有发言权,普通用户的言论看过就好,没必要较真,真要了解细节还只能看代码。话说回来看完代码估计也不一定就了解。Scheduler设计真是每个变量都要考虑到毫厘,象我这种仅仅是结合几部书讲解调度器的章节过了一遍O(1)和初代ULE的人,还是不理解为什么这样设计或为什么不那样做。所以还是继续看大牛们的热闹吧。

Jun 062007
 

如果说有什么是在服务器部署过程中最重要然而却最容易被忽视的地方,恐怕就只有系统时间了。这玩意看来简单,但实际上大多数系统服务都直接或间接依赖于它,一台时钟不准确的服务器给出的任何结果都有可能是不可信的。所以在近几年的操作系统发行版中,都不约而同的加入了网络校时的功能。然而对于大多数sysadmin来说,这方面还是最容易忽略的。因此这里提倡,无论是在多么无关紧要的系统部署项目中,服务器上线后的第一件事情,一定不要忘记设定一个稳定的事件源并保证持续可靠的校时。

Continue reading »

Jun 052007
 

今天(6月5日)是世界环境日。
本来此类公益节日与吾等草民无甚关系,但是PCI论坛上的一群超频超到死的BT们竟然嚷嚷着要符合世界潮流,今天要禁止超频一天。本人其实并未BT到把24小时开机的机器超频来用(虽然偶尔也超起来make world),但是总也该响应一下潮流吧。想了半天,终于找到一个好主意,今天把机器降频运行一天来为缓解全球气候变暖贡献一份力量-_-
原理是利用powerd服务来实现cpu频率的自动降低和提升,具体作法如下:
修改/boot/loader.conf,加入一行cpufreq_load=”YES”,这个是载入cpufreq的kld,然后修改/etc/rc.conf,加入一行powerd_enable=”YES”。这样下次reboot时就会自动启用powerd。要立即生效的话直接运行/etc/rc.d/powerd start即可。
默认情况下,powerd使用adaptive方式来调节频率,简单来说就是判断cpu空闲率,大于90%则自动降频,低于某一数值则自动回升。具体配置参数可以看manpage powerd(8)。
输入powerd -v可以看到当前频率变化的细节,在我的机器上是这样的:
/home/dawnh>sudo powerd -v
powerd: using APM for AC line status
idle time > 90%, decreasing clock speed from 2149 MHz to 1880 MHz
idle time > 90%, decreasing clock speed from 1880 MHz to 1611 MHz
idle time > 90%, decreasing clock speed from 1611 MHz to 1343 MHz
idle time > 90%, decreasing clock speed from 1343 MHz to 1074 MHz
idle time > 90%, decreasing clock speed from 1074 MHz to 805 MHz

可以看到我的P4 2.4G已经因为空闲自动降频为805Mhz了。

May 062007
 

以前零零散散的玩过,没有一个系统的理解,正好趁放假研究了一下,主要资料来自handbook。

概念

Jail是chroot机制的一种进化后的机制,可以提高更为高级和灵活的隔离和监管机制,除了文件系统监管外,还实现了设备隔离,用户隔离,系统资源隔离,使其更像是一种虚拟机机制了,与此相似的概念有linux下的openvz,以及Solaris下的Container。在下认为此类的技术会与虚拟化技术逐渐融合并逐渐集成入操作系统本身甚至硬件,最终成为新的操作系统资源分配机制(继多用户,多进程,Virtual Memory架构之后新的隔离机制)。

设计
Continue reading »

Apr 152007
 

今天状态十分差,什么都没做好,还净干傻事。

刚才在调试自己的FreebBSD box来玩ZFS的时候,因为7-Current的一个配置文件路径的变更,/etc/zfs被挪到了/boot/zfs下。我本意是要删除/etc/zfs的,结果不知怎么在敲到rm -rf /etc的时候就按下了回车,当回过神来的时候,就对着那个“#”欲哭无泪…..

还好只是自己玩的系统,不然损失就大了,即使是这样,也要想办法尽可能的挽回。简单想了一下,目前对于这个box上etc下面我并没有作太大的修改,几乎自己改过的配置应该都还记得是哪些文件,所以问题的焦点就在于:怎么把原始的/etc文件弄回来。

其实这本也应该不是什么困难的事情,只需要从安装CD中恢复一份原始copy即可,可我这个box是没光驱的!即使是ISO,我也没有7-Current的!而在现在/etc整个消失的情况下,可以说是几乎所有的网络工具都瘫痪-_-

再仔细想了一下,刚好前两天刚做过make world,而/usr/src下面的东西还没删除,就从这里入手了!第一个想到的就是mergemaster,运行失败,提示找不到root用户-_-…..ah……出歪招了,touch /etc/passwd /etc/master.passwd /etc/group,然后mergemaster -p,提示cvs id更新,一阵窃喜,一路i下去,这样最重要的用户和组结构就恢复了,立刻passwd root改密码,接下来就是mergemaster -U,满屏的create,i按到手软,终于创建完了,哈哈。

剩下的就是清理工作了,该改配置的改配置。