1.条件 固定mac地址

为限制ip的访问控制 通常使用iptables 限制ip部分 ,如果设备更换ip地址,则原有的ip地址列表规则会失效
在局域网内 使用根据设备的mac地址配置ebtables限制目标设备的访问控制.
但是,这样也是有缺陷的,如设备每隔一段时间会使用产生新的,随机的mac地址进行连接,则ebtables的mac匹配会失效
为了限制这种情况,可以设置允许已知的mac连接,未识别的禁止其连接.
做到这种情况
1.1.wifi连接的可使用 允许列表中mac地址连接 如图
在这里插入图片描述
1.2.使用 arp 静态绑定

这样做是为了迫使 连接设备使用固定的mac 进行连接 从而能够使用ebtables 达到限制目的

2. openwrt 安装配置ebtables

2.1 安装

opkg install ebtables ebtables-utils kmod-ebtables-ipv4 kmod-ebtables-ipv6

查看版本

 ebtables -V

2.2 创建为启动脚本
创建文件 /etc/init.d/efw 内容如下

#!/bin/sh /etc/rc.common
#/etc/init.d/efw

START=21
STOP=21

cleartables() {
/usr/sbin/ebtables -t $1 -F
/usr/sbin/ebtables -t $1 -X
/usr/sbin/ebtables -t $1 -Z
}

boot() {
start
}

start() {
ebtables -P INPUT ACCEPT
ebtables -P FORWARD ACCEPT
ebtables -P OUTPUT ACCEPT
# 1.基于mac地址检查 禁止指定的mac设备访问内网 除了一些dns dhcp ntp之外,允许访问外网
# 1. filter mac address  which is disallowed to access intranet except some dns dhcp ntp , extranet is allowed
# 2. 基于mac地址检查 禁止指定的mac设备访问外网 只能访问内网,禁止访问外网
# 2. filter mac address which is disallowed to access extranet , intranet is allowed

#sh files is locale  in /usr/efw/*   
#由于分为多个执行脚本 把他们放置在  /usr/efw/目录下执行 

SHDIR=/usr/efw
for file in $(ls $SHDIR)
do
if [ -x $SHDIR/$file ]; then
#need arg:  add
sh  $SHDIR/$file add
fi
done

}

stop() {
cleartables filter
cleartables nat
#cleartables broute

/usr/sbin/ebtables -P INPUT ACCEPT
/usr/sbin/ebtables -P FORWARD ACCEPT
/usr/sbin/ebtables -P OUTPUT ACCEPT
}

restart() {
cleartables filter
cleartables nat
#cleartables broute
start
}

上面的脚本会 遍历调用 /usr/efw 目录下的每个可执行文件 执行动作为 sh $SHDIR/$file add
如果 /usr/efw 目录为空 则仅执行
/usr/sbin/ebtables -P INPUT ACCEPT
/usr/sbin/ebtables -P FORWARD ACCEPT
/usr/sbin/ebtables -P OUTPUT ACCEPT

/usr/efw 目录 每个可执行文件 可以 各自完成自己的功能 如
disallow_extranet.sh 指定mac地址 禁止访问外网,允许访问内网
disallow_intranet.sh 指定mac地址 禁止访问内网,允许访问外网

2.3 /usr/efw/disallow_extranet.sh
禁止访问外网,允许访问内网

#!/bin/sh 

#set -x

#用法: 单独 调用  
#添加 sh disallow-extranet.sh add   ;  删除   sh disallow-extranet.sh earse
# 这样就不必重启 efw服务

#配合 /etc/init.d/efw 使用
#/usr/efw/disallow_extranet.sh

#手动开关 ENABLE=0 禁用 ; =1 启动
ENABLE=1
[ "$ENABLE" = 1 ] || exit 1

#基于mac地址过滤 禁止访问外网 允许访问内网
#-----在这里添加需要限制的mac地址
#DISALLOW_MACLIST="11:11:11:22:22:22,22:22:22:11:11:11"

#使用文件记录禁止的mac地址  一个行 用逗号分隔
DISALLOW_MACFILE=/usr/efw/maclist_extranet
[ -e $DISALLOW_MACFILE ] || echo "11:22:33:44:55:66,22:22:22:33:33:33"|tee $DISALLOW_MACFILE


#需要16进制 这样grep才能匹配
VARMARK=0x123132


IPV4_A="10.0.0.0/8"
#IPV4_A_RFC6598="100.64.0.0/10"
IPV4_B="172.16.0.0/12"
IPV4_C="192.168.0.0/16"
IPV4_LOCAL="169.254.0.0/16"
IPV4_MCAST="224.0.0.0/4"
IPV4_BCAST="255.255.255.255"

# 会变成  fc00::/fc00:: 但效果一样
IPV6_LOCAL="fc00::/6"

