Ebtables基础
Ebtables基础
ebtables是Linux系统中用于管理网桥流量的重要工具,它通过定义复杂的规则集来控制数据包的转发和过滤。本文将详细介绍ebtables的基础知识,包括其规则组成、表、链、条件、动作等核心概念,并通过多个具体示例展示如何使用ebtables进行网络流量管理。
ebtables规则简介
ebtables规则由多个组成部分构成,用于定义如何处理经过网桥的数据包。以下是ebtables规则的主要组成部分:
表(Table)
filter表
- 功能:用于过滤本机流入和流出的数据包。它是默认使用的表,如果不指定表类型,默认就是filter表。
- 链:包含三个内置链:
nat表
- 功能:用于地址转换,主要是在MAC层进行地址转换。
- 链:包含三个内置链:
broute表
- 功能:用于实现一个brouter(桥路由器),决定数据包是进行桥接转发还是路由转发。
- 链:只有一个内置链:
- 特殊动作:
这些表和链的组合使得ebtables能够灵活地管理和控制网络流量,特别是在桥接环境中。
链(Chain)
filter表:
INPUT:处理发给网桥自己的帧。
OUTPUT:处理本地产生或通过broute转发的帧。
FORWARD:处理被网桥转发的帧。
nat表:
PREROUTING:在帧刚收到时进行修改。
OUTPUT:在进行桥FDB转发决定之前修改本地产生的或broute的帧。
POSTROUTING:修改即将出去的帧。
broute表:
BROUTING:决定数据包是进行桥接还是路由。
条件(Match)
- 源/目的MAC地址:指定数据包的源或目的MAC地址。
- 源/目的IP地址:指定数据包的源或目的IP地址(如果数据包是IP数据包)。
- 协议类型:指定数据包的协议类型(如IP、ARP、RARP等)。
- 源/目的端口:指定数据包的源或目的端口号(对于IP数据包)。
- VLAN标签:指定数据包的VLAN标签信息。
- 其他条件:如数据包长度、帧类型等。
动作(Target)
- ACCEPT:接受数据包,继续处理。
- DROP:丢弃数据包。
- LOG:记录数据包信息到日志。
- REDIRECT:将数据包重定向到指定的接口。
- SNAT:修改源MAC地址。
- DNAT:修改目的MAC地址。
- 其他动作:如MARK、CLASSIFY等。
优先级(Priority)
- 规则的顺序决定了数据包的处理顺序。可以使用优先级来调整规则的顺序。
示例规则
etbales nat表postrouting链做源mac地址转换
ebtables -t nat -A POSTROUTING -o eth0 -p ip -j snat --snat-arp --to-src 00:11:22:33:44:55
- 表:nat
- 链:POSTROUTING
- 条件:
- 接口:eth0
- 协议:IP
- 动作:SNAT
- 动作参数:修改源MAC地址为00:11:22:33:44:55
通过这些组成部分,ebtables规则可以灵活地定义如何处理经过网桥的数据包,实现复杂的网络流量管理功能。
ebtables nat表PREROUTING链来做目的MAC地址转换
假设我们有以下网络环境:
- 一个网桥br0,连接了两个虚拟机VM1和VM2。
- VM1的MAC地址是00:11:22:33:44:55。
- VM2的MAC地址是00:66:77:88:99:AA。
- 我们希望所有发往VM1的流量都被转发到VM2。
为了实现这个目标,我们可以在br0上使用ebtables进行目的MAC地址转换。
ebtables -t nat -A PREROUTING -i br0 -d 00:11:22:33:44:55 -j mac --mac-dst 00:66:77:88:99:AA
这条命令的含义如下:
- -t nat:指定使用nat表。
- -A PREROUTING:在PREROUTING链上添加规则。
- -i br0:指定规则应用于br0网桥的入站流量。
- -d 00:11:22:33:44:55:匹配目的MAC地址为00:11:22:33:44:55(VM1的MAC地址)的帧。
- -j mac:指定执行MAC地址转换。
- –mac-dst 00:66:77:88:99:AA:将目的MAC地址修改为00:66:77:88:99:AA(VM2的MAC地址)。
阻止特定MAC地址的设备访问网络
假设我们想要阻止具有特定MAC地址00:AA:BB:CC:DD:EE的设备访问网络,可以添加以下规则:
ebtables -A INPUT -p IPv4 --mac-src 00:AA:BB:CC:DD:EE -j DROP
这条命令的含义如下:
- -A INPUT:在filter表的INPUT链上添加规则。
- -p IPv4:指定规则仅适用于IPv4流量。
- –mac-src 00:AA:BB:CC:DD:EE:匹配源MAC地址为00:AA:BB:CC:DD:EE的帧。
- -j DROP:丢弃匹配的帧。
允许特定MAC地址的设备访问网络
如果我们只允许具有特定MAC地址00:11:22:33:44:55的设备访问网络,可以添加以下规则:
ebtables -A INPUT -p IPv4 --mac-src 00:11:22:33:44:55 -j ACCEPT
ebtables -A INPUT -p IPv4 -j DROP
这两条命令的含义如下:
- 第一条命令允许源MAC地址为00:11:22:33:44:55的IPv4流量。
- 第二条命令丢弃所有其他IPv4流量。
限制特定IP地址的设备通过网桥
假设我们想要限制IP地址为192.168.1.100的设备通过网桥br0,可以添加以下规则:
ebtables -t broute -A BROUTING -i br0 --ip-dst 192.168.1.100 -j DROP
这条命令的含义如下:
- -t broute:指定使用broute表。
- -A BROUTING:在BROUTING链上添加规则。
- -i br0:指定规则应用于br0网桥的入站流量。
- –ip-dst 192.168.1.100:匹配目的IP地址为192.168.1.100的帧。
- -j DROP:丢弃匹配的帧。
记录特定MAC地址的设备访问网络
如果我们想要记录具有特定MAC地址00:AA:BB:CC:DD:EE的设备访问网络的行为,可以添加以下规则:
ebtables -A INPUT -p IPv4 --mac-src 00:AA:BB:CC:DD:EE -j LOG
这条命令的含义如下:
- -A INPUT:在filter表的INPUT链上添加规则。
- -p IPv4:指定规则仅适用于IPv4流量。
- –mac-src 00:AA:BB:CC:DD:EE:匹配源MAC地址为00:AA:BB:CC:DD:EE的帧。
- -j LOG:记录匹配的帧。
ebtables的hook点与遍历过程
Netfilter在链路层(L2)提供了以下6个hook点:其中NF_BR_BROUTING不是通过调用netfilter框架的register函数来进行HOOK的回调注册的。
#include <uapi/linux/netfilter_bridge.h>
#define NF_BR_PRE_ROUTING 0
#define NF_BR_LOCAL_IN 1
#define NF_BR_FORWARD 2
#define NF_BR_LOCAL_OUT 3
#define NF_BR_POST_ROUTING 4 /* Not really a hook, but used for the ebtables broute table */
#define NF_BR_BROUTING 5
NF_BR_PRE_ROUTING: 在网卡混杂模式drop之后,进行checksum校验。
NF_BR_LOCAL_IN: 数据包的目的MAC是本地box。
NF_BR_FORWARD: 数据包的目的MAC是桥的另一个接口。
NF_BR_LOCAL_OUT: 本机产生的数据包。
NF_BR_POST_ROUTING: 数据包即将发送出去。
NF_BR_BROUTING: 并不是真正的hook,被ebtables的broute表所使用的。