Posts Tagged: send_arp


29
九 08

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下载


15
九 08

Piranha for LVS

食人鱼(Piranha)是南美洲食肉的淡水。它们通常15—25厘米(6—10英寸)长,虽然有时发现有长度达到40厘米的。食人鱼具有尖利的牙齿(能够轻易咬断用造的鱼钩或是一个人的手指[1]),非常凶猛,一旦发现猎物,往往群起而攻之。可以10分鐘內將一隻活牛吃剩一排白骨。当地人用它们的牙齿来做工具和武器。亚马逊河圭亚那河巴拉圭河、等河流是食人鱼经常出没的场所。

piranha,水虎鱼,食人鱼

piranha,水虎鱼,食人鱼

piranha,水虎鱼,食人鱼

piranha,水虎鱼,食人鱼

piranha:

Summary     : Cluster administation tools
Description : Various tools to administer and configure the Linux Virtual Server as well as heartbeating and failover components.  The LVS is a dynamically adjusted kernel routing mechanism that provides load balancing primarily for web and ftp servers though other services are supported.

piranha的组件:

/usr/sbin/pulse
heartbeating daemon for monitoring the health of cluster nodes.

/usr/sbin/lvsd
daemon to control the Red Hat clustering services.

/usr/sbin/nanny
tool to monitor status of service in a cluster.

/usr/sbin/fos
failover services daemon to control the Red Hat clustering service.

/usr/sbin/send_arp
tool  to  notify network of a new IP address / MAC address mapping.
这个工具非常有用。之前有一篇《send_arp的一个角本,我曾经简单介绍过。

On LVS router, there are three service which need to be set to activate at boot time.

  • piranha-gui
  • pulse
  • sshd

If you are clustering multi-port services or using firewall marks, you must enable the iptables service.


5
十二 07

LVS实施笔记

在RS中建立一个lo:0接口,设置ip为vip地址,注意掩码要使用255.255.255.255。

当使用arping vip时,会有多个MAC地址回应,这是因为RS也响应了VS的arp查询。

sysctl -e net.ipv4.conf.all.arp_ignore=1

此时,RS即不再影响RS关于vip的ARP MAC查询了。

假如两台VS之间使用的互备关系,那么当一台VS接管LVS服务时,可能会网络不通,这时因为路由器的MAC缓存表里关于vip这个地址的MAC地址还是被替换的VS的MAC,有两种解决方法,一种是修改新VS的MAC地址,另一种是使用send_arp 命令(piranha软件包里带的一个小工具),格式如下:

send_arp send_arp [-i dev] src_ip_addr src_hw_addr targ_ip_addr tar_hw_addr

这个命令不一定非要在VS上执行,只要在同一VLAN即可。

12-17:

今天对RS ARP MAC查询有了新的认识,网上大多数的文章都提到要用四个参数来关闭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

我的RS最近的流量也频繁出现“异常”,经分析是因为arp的问题,rs有时会夺取VS的ip援用权。使用以上四条之后,VS立刻有了流量。


30
十一 07

send_arp的一个脚本

send_arp 包含在RedHat的集群组件piranha里。send_arp.c

send_arp是一个比较底层的程序,在LVS集群里,要用到。

它的主要作用,我的理解是,用来让交换机或者路由器更新本机在对方MAC缓存表里的信息,特别是路由器。

比如,当你对调了两台设备的IP地址时,可能会有一段时间(视情况而定)这两台机器死活访问不了网关。这是因为网关(路由器)里的MAC表缓存里存的还是原来的MAC地址。

下面是在网上看到一个脚本,大致可以展示send_arp的语法。不过,这个脚本,想了半天,难道是用来防止本机被ARP欺骗的?还是要跟别人抢IP?

#!/bin/sh
#
mac1=`ifconfig eth0 |grep “HWaddr” |cut -c39-55 `

echo Sendarp start. send 你的IP地址 = $mac1

while true;
do
send_arp 你的IP地址 $mac1 你的IP地址 ff:ff:ff:ff:ff:ff
sleep 2
done