ebtables  和 iptables 一样,主要是做数据包过滤的配置工具,  ebtables  主要工作在数据链路层, iptables主要工作IP层和第四层应用层,他们主要做配置工具,底层的数据包过滤机制还是在 netfilter  核心工作组

   和iptables  一样,  ebtables 也有表,链和动作的概念

   ebtables 有三张表,五条链和四个动作,支持自定义链,(需要 -j  链表名跳转到具体的链路)

三张表:  filter:     默认过滤表,一些常规的数据包过滤配置,包含INPUT,OUTPUT, FORWARD

                nat:       进行nat 变换的表,更改源,目的的mac地址,  PREROUTING(用来做snat),POSTROUTING(用来做dnat) ,OUTPUT

                broute:  对网桥过滤表的标记,只有一个链表 BROUTING.

   

链的过滤时机:

  • prerouting:数据进来还未查询路由表之前的规则。
  • input:由外部发往用户空间内部的规则。(
    说直白点就是负责过滤目标地址是本机的数据包)
  • forward:不进入用户空间,进行路由转发的规则。(负责转发流经主机但不进入本机的数据包)
  • postrouting:查询完路由表后,将要转发的规则。
  • output:由用户空间内部发往外部的规则。(负责处理本机发出的数据包)

过滤的动作:

  1. ACCEPT:意味着让一个帧通过
  2. DROP:意味着帧已经被dropped。注意:在BROUTING chain中,1、2有特殊的意思
  3. CONTINUE:意味着下一个规则(rule)将被检查
  4. RETURN:意味着停止遍历此链,并在前一个调用链的下一条规则中恢复。其实就是退出,和代码中的
    continue差不多,这里就是退出在此链继续遍历,直接进行后续操作
     (详见下文使用场景中的ruturn使用)

 常用命令:

Ebtables使用规则如下:
ebtables [-t table] -[ADI] chain rule-specification [match-extensions] [watcher-extensions]
-t table :一般为FORWARD链。
-ADI:A添加到现有链的末尾;D删除规则链(必须指明规则链号);I插入新的规则链(必须指明规则链号)。
-P:规则表的默认规则的设置。可以DROP,ACCEPT,RETURN。
-F:对所有的规则表的规则链清空。
-L:指明规则表。可加参数,--Lc,--Ln
-p:指明使用的协议类型,ipv4,arp等可选(使用时必选)详情见/etc/ethertypes
--ip-proto:IP包的类型,1为ICMP包,6为TCP包,17为UDP包,在/etc/protocols下有详细说明
--ip-src:IP包的源地址
--ip-dst:IP包的目的地址
--ip-sport:IP包的源端口
--ip-dport:IP包的目的端口
-i:指明从那片网卡进入
-o:指明从那片网卡出去

Ebtables基本命令
有了上面的简单介绍,再熟悉一些基本命令就可以使用了。
1. 列表:
ebtables -L
ebtables -L –Lc , 查看各rule的匹配次数以及字节数
2. 新建/删除链
ebtables -N 
ebtables -X 
3. 新建规则
ebtables -A  [ rules ]
[rules]有几种
-s 源MAC -d 目标MAC -i 入接口 -o 出接口

 

高级功能

把内核初始化的表的原始数据复制到指定的文件,可用于包过滤分析

--init-table     

--atomic-init

--atomic-save

--atomic-commit

 

SNAP协议802.3的 DSAP 和SSAP 属性的匹配

--802_3-sap

--802_3-type

 

among   将arp与mac地址进行匹配

--among-dst [!] list

--among-src [!] list

--among-dst-file [!] file

--among-src-file [!] file

 

arp

--arp-opcode [!] opcode

--arp-htype [!] hardware type

--arp-ptype [!] protocol type

--arp-ip-src [!] address[/mask]

--arp-ip-dst [!] address[/mask]

--arp-mac-src [!] address[/mask]

--arp-mac-dst [!] address[/mask]

--arp-gratuitous

 

使用限制

limit      包转发速率

--limit       

--limit-burst      包突发速率

 

标记

--mark

 

pkttype

--pkttype-type    数据包可以是 broadcast , multicast, host, otherhost

 

stp

--stp-type   bgpu  报文类型     0-255       配置bpdu=0,  tc BPDU=128

--stp-flags   拓扑变化的标志     tc=1   tca=128

--stp-root-prio    根优先级

--stp-root-addr   根mac 地址

