当前位置: 首页 > 工具软件 > ebtables > 使用案例 >

Linux-ebtables-以太网网桥防火墙

赵河
2023-12-01

  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   以太网类型   以太网协议和类型见下表

EtherTypeProtocol
0x0800Internet Protocol version 4 (IPv4)
0x0806Address Resolution Protocol (ARP)
0x0842Wake-on-LAN[7]
0x22F3IETF TRILL Protocol
0x6003DECnet Phase IV
0x8035Reverse Address Resolution Protocol
0x809BAppleTalk (Ethertalk)
0x80F3AppleTalk Address Resolution Protocol (AARP)
0x8100VLAN-tagged frame (IEEE 802.1Q) and Shortest Path Bridging IEEE 802.1aq[8]
0x8137IPX
0x8204QNX Qnet
0x86DDInternet Protocol Version 6 (IPv6)
0x8808Ethernet flow control
0x8819CobraNet
0x8847MPLS unicast
0x8848MPLS multicast
0x8863PPPoE Discovery Stage
0x8864PPPoE Session Stage
0x8870Jumbo Frames (proposed)[2][3]
0x887BHomePlug 1.0 MME
0x888EEAP over LAN (IEEE 802.1X)
0x8892PROFINET Protocol
0x889AHyperSCSI (SCSI over Ethernet)
0x88A2ATA over Ethernet
0x88A4EtherCAT Protocol
0x88A8Provider Bridging (IEEE 802.1ad) & Shortest Path Bridging IEEE 802.1aq[9]
0x88ABEthernet Powerlink[citation needed]
0x88CCLink Layer Discovery Protocol (LLDP)
0x88CDSERCOS III
0x88E1HomePlug AV MME[citation needed]
0x88E3Media Redundancy Protocol (IEC62439-2)
0x88E5MAC security (IEEE 802.1AE)
0x88E7Provider Backbone Bridges (PBB) (IEEE 802.1ah)
0x88F7Precision Time Protocol (PTP) over Ethernet (IEEE 1588)
0x88FBParallel Redundancy Protocol (PRP)
0x8902IEEE 802.1ag Connectivity Fault Management (CFM) Protocol / ITU-T Recommendation Y.1731 (OAM)
0x8906Fibre Channel over Ethernet (FCoE)
0x8914FCoE Initialization Protocol
0x8915RDMA over Converged Ethernet (RoCE)
0x891DTTEthernet Protocol Control Frame (TTE)
0x892FHigh-availability Seamless Redundancy (HSR)
0x9000Ethernet 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

 

 

 

 

 

 

 

 

 

 类似资料: