ARP攻击对策(for Linux)

不了解ARP的同学,看下面来自http://www.oxid.it/的演示:

全屏显示

简单点儿说:之所以有ARP攻击是因为ARP协议本身设计的缺陷。网络设备在动态更新系统的ARP表时,会被恶意欺骗。ARP协议是在2层设备(数据链路层:交换机)之间传递的协议,ARP包可以在整个“冲突域”中传递。而一般而言,一个冲突域就是一个子网。VLAN就是设计用来隔离“冲突域”的,所以VLAN可以隔离ARP攻击。简单点说,就是不要和攻击者在一个子网。可惜不是所有的IDC都提供单独的子网(VLAN)给用户,因为划分子网会浪费IP地址。

解决ARP攻击,有几种方法:

第一:使用独立的VLAN(子网)。VLAN(子网)实际上划分了一个ARP安全域,在这个VLAN里的机器之间逻辑上是互相信任的,VLAN将其他不不信任、不安全的设备隔离在ARP协议发挥作用的区域之外,这样便可以不用担心“邻居”中毒而受到连累。这是最保险的做法。但是,假如自家VLAN(网段)里有机器中毒进行攻击,则网络仍然会乱作一团。

第二:网关与服务器双双使用静态ARP记录。之前写过一篇《防止ARP中间人攻击的一个技巧》提到过。简单的点儿说就是在网关(路由器)上设定服务器网卡的MAC,在服务器上设定网关的MAC为静态。这样,路由器和服务器就不会再更新对应的ARP记录,就不会被欺骗。这个方法可以隔离每一台设备,而不用划VLAN(划子网浪费IP),比较适合单设备托管的用户。然而,绝大多数ISP都不会为用户做MAC绑定。而对于设备比多的用户,网关绑定MAC后,每次设备换IP都需要ISP重新设定MAC绑定,比较麻烦;而使用了某些用到ARP机制的应用,在绑定的环境下,则可能会运行不起来,比如HA集群中的failover切换。

第三,被动侦测,以毒攻毒。之前写过一篇关于send_arp的blog,其中无意间提到过这个方法。就是使用send_arp程序,纠正错误的ARP记录。之所以说是以毒攻毒,是因为send_arp程序本身就是一个利用ARP协议缺陷的程序。

另外,需要说明的是。有些ISP以端口保护为技术手段,认为可以阻止ARP攻击,实际上,这种技术是不能完全阻止ARP攻击的。

端口保护(有的称为PVLAN,不知道是不是相同的技术)之后,交换机上的端口下连接的设备只能和网关通信,不可以和“邻居”通信。这样可以起到一定的保护作用。但是,你的“邻居”,仍然是可以访问你的网关的(你们是同一个网关)。它只要欺骗网关,告诉网关你的MAC地址为一个错误的地址,或者干脆改成自己的MAC,那么,你的服务器就会断网,因为网关发给你的服务器的包,发到了错误的MAC地址上。

解决办法,就以毒攻毒。使用send_arp,强制让网关更新关于你的ARP(MAC)记录:send_arp  你的IP地址   你绑定该IP网络接口的MAC   你网关的IP   你网关的MAC

这个命令十分有用。管理员可能都会有这么一种经历,将一个IP地址调整到另一台服务器上的时候,会有一段时间这个IP是不通的。这个时候,这个工具又可以发挥作用了:使用相同的命令格式。

需要说明的是,send_arp命令是不需要必须在本地运行的,在网一网段(VLAN)内的任意主机上执行即可。

解决问题的基本思想是在同网段的机器上,执行两个send_arp,一个是发给网关的,一个是发给被攻击的主机的。

实际上,可以写一个角本,放在本地,使用crontab每两分钟运行一次,假如被ARP攻击,则自行通知网关更新相应的ARP记录。

首先将网关MAC绑定成静态:将下面的命令添加到/etc/rc.local

arp -s  网关IP  网关MAC

cat /opt/cron/moniter_gw.sh
#!/bin/bash
# gw_ip=网关地址
# gw_hw=网关MAC
gw_ip=192.168.0.1
local_ip=192.168.0.45
local_hw= 00:14:78:07:23:00

if ping -c1 -w5 ${gw_ip} ; do
:
else
/usr/local/bin/send_arp   ${local_ip} ${local_hw}   ${gw_ip}   ${gw_hw}
done

crontab :
*/2  *  *  *  *     /bin/bash  /opt/cron/moniter_gw.sh

send_arp.c下载

禁止对数据分区的locate数据库更新

我们的/srv/分区相当的大,图片服务器的就更大了。

