问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Ebtables基础

创作时间:
作者:
@小白创作中心

Ebtables基础

引用
CSDN
1.
https://blog.csdn.net/yellow1988/article/details/144974915

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表所使用的。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号