ebtables的全称是Ethernet bridge frame table administration。ebtables是一个应用程序,用于设置和维护规则表,这些表中的规则用于检查以太网帧。和iptables是类似的,但是使用比iptables使用更简单。
ebtables有三个表,分别是filter,nat,broute。filter是命令默认操作的表,使用"-t table"来指定要操作的表,-t参数也必须是ebtables命令行的第一个参数。
ebtables也有链,和iptables一样,当数据帧匹配到链中的一条规则时,数据帧将按照该规则被处理,如果不匹配,将测试链中的下一条规则。
ebtables和iptables一样,有多个目标,分别是ACCEPT,DROP,CONTINUE和RETURN。ACCEPT意味着让数据帧通过,DROP意味着数据帧将被丢弃,在BROUTING链中,ACCEPT和DROP代表不同的含义。CONTINUE意味着下一条规则被检查,RETURN表示停止遍历此链,跳回到调用该链的链的下一条规则。
1. 基本命令
-A,--append:
在指定的链后追加一条规则。
-D,--delete:
在指定的链中删除一条规则。删除有两种方法,第一种是通过序号删除,语法是start_nr[:end_nr]。当start_nr和end_nr都指定时,则删除它们之间包括自己的所有规则,如果end_nr被忽略,则删除从start_nr开始的所有规则。第二种是通过指定要删除指令的完整形式。如果有多条相同的指令,一次执行只删除其中第一条。
-I,--insert:
插入一条规则到指定的链中。用法同iptables。
-P,--policy:
修改指定链的默认目标,可以是ACCEPT,DROP和RETURN。用法同iptables。
-F,--flush:
清空指定的链。如果不指定链,则指定的表的所有链都被清空。用法同iptables。
-Z,--zero:
设置指定链的计数为0。用法同iptables。
-L,--list:
列出指定链的所有规则,如果不指定链,则是所有链。
-N,--new-chain:
创建一条新的用户自定义链。用法同iptables。
-X,--delete-chain:
删除指定的用户自定义链。
-E,--rename-chain:
重命名指定的链。举例如下:
~ # ebtables -t nat -E PREROUTING PREFORWARDING
~ # ebtables -t nat -L
Bridge table: natBridge chain: PREFORWARDING, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Bridge chain: POSTROUTING, entries: 0, policy: ACCEPT
2. 规则使用规范
-p,--protocol [!] protocol:
指定帧的协议。这个使用16进制数指定,要高于0x0600,或者名字,例如ARP,也可以是LENGTH。当使用名字时,/etc/ethertypes文件必须存在。
-i,--interface [!] name:
帧被接收的接口。此选项在INPUT,FORWARD,PREROUTING和BROUTING才有用。如果接口名后面以"+"结尾,以该name开始的接口名都将被匹配。
--logical-in [!] name:
接收帧的(逻辑)桥接口。此选项在INPUT,FORWARD,PREROUTING和BROUTING才有用。如果接口名后面以"+"结尾,以该name开始的接口名都将被匹配。
-o,--out-interface [!] name:
发送帧的接口。此选项在OUTPUT,FORWARDING和POSTROUTING才有用。如果接口名后面以"+"结尾,以该name开始的接口名都将被匹配。
--logical-out [!] name:
发送数据帧的(逻辑)桥接口。对应的是--logical-in。
-s,--source [!] address[/mask]:
源MAC地址。address和mask用6个16进制的数,中间用冒号隔开的数组成。可选的MAC地址有单播,多播和广播和BGA(bridge Group Address):
Unicast=00:00:00:00:00:00/01:00:00:00:00:00
Multicast=01:00:00:00:00:00/01:00:00:00:00:00
Broadcast=ff:ff:ff:ff:ff:ff/ff:ff:ff:ff:ff:ff
BGA=01:80:c2:00:00:00/ff:ff:ff:ff:ff:ff
-d,--destination:
目的MAC地址,相对应的是-s选项。
3. ebtables 扩展用法
ebtables扩展是通过动态库,加载到用户空间工具中的。不要像iptables那样使用"-m"选项明确加载,这些扩展也是内核支持的模块,是对ebtables的补充。
among:将一个MAC地址或MAC/IP地址对与一个MAC地址和MAC/IP地址对的列表相匹配。
列表条目有以下格式:XX:XX:XX:XX:XX:XX[=ip.ip.ip.ip][,]。多个列表条目用逗号隔开,指定与MAC地址对应的IP地址是可选的。可以指定具有相同MAC地址但不同IP地址(反之亦然)的多个MAC/IP地址对。如果MAC地址与列表中的任何条目不匹配,则该帧不符合该规则(除非使用了"!")
--among-dst [!] list:
将目的MAC地址与给定的列表进行比较。如果以太网帧有IPv4或ARP类型,那么与列表中的MAC/IP目标地址对进行比较。
--among-src [!] list:
将源MAC地址与给定的列表进行比较。如果以太网帧具有IPv4或ARP类型,那么与列表中的MAC/IP源地址对进行比较
--among-dst-file [!] file:
同--among-dst,只不过是从文件中读取。
--among-src-file [!] file:
同--among-src,只不过是从文件中读取。
arp:指定(R)ARP字段,协议必须指定为ARP或RARP。
--arp-opcode [!] opcode:
(R)ARP操作码(十进制或字符串),如下:
opcode strings:
1 = Request
2 = Reply
3 = Request_Reverse
4 = Reply_Reverse
5 = DRARP_Request
6 = DRARP_Reply
7 = DRARP_Error
8 = InARP_Request
9 = ARP_NAK
hardware type string: 1 = Ethernet
protocol type string: see /etc/ethertypes
--arp-ptype [!] protocol type:
指定(R)ARP使用的协议类型(十六进制或字符串IPv4,表示0x0800)。大多数(R)arp数据包的协议类型为IPv4。
--arp-ip-src [!] address[/mask]:
指定(R)ARP的源IP地址。
--arp-ip-dst [!] address[/mask]:
指定(R)ARP的目的IP地址。
--arp-mac-src [!] address[/mask]:
指定 (R)ARP的源MAC地址。
--arp-mac-dst [!] address[/mask]:
指定 (R)ARP的目的MAC地址。
ip:指定IPv4字段,协议必须指定为IPv4
--ip-source [!] address[/mask]:
指定源IP地址。
--ip-destination:
指定目的IP地址。
--ip-tos [!] tos:
指定IP数据包的Tos值,16进制格式。
--ip-protocol [!] protocol:
指定IP协议。必须为TCP,UDP,DCCP或SCTP。
--ip-source-port [!] port1[:port2]:
指定IP协议的源端口或端口范围,6(TCP),17(UDP),33(DCCP)或132(SCTP)。如果port1省略,则使用0:port2,如果port2省略,则使用1:65535。
--ip-destination-port [!] port1[:port2]:
目的端口或端口范围。用法同--ip-source-port。
ip6:指定IPv4字段,协议必须指定为IPv6
--ip6-source [!] address[/mask]:
指定源IPv6地址。
--ip6-destination [!] address[/mask]:
指定目的IPv6地址。
--ip6-class [!] tclass:
指定IPv6 tc值,16进制数。
--ip6-protocol [!] protocol:
指定IP协议,同--ip-protocol。
--ip6-source-port:
指定源端口,同--ip-source-port。
--ip6-destination-port:
指定目的端口,同--ip-destination-port。
--ip6-icmp-type [!] {type[:type]/code[:code]|typename}:
指定IPv6的ICMP类型和代码。
vlan:指定802.1Q TCI(Tag Control Information)字段,协议必须指定为802_1Q (0x8100)
--vlan-id [!] id:
指定VLAN ID。10进制数0-4095。
--vlan-prio [!] prio:
指定优先级字段,10进制数0-7。此时VLAN ID应该被设置为0。
--vlan-encap [!] type:
封装的以太网帧类型/长度。指定为十六进制数字,从0x0000到 0xFFFF或/etc/ethertypes的符号名称。
limit:该模块使用令牌桶过滤器以有限的速度进行匹配。
使用这个扩展的规则将匹配,直到达到这个限制。它可以与--日志观察器一起使用,例如,提供有限的日志记录。参数有--limit和--limit-burst,它的用途与iptables的限制匹配相同。
本文只要介绍了ebtables的作用以及用法。ebtables中有三张表filter,nat,broute,六条链INPUT,FORWARD,OUTPUT,PREROUTING,POSTROUTING和BROUTING。ebtables不仅包含了一些常用的规则参数,例如-p,-i,-o,-s,-d等,还有一些扩展模块,例如among,arp,ip,vlan等等。