ILD

ebtables学习
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2021-12-21 站点:Inside Linux Development

ebtables是运行在bridge的防火墙。和iptables一样,它通过3个层级管理rules。table->chain->rule。


table

支持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

chain包含有序的能匹配帧的rules的列表。如果一个rule匹配到一个以太帧,那么它的处理部分决定如何处理这个帧。如果rule不匹配帧,那么下一个rule将会被检查。


用户可以创建新的chain。并且可以把这个chain当成一个rule的target。这样的跳转机制,相对线性遍历有更好的性能。而且可以把rules结构化,更便于维护。


Targets

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部分。


查看rules

语法:

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。


增改删插rule

语法

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 SPECIFICATIONS

这些规范,用来指定如何匹配以太帧,用在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地址。


MATCH EXTENSIONS

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中,可以进行匹配。


WATCHER EXTENSIONS

Watchers记录通过的帧,而不修改它们,也不决定是接收和是丢弃。如果帧匹配rule的话,watchers只是观察到帧,而且在target被执行之前看到。


log

    将帧的描述数据写入到syslog。


    --log-ip

    

    其它log选项,查看man ebtables。


nflog

    将包通过netlink套接字多播给用户态程序。和nfnetlink_log配合使用。


TARGET EXTENSIONS

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,也被允许。


添加chain

命令:

    -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


删除chain

命令:

-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


重命名chain

命令:

-E, --rename-chain


修改chain的名字,内置chain的名字也可以修改。


语法:

ebtables [-t table] -E <old name> <new name>


示例1:将nat表的PREROUTING改为PREFORWARDING

ebtables -t nat -E PREROUTING PREFORWARDING


修改chain policy

命令:

    -P, --policy


语法:

ebtables [-t table] -P <chain> <policy>


policy可以是ACCEPT, DROP 或者 RETURN。可以修改内置或用户定义的chain。


例子:

ebtables -t broute -P BROUTING DROP


复位table

命令:

--init-table


将当前table内容替换为默认的table内容。注意也是针对某个tables操作的,不能对所有table一次性操作。


语法:

ebtables [-t table] --init-table


示例1:删除所有的broute表的内容,恢复成默认:

ebtables -t broute --init-table


保存初始化table

命令:

--atomic-init


将默认table内容保存到文件


语法:

ebtables [-t table ] [--atomic-file file] --atomic-init

保存当前table

命令:

--atomic-save


将当前tables的内容保存到文件,以便后续commit用。


语法:

ebtables [-t table ] [--atomic-file file] --atomic-save


从文件加载table

命令:

--atomic-commit


从文件加载table内容。


语法:

ebtables [-t table ] [--atomic-file file] --atomic-commit


更新table文件

命令:

 --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指定。


MISCELLANOUS COMMANDS

-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


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.