Linux下ARP绑定
一.ARP协议简介
当主机上的需要发送一个数据到一个目的IP时,设备驱动程序并不能理解这个IP地址. 系统需要将IP地址转换为网络地址,再传递给设备驱动程序发送出去. ARP(地址解析协议)就是这样的一种网络协议.用于将高层协议地址(IP地址)转换为物理网络地址.linux内核中保存有一个ARP表,里面保存有IP地址和MAC地址的对应关系.使用arp命令可以查看主机的ARP表.
# arp -a
m1 (192.168.0.1) at 00:E0:4C:FF:D7:31 [ether] on eth0二.ARP协议相关工具
1.arptables
a) arptables简介
arptables是用户空间工具,用来管理 linux内核中的ARP规则表.这些规则用来检查ARP帧.arptables类似于iptables,但没有那么复杂.iptables工作于ip层,用于对ip包进行管理.arptables工作与arp协议层,用于对arp数据帧进行管理.arptables可以像iptables那样对arp数据帧进行各种规则设置,可以ACCEPT,DROP等.
b) arptables的安装
CentOS下安装方法:
yum install arptables_jf.i386Ubuntu下安装方法:
sudo apt-get install arptablesc) arptables命令的语法
arptables [-t table] -[AD] chain rule-specification [options]
arptables [-t table] -[RI] chain rulenum rule-specification [options]
arptables [-t table] -D chain rulenum [options]
arptables [-t table] -[LFZ] [chain] [options]
arptables [-t table] -[NX] chain
arptables [-t table] -E old-chain-name new-chain-name
arptables [-t table] -P chain target [options]链(chain)
kernel表是用来区分不同设置的不同功能.规则的每个设置叫做一个”链”.每个链是有一个排序了的规则列表,用来于ARP帧相匹配.如果一个规则与一个ARP帧相匹配,一个”操作说明”会提供需要进行哪些操作.操作说明叫做”目标”.然而,如果帧与当前链中的当前规则不匹配,则继续与链中的下一条规则进行检查.用户可以建立一个新的链,作为规则的”目标”来使用.
目标(target)
包含有一个ARP帧与一个帧处理说明的防火墙规则说明叫做一个”目标”.当一个帧与一个规则相匹配时,则kernel按”目标”的定义进行下一步操作.“目标”可以是:ACCEPT,DROP.CONTINUE,RETURN,扩展定义或用户指定规则. ACCEPT表示允许这个帧通过.DROP表示这个帧将被丢弃.CONTINUE表示继续进行下一条规则.这样可以很方便的计算,有多少帧经过了某个规则.RETURN表示不在这个链中继续进行匹配,返回到上一条链的下一条规则.
表(table)
在kernel中只有一个ARP表.这个表是一个过滤器.你可以在arptables命令中使用-t filter参数.使用时,-t参数必须是arptables命令的第一个参数. -t,–table是一个过滤器,在kernel中仅有这一个表,它包含2个(2.4.x内核)或3个(2.6.x内核)内建规则:INPUT(发送帧的源主机),OUTPUT(本地产生的帧),FORWARD(由桥代码转发的帧).2.4.X内核中没有FORWARD规则.
arptables命令参数
命令行参数分为几个部分:命令部分,杂项部分,规则说明,匹配扩展,监视器扩展.
命令(command)
arptables命令参数用于指定在使用-t参数定义的表中的执行动作.如果你没有使用-t参数指定一个表名,则命令将应用于默认的过滤表.使用-Z命令时,命令行每次只能 使用一个命令.
-A,–append 在指定的链结尾添加一个规则.
-D,–delete 从指定的链中删除规则.这个命令有2种用法:
1.指定要删除规则的序号,语法是: start_nr[:end_nr],可以使用负数.
2.指定要删除规则的详细内容.
-I,–insert 按序号,在指定的链中插入规则.如当前的序号为N,则可以使用-N到N+1作为插入序号.序号0表示表示在最后一条规则后插入新规则,等同于-A参数.
-R,–replace 替换链中指定的规则.如果当前的序号是N,则指定的序号可以是1到N之间的数字.
-P,–policy 在链中设置指定目标的策略,可以为:ACCEPT,DROP或RETURN.
-F,–flush 清空指定的链.如果没有指定链,则所有的链都将被清空.清空链不会改变链的策略.
-Z,–zero 将指定链的计数器置0.如果没有指定链,则所有计数器都将置0.-Z命令可以与-L命令结合使用.当同时使用-Z,-L命令时,计数器的值会先被打印出来,然后置0.
-L,–list 输出指定链中的规则.如果没有指定链,所有将输出所有链中的规则.
-N,–new-chain 建立新的用户链.用户链的数量没有限制,但用户链的名称最多可以有31个字符.
-X,–delete-chain 删除指定的用户链.用户链中必须为空.如果没有指定用户链,则所有为空的用户链将被删除.
-E,–rename-chain 重命名指定链.你可以重命名一个用户链,也可以重命名一个标准链名.
-V,–version 显示arptables程序的版本号.
-h,–help 输出语法帮助信息.
-j,–jump 目标 规则的目标.可以是:ACCEPT,DROP,CONTINUE,RETURN,目标扩展或用户定义链名.
-s,–source-ip [!] IP地址[/掩码] 源IP地址
-d,–destination-ip [!] IP地址[/掩码] 目的IP地址
–source-mac [!] MAC地址[/掩码] 源MAC地址
–destination-mac [!] MAC地址[/掩码] 目的MAC地址.
-i,–in-interface [!] 设备名 用于接收帧的接口(应用于INPUT,FORWARD链).–in-if是这个选项的别名.
-o,–out-interface [!] 设备名 用于发送帧的接口(应用于OUTPUT,FORWARD链).–out-if是这个选项的别名.
-l,–h-length 长度[/掩码] 硬件长度(单位字节).
–opcode 代码[/掩码] 操作码(2字节).可以使用:1=请求,2=回复,3=反解析请求,4=反解析回复, 5=动态反解析请求,6=动态反解析回复,7=动态反解析错误,8=逆向ARP请求, 9=ARP_NAK
–h-type 类型[/掩码] 硬件类型(2字节,十六进制).可以使用:1=Ethernet.
–proto-type 类型[/mask] 协议类型(2字节).可以使用:0×800=IPv4d) arptables使用实例
# arp -a
m1 (192.168.0.1) at 00:E0:4C:FF:D7:31 [ether] on eth0显示当前ARP表信息
当前ARP表中保存有一个主机的arp信息,m1主机,ip地址192.168.0.1
# arptables -D INPUT -s 192.168.0.1 -j DROP设置arp规则,将所有192.168.0.1的arp包全部丢弃.
# arp -d 192.168.0.1 -i eth0使用arp命令,删除arp表中的192.168.0.1的记录.
# arp -a
m1 (192.168.0.1) at on eth0arp表中已没有m1主机的信息.
# ping 192.168.0.1
PING m1 (192.168.0.1) 56(84) bytes of data.
From m2 (192.168.0.2) icmp_seq=2 Destination Host Unreachable
From m2 (192.168.0.2) icmp_seq=3 Destination Host Unreachable
From m2 (192.168.0.2) icmp_seq=4 Destination Host Unreachable由于无法获得m1主机MAC信息,所以,无法与m1主机进行通信.
# arptables -D INPUT -s 192.168.0.1 -j DROP删除arptables规则.
# arp -a
m1 (192.168.0.1) at 00:E0:4C:FF:D7:31 [ether] on eth0arp表中重新记录了m1的MAC信息.
# ping 192.168.0.1
PING m1 (192.168.0.1) 56(84) bytes of data.
64 bytes from m1 (192.168.0.1): icmp_seq=1 ttl=64 time=0.315 ms一般情况下,我们可以做如下的规则定义:
arptables -F
arptables -A IN –src-mac ! 网关MAC -j DROP
arptables -A IN -s ! 网关IP -j DROP查询arptables状态
arptables -L2.arpwatch
a) arpwatch简介
arpwatch用来监听网络中的ARP数据包并进行记录,同时将监听到的变化通过E-mail来报告给系统管理员. arpwatch使用pcap(3)来监听本地以太接口的arp数据包.
b) arpwatch的安装
CentOS下安装方法:
yum install arpwatch.i386Ubuntu下安装方法:
sudo apt-get install arpwatchc)arpwath命令的语法
arpwatch [ -dN ]
[ -f datafile ]
[ -i interface ]
[ -n net[/width ]]
[ -r file ]
[ -s sendmail_path ]
[ -p ]
[ -a ]
[ -m addr ]
[ -u username ]
[ -R seconds ]
[ -Q ]
[ -z ignorenet/ignoremask ]
-d 标记用来启用调试模式.
-f 标记用来设置使用的数据库名,默认是arp.dat.
-i 用来指定网络接口.
-n 用于说明本地网络.
-r 指定读取一个由tcpdump或pcapture生成信息文件,而不从网络接口中
读取.\\-s 用于指定sendmail程序的路径.
-p 指定禁用”混合模式”.网络接口不是”混合模式”时,ARP广播也可以通过.
-a 默认情况下,arpwatch仅记录默认网络接口上,第一个IP地址子网的arp
信息.使用-a参数,则记录网络接口上所有IP地址子网的arp信息.
-m 指定一个用于接收变更信息的邮件地址.d)arpwatch使用实例
# arpwatch -i eth0 -s root@localhost.localdomain监听eth0接口,并将arp的变更信息,发送到本地的root用户邮箱中.
3.手动arp绑定的方式。
如果服务器作为内网网关使用,可以在内网网卡界面
ifconfig eth1 -arp关闭ARP响应(假设eth1是内网网卡)
arp -f /etc/arp.list #设置静态ARP表以下是ARP(8) 关于arp.list格式的描述,
Cause the file filename to be read and multiple entries to be set in the ARP tables. Entries in the file should be of the form hostname ether_addr [temp] [pub] with argument meanings as given above. Leading whitespace and empty lines are ignored. A `#’ character will mark the rest of the line as a comment.
