官方文档:http://ebtables.netfilter.org/misc/ebtables-man.html
非权威翻译,大家辩证查阅。
描述:
ebtables是一个创建和维护内核 嗅探Ethernet frame规则表格的应用程序,它类似iptables,但是没有它复杂,因为Ethernet协议相比ip协议更简单一点
CHAINS
Linux内核内置了三种ebtables 表。这些表用来区分不同的功能规则,每一种规则的集合就叫做一个chain,每一个chain都是一个用来匹配Ethernet frame的有序规则链表,如果一条规则匹配匹配上了一个Ethernet 帧,则有一条处理说明规格来表示如何处理这个匹配上的帧,这个处理说明规格被叫做一个target。如果frame没有匹配上当前这条规则,chain里面的下一条规则就会被检查,以此类推。用户可以自定义被用来作为target规则chains,用户自定义的chains非常有用,在线性处理规则可以达到更好的性能,同时也可以更好的组织和维护规则。
TARGETS
一个防火墙规则标明的一个Ethernet帧处理标准,一个帧的处理说明规格叫做一个target。当一个帧匹配上一条规则,那么下一步内核要做的动作则是由target来约定的,target可以是如下的值:
ACCEPT,DROP,CONTINUE,RETURN,’extension‘,或者到用户自定义chain的一个跳转。
ACCEPT指的是让这个帧通过;
DROP指的是这个帧丢掉,在BROUTINGchain里面,ACCEPT和DROP有不同的意义(参见-t选项)
CONTINUE指的是执行下一条规则,这个可能很有用,比如:在这个chain上一个特定的点上可以知道通过了多少帧,输出对应日志,或者在一个帧上应用更多元的target
RETURN指的是停止在这个chain上处理,恢复到之前调用这个chain的规则的下一条规则上。
对于扩展targets,可以参考下面的TARGET EXTENSIONS
TABLES
就像之前陈述的,内核有三张ebtables 表。这些表的名字叫filter,nat,和broute,在这三种表格里面,这个filter表是默认的表格。如果你想操作的就是filter表格,那么在执行ebtables命令行时就不要添加-t filter参数,对于另外两个表格,是需要通过-t指定的,如果要用-t,则-t参数必须是ebtables命令行的第一个参数。
-t,--table
filter是默认的表,有三个内置的chains(注意有两处提到3个,但是意义不一样),INPUT(帧的目的地址是bridge自己,在MAC目的地址这一个level),OUTPUT(locally生成的或者路由桥接的帧)FORWARD(被bridge转发的帧)
nat大多数情况都是用来修改mac地址,同时也包含3个内置的chains。PREROUTING(处理调整进来的帧)OUTPUT(处理locally生成的或者在被桥接之前的要被路由的帧;POSTROUTING(处理将要发送出去的帧)。对于PREROUTING和POSTROUTING这两个chain的名字有个小说明:其实PREFORWARDING和POSTFORWARDING这两个名字更准确,iptables更早一点,他们的名字都是这样叫,所以用了相同的名字。如果你不喜欢,可以使用—E参数修改名字。
broute是用来做一个broute,只有一个内置的chain:BROUTING,DROP和ACCEPT target有不同的意义,DROP指的是这个帧必须被路由,ACCEPT 指的是这个帧必须被桥接,BROUTINGchain是很早就会进入的,然而。。。。没有很明白
EBTABLES命令行参数
在-t table命令行参数之后,这些保留的参数可以被分成几组。这些组是:命令,其它杂项命令,规则说明,匹配扩展项,watcher扩展项,target扩展项。
COMMANDS
ebtables的命令行参数是用来定义-t表的动作行为。COMMANDS只能在命令行出现一次,不包含如下:-L和-Z结合起来,-N和-P结合起来,或者有--atomic-file参数
-A,--append
在选择的chain后面加一条规则
-D,--delete
在选择的chain上删除一条或者几条规则,有两种方法使用这个规则,第一种是显示指定要删除的区域(直接跟在-D后面),语法是:起始:结束。可以使用-L或者--Ln来列出规则的序号。当end_nr被忽略的时候,所有大于开始序号的规则都会被删除,使用负数也是被允许的,更多关于负数的细节,参见-l命令,第二种方法是显示的指定所跟添加时候一样的规则,第一个被匹配上的会被删除。
-C,--change-counters
改变一个规则或者一些规则的计数,有两种方法使用这个命令,第一种是指定一个间隔,和—D一样。第二种是指定和添加的时候一样的规则,匹配到的第一条规则被改变。第一种方法,计数是在间隔那显示声明。第二种直接跟在-C后面的使用说明,首先包计数是显示指定的,接下来是字节计数,如果这个计数是以+开始,计数值会在对应规则上加这个值,如果是-,则是减。
-I,--insert
把特定的指定了序号的规则插入选择的chain,如果rule序号没有指定,则被加在头部,如果当前的rule序号是N,那么加的这个序号可以是-N到N+1之间,序号0标明插入到最后一条。
-P,--policy
为chain设置policy,policy可以是accept,drop return
-F,--flush
冲掉选择的chain,如果没有指定,每一个chain都会冲掉,但是不改变这个chain的policy
-Z --zero
设置选择的chain的计数为0,如果没有选择chain,所有的都设置为0,-Z可以和-L结合使用,如果-Z和-L都用了,先把计数打印出来再设置为0
-L,--list
列出选择的chain的所有规则,如果没有选择,所有的chain都列出来,如下的选项改变-L命令的输出
--Ln
在每条rule之前,列出规则数字,这个选项和--Lx是不兼容的
--Lc
在每条规则后面显示计数,这里计数指的是帧计数和字节计数。这个选项如果和--Lx结合,会按照-c pcnt bcnt格式输出
--Lx
没有看懂
--Lmac2
以固定长度显示所有的MAC地址,
-N --new-chain
创建一个以指定名字的用户定义chain,自定义chain只能最多有31个字符,用户自定义chain的标准策略是ACCEPT。可以用-P命令行来初始化一个不一样的target,和-N命令一起,这种情况,chain名字不是必须要跟在-P之后。
-X,--delete-chian
删除自定义chain,一定不能有其它chain对该chain的引用,如果有引用,则ebtables不会删除它,如果没有指定的chain,所有的没有被引用的chain都会被删除掉
-E,--rename-chain
对chain重命名,也可以对标准chain重命名,尽量不要重命名标准chain
--init-table
用initial表的数据来替换当前table
--atomic-init
拷贝table的内核初始化数据到特定文件,当规则被加到文件后,这个可以用作第一个action,这个可以通过--atomic-file命令行或者EBTABLES_ATOMIC_FILE环境变量来指定。
--atomic-save
拷贝table的内核当前正在用的数据到特定文件,其它类似--atomic-init
--atomic-commit
用特定文件的数据替换内核table数据,可以一次性load所有的数据到内核,节省了内核的时间。这个初始的文件,可以是用--atomic-save或者--atomic-init创建的。
MISCELLANOUS COMMANDS
杂项命令行
-V,--version
显示ebtables用户空间程序版本
-h,--help
帮助
-j,--jump target
规则的target,可以是如下几个值:accept,drop,continue,return,a target extension或者一个用户自定义的chain名字
--atomic-file file
让这个命令操作在指定的文件,table操作的数据从文件提取,结果会被写回文件,如果指定,这个选项应该在command 命令之前,
-M,--modprobe program
load缺失的内核模块
--concurrent
用文件锁支持并发脚本更新ebtables内核表
RULE specification
下面的命令行参数组成了rule规范。!选项对那条规则取反。
-p --protocol [!] protocol
协议是用来创建frame,可以是十六进制数字,像大于 0x0600,可以是名字,像ARP,或者长度,ethernet的帧的协议字段可以用来指示头部长度。当-p的值是小于或者等于0x0600,这个值等于头部长度,而不应该用作协议值字段。对于length其实也可以看做是一种协议,这种协议就叫做LENGTH。
/etc/ethertypes可以用来查看可读的协议名字,而不是枯燥的十六进制。例如:0x0800可以用来指示IPV4
-i,--in-interface
用来指示用哪个接口来收包,这个选项在INPUT,FORWARD,PREROUTING和BROUTING 这几个chain有用,如果网卡名字使用+结尾,则任何一个使用该名字开头的都会match
--logical-in name
用来指示接收帧的逻辑网桥接口,这个选项在INPUT,FORWARD,PREROUTING和BROUTING 这几个chain有用,如果网卡名字使用+结尾,则任何一个使用该名字开头的都会match
-o,--out-interface name
用来指示帧要从哪个接口(网桥端口)发送出去,这个选项在OUTPUT,FORWARD,POSTROUTING这几个chain有用,如果网卡名字使用+结尾,则任何一个使用该名字开头的都会match
--logical-out name
用来指示发送帧的逻辑网桥接口,这个选项在OUTPUT,FORWARD,POSTROUTING这几个chain有用,如果网卡名字使用+结尾,则任何一个使用该名字开头的都会match
-s,--source address[/mask]
源MAC地址,mask和地址都以6个十六进制数字以分号分开,也可以是其它格式,比如Unicast,Multicast,Broadcast,or BGA
-d --destination address[mask]
目的MAC地址,跟-s类似
-c,--set-counter pcnt bcnt
如果结合-A或者-l使用,规则的packet和byte计数会被设置成pcnt,后面没看懂
MATCH EXTENSIONS
ebtables扩展是被动态的加载到用户空间的工具,所以没有必要显示的使用-m选项来加载,这些扩展处理功能被内核核心ebtables代码支持。
802_3
可能用的比较少。
among
匹配一个MAC地址或者MAC/IP对,一组MAC地址或者MAC/IP对。list entry用如下格式:
xx:xx:xx:xx:xx:xx[=ip.ip.ip.ip][,],多个list项用逗号分开,指定IP地址和MAC地址对应关系是可选的,相同的MAC地址对应不同的IP地址可以被显示指定,如果MAC地址不匹配list里面的任何地址,frame则不匹配rule,如果用了!
--among-dst list
--among-srt list
--among-dst-file file
--among-src-file file
ARP
用来指定ARP或者RARP字段,这个协议必须是ARP或者RARP
--arp-opcode opcode
The (R)ARP opcode
--arp-htype hardware type
硬件类型,可以是十六进制或者ethernet字符串,
--arp-ip-src
--arp-ip-dst
--arp-mac-src
--arp-mac-dst
--arp-gratuitous
ip
ip6
limit
限速相关
mark-m
--mark[!][value][/mask]
用给定的mark value来匹配帧,如果value和mask都被指定,value和mask先计算逻辑与,再用来和指定的参数value mask比较,当只指定了value,则value相等就匹配成功,如果只指定了mask,则计算逻辑与,并且结果不能为0.
pkttype
--pkttype-type type
用来匹配帧的ethernet class,这个是通用网络code,可能的值是:broadcast,multicast,host
stp
用来指定stp的BPTU字段,目的地址-d必须被指定为bridget group address(BGA),对于所有的options。。。。
vlan
watcher extensions
只是用来监视passingby的帧,他们不会修改或者决定接收还是不接收这些帧,监视是在执行之前。
log
log watcher写一个帧的描述性的数据到syslog
。。。
nflog
tnflog监视是用来把packet传到已经加载的后端,这个通常是用来和nfnetlink_log一起协同工作,这个通常会通过一个网络链路socket把数据包传到多播的一个组,一个或者多个用户空间进程可以向这个组订阅数据包
--nflog
用默认的log参数
--nflog-group
指定组,默认是1
--nflog-prefix prefix
log前面加前缀,最多30个字符,用来区分不同的messages
--nflog-range size
定义拷贝到用户空间字节数,这个值会重写nfnetlink_log指定的值。
--nflog-threshold
设置内核队列大小,设置大了,到用户空间的包延迟会变大,同时也会减少每个数据包的开销
ulog
ulog监视器传递数据包到用户空间通过多播socket的logging守护,这个和logwatcher的不同在于:通过使用multicast socket把完整的数据包会发送到用户空间,这个监视器允许用户空间的程序分析数据包,物理网桥输入输出端口也被包含在netlink messages里面,当被加载到内核,ulog监视器模块接受2个参数:nlbufsiz指定每个netling 多播组的buffer,最多可以到128KB,这个buffer size是对每一个nlgroup设置的参数值,默认是4k,flushtimeout 表示一秒的几百分之一时间,这个队列会flushed一次,即使队列没有满,默认是10。
--ulog
用ulog的默认值
ulog-prefix="", ulog-nlgroup=1, ulog-cprange=4096, ulog-qthreshold=1.
--ulog-prefix
--ulog-nlgroup
--ulog-cprange range
定义拷贝到用户空间最大的数量
--ulog-qthreshold threshold
发送到用户空间之前最多缓存的包数,如果队列满了也会触发发送,时间到也会发送
TARGT EXTENSION
arpreply
arreply target可以用在nat表的PREROUTING chain里面,如果有arp请求,则会自动发RARP,可以指定MAC地址,协议必须是ARP,当ARP消息不是一个ARP请求或者ARP请求对应的ip地址不是以太网地址,则会忽略,如果ARP请求是畸形的,则会drop掉。
--arpreply-mac address
指定回复的MAC地址,以太网的源MAC和ARP的负载源MAC将会填这个address
--arpreply-target target
在发送了RARP之后,这个请求包接下来如何处理,默认是丢掉。
dnat
dnat只能用在:broute表的BROUTINGchain,nat表的PREROUTING和OUTPUTchain。用来指明目的MAC地址必须被改变。
--to-destination address
改变address的目的MAC地址
--dnat-target target
指定接下来怎么做
mark
mark target可以用在任何表的任何chain里面,mark可以用在ebtables和iptables,如果bridge-nf code被编进了内核,在同一个地方做mark,这个是ebtables和iptables通信的一种方式。
--mark-set value
对帧用value做mark
--mark-or value
对frame做Or运算,是对原有的mark值做or还是对包做or?
--mark-and value
--makr-xor value
--mark-target
指定规则,默认是accept。
redirect
redirect target会改变MAC target地址为帧到来的网桥地址。
snat
snat target只能用在nat表的POSTROUTNG chain,它指明sourceMAC地址被改变
--to-source address
改变source mac地址为指定的地址
--snat-target target
--snat-arp
同时改变arp头的源地址