--stp-root-cost   根路径开销

--stp-sender-prio     bpdu 发送优先级

--stp-sender-addr    bpdu 发送mac地址

--stp-port      bpdu端口标记

--stp-msg-age 

--stp-max-age 

--stp-hello-time 

--stp-forward-delay     转发延迟

vlan

802.1Q 标记控制信息属性.  802_1Q (0x8100).

--vlan-id   

--vlan-prio  vlan 优先级  0-7  

--vlan-encap   以太网类型   以太网协议和类型见下表

EtherType

Protocol

0x0800

Internet Protocol version 4 (IPv4)

0x0806

Address Resolution Protocol (ARP)

0x0842

Wake-on-LAN[7]

0x22F3

IETF TRILL Protocol

0x6003

DECnet Phase IV

0x8035

Reverse Address Resolution Protocol

0x809B

AppleTalk (Ethertalk)

0x80F3

AppleTalk Address Resolution Protocol (AARP)

0x8100

VLAN-tagged frame (IEEE 802.1Q) and Shortest Path Bridging IEEE 802.1aq[8]

0x8137

IPX

0x8204

QNX Qnet

0x86DD

Internet Protocol Version 6 (IPv6)

0x8808

Ethernet flow control

0x8819

CobraNet

0x8847

MPLS unicast

0x8848

MPLS multicast

0x8863

PPPoE Discovery Stage

0x8864

PPPoE Session Stage

0x8870

Jumbo Frames (proposed)[2][3]

0x887B

HomePlug 1.0 MME

0x888E

EAP over LAN (IEEE 802.1X)

0x8892

PROFINET Protocol

0x889A

HyperSCSI (SCSI over Ethernet)

0x88A2

ATA over Ethernet

0x88A4

EtherCAT Protocol

0x88A8

Provider Bridging (IEEE 802.1ad) & Shortest Path Bridging IEEE 802.1aq[9]

0x88AB

Ethernet Powerlink[citation needed]

0x88CC

Link Layer Discovery Protocol (LLDP)

0x88CD

SERCOS III

0x88E1

HomePlug AV MME[citation needed]

0x88E3

Media Redundancy Protocol (IEC62439-2)

0x88E5

MAC security (IEEE 802.1AE)

0x88E7

Provider Backbone Bridges (PBB) (IEEE 802.1ah)

0x88F7

Precision Time Protocol (PTP) over Ethernet (IEEE 1588)

0x88FB

Parallel Redundancy Protocol (PRP)

0x8902

IEEE 802.1ag Connectivity Fault Management (CFM) Protocol / ITU-T Recommendation Y.1731 (OAM)

0x8906

Fibre Channel over Ethernet (FCoE)

0x8914

FCoE Initialization Protocol

0x8915

RDMA over Converged Ethernet (RoCE)

0x891D

TTEthernet Protocol Control Frame (TTE)

0x892F

High-availability Seamless Redundancy (HSR)

0x9000

Ethernet Configuration Testing Protocol[10]

 检测日志匹配:

--log
 Log with the default loggin options: log-level= info, log-prefix="", no ip logging, no arp logging.
--log-level "level"   定义日志级别, 可能的值查看  ebtables -h log   默认 info
--log-prefix text    日志名称    29个char 以内
--log-ip     ip信息放入日志
--log-ip6
--log-arp  arp 信息放入日志
 
 
nflog
--nflog
--nflog-group
--nflog-prefix 
--nflog-range 
--nflog-threshold 
ulog
--ulog
--ulog-prefix 
--ulog-nlgroup --ulog-cprange 
--ulog-qthreshold 
 
arp 回复匹配
arpreply    
--arpreply-mac
--arpreply-target    默认 drop
 
dnat
--to-destination address
--dnat-target targ    ACCEPT     CONTINUE    DROP     BROUTING    RETURN 
 
mark
--mark-set value
--mark-or value
--mark-and value
--mark-xor value
--mark-target         ACCEPT     CONTINUE 
 
redirect
--redirect-target                ACCEPT     CONTINUE    DROP     BROUTING    RETURN 
 
snat
--to-source address
--snat-target     ACCEPT     CONTINUE    DROP     BROUTING    RETURN 
--snat-arp

命令使用规范:

