ebtables是运行在bridge的防火墙。和iptables一样,它通过3个层级管理rules。table->chain->rule。
支持3个table。filter/nat/broute。filter是默认table。每个table都有built-in chains。
filter表
包含3个内置chain。INPUT(发给桥自己的帧)。OUTPUT(本地产生或者brouted的帧)。FORWARD(桥转发的帧)。
nat表
主要用来改变mac地址,包含3个内置chain。PREROUTING(在帧刚收到的时候修改)。OUTPUT(在进行桥fdb转发决定之前修改本地产生的或brouted的帧)。POSTROUTING(修改即将出去的帧)。
broute表
用来实现一个brouter。它只有一个内置chain。BROUTING。和nat的PREROUTING处于一个hook点,且优先级高于nat的PREROUTING。这个表的DROP和ACCEPT有特殊的含义。DROP表示帧要被route。ACCEPT表示帧要被bridge。
chain包含有序的能匹配帧的rules的列表。如果一个rule匹配到一个以太帧,那么它的处理部分决定如何处理这个帧。如果rule不匹配帧,那么下一个rule将会被检查。
用户可以创建新的chain。并且可以把这个chain当成一个rule的target。这样的跳转机制,相对线性遍历有更好的性能。而且可以把rules结构化,更便于维护。
firewall rule的target即frame processing specification,当一个帧匹配后,内核接下来执行的动作是通过target指定的。
target可以是:ACCEPT, DROP, CONTINUE, RETURN, 'extension', jump to a user-defined chain
ACCEPT,让帧通过。DROP,把帧丢掉。CONTINUE,继续检查下一个rule。RETURN,从chain返回。
extension可以查看TARGET EXTENSIONS部分。
语法:
ebtables [-t table ] -L [-Z] [chain] [ [--Ln] | [--Lx] ] [--Lc] [--Lmac2]
注意:所有的修改、查看命令,没有指定-t table,则默认为filter表。
-L, --list
列出chain的所有rules,如果没有指定chain,则列出所有chain的rules。
-Z, --zero
将选定chain的计数清零。和-L配合使用时,先打印计数,再清零。
--Ln
打印rule number。
--Lc
显示rule匹配到的计数。
--Lx
产生命令样式的输出,可以用来构建chain的内容,如果没有指定chain,则构建响应的table。
生成内容可用于启动或reload脚本。
--Lmac2
显示mac地址时,增加前导0。
语法
ebtables [-t table ] -[ACDI] chain rule specification [match extensions] [watcher extensions] target
-A, --apend
将rule插入到chain的末尾。
-A chain [rule specification] [match extensions] [watcher extensions] target
-D, --delete
删除rule。有两种删除方法,
1 通过rule number,格式,start_nr[:end_nr]。删除单条或一个范围。
有冒号,没有end_nr时,从start开始的所有rule都被删除。负数也允许,见-I。
2 通过指定跟rule被添加的时候一样的完整的rule。只删除第一个匹配得rule。
-D chain start[:[end]]
-D chain [rule specification] [match extensions] [watcher extensions] target
-C, --change-counters
改变rule的计数。有两种方法,rule number和严格匹配。和-D一样。
计数是绝对数字,也是可以相对数字,相对数字前面用+或者-。
数字放在rule number或者-C之后。
-C chain start[:[end]] <pcnt> <bcnt>
-C chain <pcnt> <bcnt> [rule specification] [match extensions] [watcher extensions] target
-I, --insert
插入rule。需要指定rule number,如果没有指定,则插入到chain的头。
如果chain当前有N条rule。则数字可以为-N到N+1。
如果数字是0或负数,则插入到倒数第i个(N+1-i)。所以0,插入为最后一个,等价于-A。
-I <chain> <rule number> [rule specification] [match extensions] [watcher extensions] target
插入两条完全一样的rule是合法的,删除和修改计数时,如果是严格匹配,那么只匹配到第一条。
追加示例:
ebtables -t broute -A BROUTING -p IPv4 --ip-dst 192.168.161.192 -j redirect --redirect-target DROP
删除示例:
ebtables -t broute -D BROUTING -p IPv4 --ip-dst 192.168.168.192 -j redirect --redirect-target DROP
删除第二个rule。
ebtables -t broute -D BROUTING 2
删除第二个到最后
ebtables -t broute -D BROUTING 2:
删除第一个到倒数第二个
ebtables -t broute -D BROUTING 1:-2
插入示例:
ebtables -t broute -I BROUTING -1 -p IPv4 --ip-dst 192.168.161.198 -j redirect --redirect-target DROP
-1表示插入为倒数第二个,N+1-1=N。插入后为第N,所以为倒数第二。0为倒数第一。
修改计数示例:
ebtables -t broute -C BROUTING +100 +200 -p IPv4 --ip-dst 192.168.161.198 -j redirect --redirect-target DROP
ebtables -t broute -C BROUTING 1 +100 +200
这些规范,用来指定如何匹配以太帧,用在rule的增删等命令。有以下标准的rule specifications。在选项值前面加上 ! 表示非。
-p, --protocol [!] protocol
指定匹配的协议。可以是数字,也可以是名字,见/etc/ethertypes。
-i, --in-interface [!] name
收到帧的接口(bridge port)名字,可以结尾可以使用+,匹配多个接口如eth+,wl+。
用在INPUT/FORWARD/PREROUTING/BROUTING chain。
--logical-in [!] name
收到帧的桥的名字。用在INPUT/FORWARD/PREROUTING/BROUTING chain
-o, --out-interface [!] name
帧要发送的接口(bridge port)。
用在OUTPUT/FORWARD/POSTROUTING chain
--logical-out [!] name
接受帧的桥的名字。用在OUTPUT/FORWARD/POSTROUTING chain
-s, --source [!] address[/mask]
源mac地址,地址和掩码都是冒号分开的6个16进制数字。
还可以是Unicast, Multicast, Broadcast or BGA (Bridge Group Address)。
-d, --destination [!] address[/mask]
目的mac地址。
ebtables extension是自动加载到用户态工具的,不需要像iptables一样显示的使用-m选项加载。
下面挑一些比较重要的扩展。
ip
指定IPv4 fields。protocol必须指定为IPv4
--ip-source [!] address[/mask]
源ip
还有目的ip,ip协议,目的端口,源端口等。具体请参考man ebtables。
mark_m
--mark [!] [value][/mask]
匹配帧的mark。mark是使用mark target设置的。在后续的rule中,可以进行匹配。
Watchers记录通过的帧,而不修改它们,也不决定是接收和是丢弃。如果帧匹配rule的话,watchers只是观察到帧,而且在target被执行之前看到。
log
将帧的描述数据写入到syslog。
--log-ip
其它log选项,查看man ebtables。
nflog
将包通过netlink套接字多播给用户态程序。和nfnetlink_log配合使用。
target扩展,可以让匹配得rule执行一个特定的动作。语法:
-j <target extension> [target extension arguments]
例如:
-j redirect --redirect-target DROP
arpreply
用在nat表的PREROUTING。如果这个目标看到一个ARP请求,自动回复一个ARP reply。
ARP的mac地址可以指定。
--arpreply-mac address
指定回复的ARP的mac地址。
--arpreply-target target
回复之后,ebtables的动作,默认是DROP。
dnat
用来修改目的mac地址。
只有broute表的BROUTING chain。nat表的PREROUTING和OUTPUT chain能使用。
--to-destination address
指定修改后的mac地址。
--dnat-target target
指定标准的target。在完成dnat之后,rule还得给出一个标准的target,
以便ebtables知道如何处理dnat之后的帧。默认是ACCEPT。此时不继续遍历rule。
如果是CONTINUE,可以继续编译rule,这样可以做到多个target。
使用DROP只有在brouting chain才有意义,但是这种情况下,使用redirect target更符合逻辑。
mark
mark targe可以用在所有table的任何chain。用来设置mark值。
如果bridge-nf编译进内核。iptables和ebtables的mark存放在同样的地方,因此可以共享。
--mark-set value
--mark-or value
--mark-and value
--mark-xor value
--mark-target target
redirect
改变目的mac为桥设备的mac地址,以便帧转发给本地桥。
只能用在broute表的BROUTING chain。nat表的PREROUTING chain。
在BROUTING chain中,mac地址修改为bridge port的mac地址。
在PREROUTING chain中,mac地址修改为bridge的mac地址。
--redirect-target target
指定redirect之后标准的target。默认是ACCEPT。CONTINUE可以使用多个target。RETURN也是允许的。
snat
只能用在nat表的POSTROUTING chain中,用来修改源mac地址。
--to-source address
指定要改成的mac地址。
--snat-arp
如果是arp包,也修改arp头中的hardware source address。
--snat-target target
指定完成snat之后的标准目标。默认是ACCEPT。CONTINUE可以使用多个target extensions。
DROP是没有意义的,但是仍然允许这么做。RETURN,也被允许。
命令:
-N, --new-chain
创建用户定义的chain。名字最长为31个字符。默认的policy是ACCEPT。
可以和-P一起使用,来创建chain,并指定policy。此时-P不需要再指定 chain。
语法:
ebtables [-t table] -N <chain> [-P <policy>]
示例:
1 创建一个chain,使用默认的ACCEPT policy
ebtables -t filter -N chain1
2 创建一个chain,指定policy为DROP
ebtables -t filter -N chain2 -P DROP
命令:
-X, --delete-chain
删除用户定义的chain。如果有其它rule引用(jump)这个chain,那么ebtables将拒绝删除它。
如果没有指定chain,所有未被引用的chain都将被删除。
语法:
ebtables [-t tables] -X [chain]
示例1:删除用户chain1
ebtables -t filter -X chain1
示例2:删除所有未被引用的用户chain
ebtables -t filter -X
命令:
-E, --rename-chain
修改chain的名字,内置chain的名字也可以修改。
语法:
ebtables [-t table] -E <old name> <new name>
示例1:将nat表的PREROUTING改为PREFORWARDING
ebtables -t nat -E PREROUTING PREFORWARDING
命令:
-P, --policy
语法:
ebtables [-t table] -P <chain> <policy>
policy可以是ACCEPT, DROP 或者 RETURN。可以修改内置或用户定义的chain。
例子:
ebtables -t broute -P BROUTING DROP
命令:
--init-table
将当前table内容替换为默认的table内容。注意也是针对某个tables操作的,不能对所有table一次性操作。
语法:
ebtables [-t table] --init-table
示例1:删除所有的broute表的内容,恢复成默认:
ebtables -t broute --init-table
命令:
--atomic-init
将默认table内容保存到文件
语法:
ebtables [-t table ] [--atomic-file file] --atomic-init
命令:
--atomic-save
将当前tables的内容保存到文件,以便后续commit用。
语法:
ebtables [-t table ] [--atomic-file file] --atomic-save
命令:
--atomic-commit
从文件加载table内容。
语法:
ebtables [-t table ] [--atomic-file file] --atomic-commit
命令:
--atomic-file file
在rule,chain的维护命令中,将命令保存到文件中,而不是直接生效。
table的内容也是先从文件读取,更新后保存回文件。
这样我们可以先将所有的rule和chain生成到文件,然后使用--atomic-commit命令,一次性生效。
语法:
ebtables [-t table] <--atomic-file file> <rule command|chain command>
除了使用命令行参数--atomic-file file指定外,还可以通过环境变量EBTABLES_ATOMIC_FILE指定。
-V
打印ebtables用户态程序的版本。
-h, --help [list of module names]
给出简短帮助文档,如果指定了扩展模块,还会额外打印扩展模块的使用帮助。
示例:在帮助文档中,打印ip扩展匹配模块的选项信息:
ebtables -h ip
-j, --jump target
指定rule的target。
-M, --modprobe program
和内核通信时,使用指定的程序加载缺失的内核模块。
--concurrent
在操作时,采用文件锁,防止并行更新ebtables。
例如:
ebtables -t filter -N chain1 --concurrent
放在前面也可以:
ebtables --concurrent -t filter -N test
参考
https://linux.die.net/man/8/ebtables
源码下:man ./ebtables.8
系统shell:man ebtables