add() {
ebtables -t nat -N NOEXTRANET_MARK
ebtables -t nat -A PREROUTING -j NOEXTRANET_MARK
#ebtables -t nat -A NOEXTRANET_MARK --among-src ${DISALLOW_MACLIST} -j mark --mark-set $VARMARK
ebtables -t nat -A NOEXTRANET_MARK --among-src-file $DISALLOW_MACFILE -j mark --mark-set $VARMARK

#INPUT 
ebtables -t filter -N NOEXTRANET_IN
ebtables -t filter -A INPUT --mark $VARMARK -j NOEXTRANET_IN
#IPV4
ebtables -t filter -A NOEXTRANET_IN -p ipv4 --ip-dst $IPV4_A -j ACCEPT
ebtables -t filter -A NOEXTRANET_IN -p ipv4 --ip-dst $IPV4_B -j ACCEPT
ebtables -t filter -A NOEXTRANET_IN -p ipv4 --ip-dst $IPV4_C -j ACCEPT
ebtables -t filter -A NOEXTRANET_IN -p ipv4 --ip-dst $IPV4_BCAST -j ACCEPT
ebtables -t filter -A NOEXTRANET_IN -p ipv4 --ip-dst $IPV4_MCAST -j ACCEPT
ebtables -t filter -A NOEXTRANET_IN -p ipv4 --ip-dst $IPV4_LOCAL -j ACCEPT
ebtables -t filter -A NOEXTRANET_IN -p ipv4 -j DROP
#IPV6
ebtables -t filter -A NOEXTRANET_IN -p ipv6 --ip6-dst $IPV6_LOCAL -j ACCEPT
ebtables -t filter -A NOEXTRANET_IN -p ipv6  -j DROP

#FORWARD 
ebtables -t filter -N NOEXTRANET_FWD
ebtables -t filter -A FORWARD --mark $VARMARK -j NOEXTRANET_FWD
#IPV4
ebtables -t filter -A NOEXTRANET_FWD -p ipv4 --ip-dst $IPV4_A -j ACCEPT
ebtables -t filter -A NOEXTRANET_FWD -p ipv4 --ip-dst $IPV4_B -j ACCEPT
ebtables -t filter -A NOEXTRANET_FWD -p ipv4 --ip-dst $IPV4_C -j ACCEPT
ebtables -t filter -A NOEXTRANET_FWD -p ipv4 --ip-dst $IPV4_BCAST -j ACCEPT
ebtables -t filter -A NOEXTRANET_FWD -p ipv4 --ip-dst $IPV4_MCAST -j ACCEPT
ebtables -t filter -A NOEXTRANET_FWD -p ipv4 --ip-dst $IPV4_LOCAL -j ACCEPT
ebtables -t filter -A NOEXTRANET_FWD -p ipv4 -j DROP
#IPV6
ebtables -t filter -A NOEXTRANET_FWD -p ipv6 --ip6-dst $IPV6_LOCAL -j ACCEPT
ebtables -t filter -A NOEXTRANET_FWD -p ipv6 -j DROP

}


earse() {
ebtables -t nat -F NOEXTRANET_MARK
ebtables -t nat -X NOEXTRANET_MARK
ebtables -t filter -D INPUT --mark $VARMARK -j NOEXTRANET_IN
ebtables -t filter -D FORWARD --mark $VARMARK -j NOEXTRANET_FWD
ebtables -t filter -F NOEXTRANET_FWD
ebtables -t filter -X NOEXTRANET_FWD
ebtables -t filter -F NOEXTRANET_IN
ebtables -t filter -X NOEXTRANET_IN
}


#reload mac list DISALLOW_MACLIST
#修改 DISALLOW_MACLIST 变量后 调用reload重新载入规则 而不是整个efw重载
#sh /usr/efw/disallow_extranet.sh  reload
reload() {
if [ -n  "$(ebtables -t nat -L|grep  "mark-set $VARMARK")" ]; then
ebtables -t nat -F NOEXTRANET_MARK
ebtables -t nat -A NOEXTRANET_MARK --among-src-file $DISALLOW_MACFILE -j mark --mark-set $VARMARK
fi
}

# MAIN 
case "$1" in
	add)
		add
		;;
	earse)
		earse
		;;
	reload)
		reload
		;;
	*)
		exit 1 
		;;
esac

exit 0

2.4 /usr/efw 脚本规范
需要提供几个选项
add 添加规则
earse 删除
reload 重载mac列表


/etc/init.d/efw 的调用 sh $SHDIR/$file add 启动时创建规则
或者
修改 /usr/efw/maclist_extranet 的mac文件
只能一个行 每个mac地址用逗号分隔
修改完成后调用
sh /usr/efw/disallow_extranet.sh reload 以重载当前的规则 而不是重启整个 /etc/init.d/efw restart

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