ebtables [-t table ] -[ACDI] chain rule specification [match extensions] [watcher extensions] target 
ebtables [-t table ] -P chain ACCEPT | DROP | RETURN 
ebtables [-t table ] -F [chain] 
ebtables [-t table ] -Z [chain] 
ebtables [-t table ] -L [-Z] [chain] [ [--Ln] | [--Lx] ] [--Lc] [--Lmac2] 
ebtables [-t table ] -N chain [-P ACCEPT | DROP | RETURN] 
ebtables [-t table ] -X [chain] 
ebtables [-t table ] -E old-chain-name new-chain-name 
ebtables [-t table ] --init-table 
ebtables [-t table ] [--atomic-file file] --atomic-commit 
ebtables [-t table ] [--atomic-file file] --atomic-init


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

 

部分配置举例:

 

基本配置:   未指定表,默认 filter表

ebtables -P FORWARD DROP                       #FORWARD 链清除所有配置
ebtables -A FORWARD -p IPv4 -j ACCEPT          #FORWARD 链 ipv4包放行 
ebtables -A FORWARD -p ARP -j ACCEPT           #FORWARD 链 arp包放行 
ebtables -A FORWARD -p LENGTH -j ACCEPT        #旧机器使用以太网帧的协议字段作为长度字段(802.2,802.3),放行
ebtables -A FORWARD --log-level info --log-ip --log-prefix EBFW  #FORWARD 链日志配置,ipv4, arp信息放入日志
ebtables -P INPUT DROP    #INPUT  链清除所有配置
ebtables -A INPUT -p IPv4 -j ACCEPT    #INPUT 链 ipv4包放行
ebtables -A INPUT -p ARP -j ACCEPT     #INPUT 链 arp包放行
ebtables -A INPUT -p LENGTH -j ACCEPT  #旧机器使用以太网帧的协议字段作为长度字段(802.2,802.3),放行
ebtables -A INPUT --log-level info --log-ip --log-prefix EBFW  #INPUT链日志配置
ebtables -P OUTPUT DROP         
ebtables -A OUTPUT -p IPv4 -j ACCEPT
ebtables -A OUTPUT -p ARP -j ACCEPT
ebtables -A OUTPUT -p LENGTH -j ACCEPT  #旧机器使用以太网帧的协议字段作为长度字段(802.2,802.3),放行
ebtables -A OUTPUT --log-level info --log-ip --log-arp --log-prefix EBFW -j DROP


ip  与mac 匹配规则


ebtables -A FORWARD -p IPv4 --ip-src 172.16.1.4 -s ! 00:11:22:33:44:55 -j DROP #ip为172.16.1.4,mac若不为0011-2233-445 则数据包丢弃
iptables -A FORWARD -s 172.16.1.4 -m mac ! --mac-source 00:11:22:33:44:55 -j DROP  #iptables 的方法,与ebtables实现一样
ebtables -N MATCHING-MAC-IP-PAIR    #创建一个新链
ebtables -A FORWARD -p IPv4 --among-dst 00:11:22:33:44:55=172.16.1.4,00:11:33:44:22:55=172.16.1.5 \
-j MATCHING-MAC-IP-PAIR       #转发链中匹配  0011-2233-4455=172.16.1.4  0011-3344-2255 匹配172.16.1.5


mac地址的dnat


ebtables -t nat -A PREROUTING -d 00:11:22:33:44:55 -i eth0 -j dnat --to-destination 54:44:33:22:11:00     #prerouting链将进入eth0接口的0011-2233-4455的mac地址改为 5444-3322-1100


IPV4 部分包通过
ebtables -A FORWARD -s 00:11:22:33:44:55 -p IPV4 -j ACCEPT  #FORWARD链中 0011-2233-4455 协议为ipv4的包转发
ebtables -A FORWARD -s 00:11:22:33:44:55 -j DROP  #其余包禁止通过


网桥部分匹配举例:


