openwrt 使用ebtables限制设备访问外网或内网
基于ebtables和mac地址的访问控制
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
更多推荐
所有评论(0)