ebtables 和 iptables 一样,主要是做数据包过滤的配置工具, ebtables 主要工作在数据链路层, iptables主要工作IP层和第四层应用层,他们主要做配置工具,底层的数据包过滤机制还是在 netfilter 核心工作组
和iptables 一样, ebtables 也有表,链和动作的概念
ebtables 有三张表,五条链和四个动作,支持自定义链,(需要 -j 链表名跳转到具体的链路)
三张表: filter: 默认过滤表,一些常规的数据包过滤配置,包含INPUT,OUTPUT, FORWARD
nat: 进行nat 变换的表,更改源,目的的mac地址, PREROUTING(用来做snat),POSTROUTING(用来做dnat) ,OUTPUT
broute: 对网桥过滤表的标记,只有一个链表 BROUTING.
链的过滤时机:
过滤的动作:
常用命令:
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-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-type 数据包可以是 broadcast , multicast, host, otherhost
--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 转发延迟
802.1Q 标记控制信息属性. 802_1Q (0x8100).
--vlan-id
--vlan-prio vlan 优先级 0-7
--vlan-encap 以太网类型 以太网协议和类型见下表
检测日志匹配:
--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-group
--nflog-prefix
--nflog-range
--nflog-threshold
--ulog
--ulog-prefix
--ulog-nlgroup
--ulog-cprange
--ulog-qthreshold
arp 回复匹配
--arpreply-mac
--arpreply-target 默认 drop
--to-destination address
--dnat-target targ ACCEPT CONTINUE DROP BROUTING RETURN
--mark-set value
--mark-or value
--mark-and value
--mark-xor value
--mark-target ACCEPT CONTINUE
--redirect-target ACCEPT CONTINUE DROP BROUTING RETURN
--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