所以是不能允许对这个分区的文件进行(locate)索引的,即使系统使用的renice +19的方式运行,也是仍然是对系统资源的浪费。一来浪费CPU资源,二来浪费硬盘I/O,三,会使updatedb的数据库巨大,规划不当的话会使/var分区满掉(或者/分区满掉,假如var不是单独分区的话)。

使用cfengine更新了所有系统的配置文件,排除了对/srv分区的索引。

#/etc/updatedb.conf
PRUNEFS = “auto afs iso9660 sfs udf”
PRUNEPATHS = “/afs /media /net /sfs /tmp /udev /var/spool/cups /var/spool/squid /var/tmp /srv /mnt”

好书推荐:《高性能网站建设指南》

书封面前两天买了两本书,其中一本《高性能网站建设指南》,看了一眼之后,便一发不可收拾,一直看到深夜三点,一口气看完。

对于系统管理员和前端开发、设计工程师来说,书中的技术非常实用。

作者在这本书中分享了14项需要丰富的实践经验才可以积累和获得的技巧,看得我激动不已。

第二天,发现公司技术部有N本这样的书,早上 博文视点 的人刚送过来的,说是和他们搞了个什么合作。世上就真有这么巧的事儿。

随便在公司的邮件列表里推荐了一下,结果已经有两个人拥有这本书,N个人好过,反应相当强烈,一致好评,于是维护给做系统管理和开发、设计的朋友们看看。

书封面写着“前端工程师技能精髓”,不过系统管理员看看也是相当有好处的,至少有三项,是跟后端服务器配置相关的。

笔记备忘一下书中技巧:

规则1:减少http请求

规则2:使用内容分发网络(CDN)

规则3:添加Expries头

规则4:压缩输出

规则5:将样式表放在顶站

规则6:将脚本放在底部

规则7:避免CSS表达式

规则8:使用外部JavaScript和CSS

规则9:减少DNS查询

规则10:简单JavaScript

规则11:避免重定向

规则12:移除重复脚本

规则13:配置Etag

规则14:使用Ajax可缓存

从网上,看到对此技巧的补充,将14条法规,扩展到22条,虽然吹毛求疵,但也算是精益求精(有人说系统管理人员和程序员都是完美主义者,对事情总是精益求精是有道理的),也整理如下:

规则15:Flush the header

规则16:Split static content Across Multiple Hostname

规则17:Reduce the size of cookies

规则18:Host static content on a Different Top-level Domain

规则19:Minify css

规则20:Use GET for XHR

规则21:Avoid Iframe

规则22:Optimize Images

wput技巧

今天要将自己的备份,从一个ftp导到另一个ftp里去。还好可以登录其中一台服务器。

本来想使用lftp的mirror功能,无耐只能登录“local”,不能登录remote,而lftp的mput貌似依然不支持put目录。(谁知道有什么参数可以用来put目录?)

还好有wput可以使用。

