一. ebtables简介

Ethernet bridge frame table administration。ebtables是一个应用程序,用于设置和维护规则表,这些表中的规则用于检查以太网帧。和iptables是类似的,但是使用比iptables使用更简单。

filter,nat,broute。filter是命令默认操作的表,使用"-t table"来指定要操作的表,-t参数也必须是ebtables命令行的第一个参数。

        ebtables也有链,和iptables一样,当数据帧匹配到链中的一条规则时,数据帧将按照该规则被处理,如果不匹配,将测试链中的下一条规则。

        ebtables和iptables一样,有多个目标,分别是ACCEPT,DROP,CONTINUE和RETURN。ACCEPT意味着让数据帧通过,DROP意味着数据帧将被丢弃,在BROUTING链中,ACCEPT和DROP代表不同的含义。CONTINUE意味着下一条规则被检查,RETURN表示停止遍历此链,跳回到调用该链的链的下一条规则。

二. ebtables命令

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: nat

Bridge 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:该模块使用令牌桶过滤器以有限的速度进行匹配。

它的用途与iptables的限制匹配相同。

三. 总结

        本文只要介绍了ebtables的作用以及用法。ebtables中有三张表filter,nat,broute,六条链INPUT,FORWARD,OUTPUT,PREROUTING,POSTROUTING和BROUTING。ebtables不仅包含了一些常用的规则参数,例如-p,-i,-o,-s,-d等,还有一些扩展模块,例如among,arp,ip,vlan等等。