当主机上的需要发送一个数据到一个目的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
arptables是用户空间工具,用来管理 linux内核中的ARP规则表.这些规则用来
检查ARP帧.arptables类似于iptables,但没有那么复杂.iptables工作于ip层,
用于对ip包进行管理.arptables工作与arp协议层,用于对arp数据帧进行管理.
arptables可以像iptables那样对arp数据帧进行各种规则设置,可以ACCEPT,
DROP等.
Turbolinux 10.5和11版本中,已经集成有arptables命令.
你也可以从源码进行安装:
# wget -c http://jaist.dl.sourceforge.net/sourceforge/ebtables/arptables-v0.0.3-3.tar.gz
# tar zxvf arptables-v0.0.3-3.tar.gz
# cd arptables-v0.0.3-3
# make
# make install
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=IPv4
# 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 <incomplete> on eth0
arp表中已没有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 eth0
arp表中重新记录了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
arpwatch用来监听网络中的ARP数据包并进行记录,同时将监听到的
变化通过E-mail来报告给系统管理员.
arpwatch使用pcap(3)来监听本地以太接口的arp数据包.
Turbolinux 10.5和11版本中,已经集成有arpwatch.
你也可以从源码安装:
# wget -c ftp://ftp.ee.lbl.gov/arpwatch.tar.gz
# cd arpwatch-2.1a15
# ./configure
# make
# make install
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 指定一个用于接收变更信息的邮件地址.
# arpwatch -i eth0 -s [email protected]
监听eth0接口,并将arp的变更信息,发送到本地的root用户邮箱中.