ifconfig br0 0.0.0.0     #网桥不配置ip
ifconfig eth0 172.16.1.1 netmask 255.255.255.0   #eth0接口配置172.16.1.1/24
ifconfig eth1 172.16.2.1 netmask 255.255.255.0   #eth1接口配置172.16.2.1/24
ebtables -t broute -A BROUTING -p ipv4 -i eth0 --ip-dst 172.16.1.1 -j DROP  #brouteb表 BROUTING链中到172.16.1.1 接口为eth0的ipv4包丢弃
ebtables -t broute -A BROUTING -p ipv4 -i eth1 --ip-dst 172.16.2.1 -j DROP #brouteb表 BROUTING链中到172.16.2.1 接口为eth1的ipv4包丢弃
ebtables -t broute -A BROUTING -p arp -i eth0 -d $MAC_OF_ETH0 -j DROP  #brouteb表 BROUTING链中到eth0 mac地址的arp包丢弃
ebtables -t broute -A BROUTING -p arp -i eth1 -d $MAC_OF_ETH1 -j DROP  #brouteb表 BROUTING链中到eth1 mac地址的arp包丢弃
ebtables -t broute -A BROUTING -p arp -i eth0 --arp-ip-dst 172.16.1.1 -j DROP #brouteb表 BROUTING链中到eth0 172.16.1.1 ip地址的arp包丢弃
ebtables -t broute -A BROUTING -p arp -i eth1 --arp-ip-dst 172.16.2.1 -j DROP #brouteb表 BROUTING链中到eth1 172.16.2.1 ip地址的arp包丢弃


转发配置举例:
ebtables -t broute -A BROUTING -i eth0 -p ipv4 -j redirect --redirect-target DROP  #brouteb表 BROUTING链中进入eth0 的ipv4包转发丢弃
ebtables -t nat -A PREROUTING --logical-in br0 -p ipv4 -j redirect --redirect-target ACCEPT #nat表 PREROUTING链,到网桥br0 的ipv4 包转发放行


转发数据包存储文件


ebtables --atomic-file nat_table -t nat --atomic-save  #nat表中转发包保存在文件名为nat_table的表中
ebtables -t nat --atomic-file nat_table -Z   #nat表中文件名为 nat_table的文件清空
ebtables --atomic-file nat_table -t nat --atomic-commit  
export EBTABLES_ATOMIC_FILE=nat_table
ebtables -t nat --atomic-init   #nat表文件初始化
ebtables -t nat -A PREROUTING -j DROP  #经过nat表 prerouting链的包丢弃
ebtables -t nat -L --Lc --Ln    #查看nat表规则
ebtables -t nat --atomic-commit #nat表文件提交
unset EBTABLES_ATOMIC_FILE    #环境变量删除


# brctl   相关配置


brctl addbr br0
brctl stp br0 off
brctl addif br0 eth0
ifconfig br0 172.16.1.10 netmask 255.255.255.0
ifconfig eth0 0.0.0.0
route del -net 172.16.1.0 netmask 255.255.255.0 dev eth0
route add -net 172.16.1.0 netmask 255.255.255.0 dev br0
route del default gateway $DEFAULT_GW dev eth0
route add default gateway $DEFAULT_GW dev br0


ebtables -t broute -A BROUTING -d $MAC_OF_BR0 -p ipv4 -j redirect --redirect-target DROP  #到网桥mac地址ipv4包丢弃ebtables -t nat -A PREROUTING -p arp --arp-opcode Request -j arpreply --arpreply-mac 10:11:12:13:14:15 
--arpreply-target ACCEPT       #nat表 prerouting链中,arp 回复 mac地址为1011-1213-1415 的数据包接收
ebtables -A FORWARD -p ipv4 -i eth0 -j mark --set-mark 2 --mark-target CONTINUE #forward链 ipv4包标记加上2再继续


route add -net 192.168.0.0 netmask 255.255.255.0 dev br0  #添加路由 192.168.0.0/24 下一跳到 br0
ifconfig br0 0.0.0.0
arp -s 192.168.0.255 ff:ff:ff:ff:ff:ff    #192.168.0.255 绑定静态mac  ffff-ffff-ffff
iptables -t nat -A PREROUTING -j DNAT --to-destination 192.168.0.255  #nat表 prerouting链 dnat 目标都转换为192.168.0.255


ebtables -A FORWARD --ulog-nlgroup 5 -j DROP # filter表 forward链中 userspace为5的数据包丢弃

iptables -t raw -A PREROUTING -m mark --mark 1 -j CT --zone 1    #部分数据包标记为1  到zone1     
iptables -t raw -A PREROUTING -m mark --mark 2 -j CT --zone 2    #部分数据包标记为1 到zone1 
ebtables -t nat -A PREROUTING -p 802_1Q --vlan-id 1 -j mark --mark-set 1 #nat表中 prerouting链 vlan id为1 数据包增加标记为1
ebtables -t nat -A PREROUTING -p 802_1Q --vlan-id 5 -j mark --mark-set 2 #nat表中 prerouting链 vlan id为5 数据包增加标记为5