然而在wput( wput /home/myname ftp://ftpusername:password@ip/myname )的时候,发现文件名、目录名中包含的空格和汉字,总是报错。

于是有了下面的方法:

$find /home/myname -type f >> ~/list.txt
$while read i ; do wput “$i”  ftp://ftpusername:password@ip/myname ; done < ~/list.txt

这样就支持了空格,不再报错。shell内部的处理,还真是复杂。

神州七号

神州七号第一季

神州七号第二季

神州七号第三季

Firefox 3.0.2 无法保存密码

Firefox升级到3.0.2之后,发现原来保存的密码都不能用了,而且也不能重新保存……

木溪 帮忙,试了很多种方法,网上找了很久,终于找到问题:原来是3.0.2将存密码的文件编码由ANSI转换成了UTF-8,造成了编码错误。

解决办法,就是找到密码保存文件signons3.txt(在 系统盘:\Documents and Settings\xxxx\Application Data\Mozilla\Firefox\Profiles\xxxxx.default目录下),用常用的编辑器打开,另存为UTF-8编码覆盖原来的文件即可。

已经验证过,可行。

几个性能工具备忘

top:

* A: PID        = Process Id
* E: USER       = User Name
* H: PR         = Priority
* I: NI         = Nice value
* O: VIRT       = Virtual Image (kb)
* Q: RES        = Resident size (kb)
* T: SHR        = Shared Mem size (kb)
* W: S          = Process Status
* K: %CPU       = CPU usage
* N: %MEM       = Memory usage (RES)
* M: TIME+      = CPU Time, hundredths
b: PPID       = Parent Process Pid
c: RUSER      = Real user name
d: UID        = User Id
f: GROUP      = Group Name
g: TTY        = Controlling Tty
j: P          = Last used cpu (SMP)
p: SWAP       = Swapped size (kb)
l: TIME       = CPU Time
r: CODE       = Code size (kb)
s: DATA       = Data+Stack size (kb)
u: nFLT       = Page Fault count
v: nDRT       = Dirty Pages count
y: WCHAN      = Sleeping in Function
z: Flags      = Task Flags <sched.h>
* X: COMMAND    = Command name/line

Flags field:
0×00000001  PF_ALIGNWARN
0×00000002  PF_STARTING
0×00000004  PF_EXITING
0×00000040  PF_FORKNOEXEC
0×00000100  PF_SUPERPRIV
0×00000200  PF_DUMPCORE
0×00000400  PF_SIGNALED
0×00000800  PF_MEMALLOC
0×00002000  PF_FREE_PAGES (2.5)
0×00008000  debug flag (2.5)
0×00024000  special threads (2.5)
0×001D0000  special states (2.5)
0×00100000  PF_USEDFPU (thru 2.4)

进程的优先级和nice级别
进程优先级是一个决定进程被CPU执行优先顺序的参数,内核会根据需要调整这个值。Nice值是一个对优先权的限制。进程优先级的值不能低于nice值。(nice值越低优先级越高)
进程优先级是无法去手动改变的,只有通过改变nice值去间接的调整进程优先级。如果一个进程运行的太慢了,你可以通过指定一个较低的nice值去为它分配更多的CPU资源。当然,这意味着其他的一些进程将被分配更少的CPU资源,运行更慢一些。Linux支持nice值的范围是19(低优先级)到-20(高优先级),默认的值是0。如果需要改变一个进程的nice值为负数(高优先级),必须使用su命令登陆到root用户。下面是一些调整nice值的命令示例,
以nice值-5开始程序xyz
#nice –n -5 xyz

改变已经运行的程序的nice值
#renice level pid

将pid为2500的进程的nice值改为10
#renice 10 2500

vmstat:

·process(procs)
r:等待运行时间的进程数量
b:处在不可中断睡眠状态的进程
w:被交换出去但是仍然可以运行的进程,这个值是计算出来的
·memoryswpd:虚拟内存的数量
free:空闲内存的数量
buff:用做缓冲区的内存数量
·swap
si:从硬盘交换来的数量
so:交换到硬盘去的数量
·IO
bi:向一个块设备输出的块数量
bo:从一个块设备接受的块数量
·system
in:每秒发生的中断数量, 包括时钟
cs:每秒发生的context switches的数量
·cpu(整个cpu运行时间的百分比)
us:非内核代码运行的时间(用户时间,包括nice时间)
sy:内核代码运行的时间(系统时间)
id:空闲时间,在Linux 2.5.41之前的内核版本中,这个值包括I/O等待时间;
wa:等待I/O操作的时间,在Linux 2.5.41之前的内核版本中这个值为0

iostat:

%user:user level(应用)的CPU占用率情况
%nice:加入nice优先级的user level的CPU占用率情况
%sys:system level(内核)的CPU占用情况
%idle:空闲的CPU资源情况

Device:块设备名
Tps:设备每秒进行传输的数量(每秒的I/O请求)。多个单独的I/O请求可以被组成一个传输操作,因为一个传输操作可以是不同的容量。
Blk_read/s, Blk_wrtn/s:该设备每秒读写的块的数量。块可能为不同的容量。
Blk_read, Blk_wrtn:自系统启动以来读写的块设备的总量。

块可能为不同的容量。块的大小一般为1024、2048、4048byte。可通过tune2fs或dumpe2fs获得:
# tune2fs -l /dev/hda1|grep ‘Block size’
Block size:               4096
# dumpe2fs -h /dev/hda1|grep ‘Block size’
dumpe2fs 1.35 (28-Feb-2004)
Block size:               4096

我们一直在努力

9月11号,我们的新版后台v5上线了。

说实话,之前,我们技术部的同学们战斗了无数个工作日、非工作日。虽然内测的时候,测出来不少问题,公测的时候,也有不少的bug,但是对于我们来说,已经是个喜人的成果。

先看一下新后台的载图:

blogbus-v5

新后台一上线,网上的评论立刻蜂拥而至,褒贬不一。整体是赞扬多于批评吧!我们依然保持“绿色”、“简洁”的风格,”清新”而又不失丰富。

图片

Nikon D700

Nikon D700

ThinkPad T400

ThinkPad T400

Nikon D80

Nikon D80

UMPC

UMPC

google_phone_by_dogorgod

google_phone_by_dogorgod

Gphone

Gphone

trek

trek

trek

trek

法拉利概念车

法拉利概念车

法拉利概念车

法拉利概念车

现代机器人

现代机器人

现代机器人

现代机器人

现代机器人

现代机器人

现代机器人

现代机器人

关闭lo接口对arp查询的响应

#echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
#echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce