216 lines
7.0 KiB
Bash
216 lines
7.0 KiB
Bash
#!/bin/sh
|
|
|
|
# =============================================================================
|
|
# OpenWRT Device Access Control Script
|
|
# =============================================================================
|
|
# This script manages device internet access through IP-based blocking
|
|
#
|
|
# Usage:
|
|
# ./device-control.sh block <IP> <NAME> - Block device internet access
|
|
# ./device-control.sh unblock <IP> <NAME> - Allow device internet access
|
|
# ./device-control.sh list - List all blocked devices
|
|
# ./device-control.sh status <IP> - Check if device is blocked
|
|
# ./device-control.sh init - Initialize the blocked devices set
|
|
#
|
|
# Installation:
|
|
# 1. Copy to /root/device-control.sh on OpenWRT
|
|
# 2. chmod +x /root/device-control.sh
|
|
# 3. Run: ./device-control.sh init
|
|
# 4. Add to /etc/firewall.user for persistence
|
|
# =============================================================================
|
|
|
|
ACTION=$1
|
|
DEVICE_IP=$2
|
|
DEVICE_NAME=$3
|
|
IPSET_NAME="blocked_devices"
|
|
LOG_FILE="/var/log/device-control.log"
|
|
|
|
# Function to log actions
|
|
log_action() {
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
|
|
}
|
|
|
|
# Function to initialize the ipset
|
|
init_ipset() {
|
|
# Check if ipset exists
|
|
if ! ipset list $IPSET_NAME >/dev/null 2>&1; then
|
|
echo "Creating ipset: $IPSET_NAME"
|
|
ipset create $IPSET_NAME hash:ip timeout 0 comment
|
|
log_action "INIT: Created ipset $IPSET_NAME"
|
|
else
|
|
echo "ipset $IPSET_NAME already exists"
|
|
fi
|
|
|
|
# Check if firewall rule exists
|
|
if ! iptables -C FORWARD -m set --match-set $IPSET_NAME src -j REJECT >/dev/null 2>&1; then
|
|
echo "Adding firewall rule for blocking"
|
|
iptables -I FORWARD -m set --match-set $IPSET_NAME src -j REJECT
|
|
log_action "INIT: Added firewall rule"
|
|
else
|
|
echo "Firewall rule already exists"
|
|
fi
|
|
|
|
echo ""
|
|
echo "Initialization complete!"
|
|
echo "To make this persistent across reboots, add to /etc/firewall.user:"
|
|
echo ""
|
|
echo "ipset create $IPSET_NAME hash:ip timeout 0 comment -exist"
|
|
echo "iptables -I FORWARD -m set --match-set $IPSET_NAME src -j REJECT"
|
|
}
|
|
|
|
# Function to validate IP address
|
|
validate_ip() {
|
|
if [[ ! $1 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
|
echo "Error: Invalid IP address format"
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
# Main script logic
|
|
case $ACTION in
|
|
init)
|
|
init_ipset
|
|
;;
|
|
|
|
block)
|
|
if [ -z "$DEVICE_IP" ]; then
|
|
echo "Error: IP address required"
|
|
echo "Usage: $0 block <IP> [NAME]"
|
|
exit 1
|
|
fi
|
|
|
|
validate_ip $DEVICE_IP || exit 1
|
|
|
|
# Add to ipset with comment if name provided
|
|
if [ -n "$DEVICE_NAME" ]; then
|
|
ipset add $IPSET_NAME $DEVICE_IP comment "$DEVICE_NAME" -exist
|
|
echo "✓ Blocked: $DEVICE_NAME ($DEVICE_IP)"
|
|
log_action "BLOCK: $DEVICE_NAME ($DEVICE_IP)"
|
|
else
|
|
ipset add $IPSET_NAME $DEVICE_IP -exist
|
|
echo "✓ Blocked: $DEVICE_IP"
|
|
log_action "BLOCK: $DEVICE_IP"
|
|
fi
|
|
;;
|
|
|
|
unblock)
|
|
if [ -z "$DEVICE_IP" ]; then
|
|
echo "Error: IP address required"
|
|
echo "Usage: $0 unblock <IP> [NAME]"
|
|
exit 1
|
|
fi
|
|
|
|
validate_ip $DEVICE_IP || exit 1
|
|
|
|
ipset del $IPSET_NAME $DEVICE_IP 2>/dev/null
|
|
if [ $? -eq 0 ]; then
|
|
if [ -n "$DEVICE_NAME" ]; then
|
|
echo "✓ Unblocked: $DEVICE_NAME ($DEVICE_IP)"
|
|
log_action "UNBLOCK: $DEVICE_NAME ($DEVICE_IP)"
|
|
else
|
|
echo "✓ Unblocked: $DEVICE_IP"
|
|
log_action "UNBLOCK: $DEVICE_IP"
|
|
fi
|
|
else
|
|
echo "✗ IP $DEVICE_IP was not in blocked list"
|
|
fi
|
|
;;
|
|
|
|
list)
|
|
echo "========================================"
|
|
echo "Currently Blocked Devices"
|
|
echo "========================================"
|
|
if ipset list $IPSET_NAME >/dev/null 2>&1; then
|
|
ipset list $IPSET_NAME | grep -A 100 "Members:" | tail -n +2 | while read line; do
|
|
if [ -n "$line" ]; then
|
|
echo "• $line"
|
|
fi
|
|
done
|
|
|
|
# Count
|
|
COUNT=$(ipset list $IPSET_NAME | grep -A 100 "Members:" | tail -n +2 | grep -c "")
|
|
echo "========================================"
|
|
echo "Total blocked: $COUNT device(s)"
|
|
else
|
|
echo "No blocked devices (ipset not initialized)"
|
|
echo "Run: $0 init"
|
|
fi
|
|
;;
|
|
|
|
status)
|
|
if [ -z "$DEVICE_IP" ]; then
|
|
echo "Error: IP address required"
|
|
echo "Usage: $0 status <IP>"
|
|
exit 1
|
|
fi
|
|
|
|
validate_ip $DEVICE_IP || exit 1
|
|
|
|
if ipset test $IPSET_NAME $DEVICE_IP >/dev/null 2>&1; then
|
|
echo "🔴 $DEVICE_IP is BLOCKED"
|
|
# Try to get comment
|
|
COMMENT=$(ipset list $IPSET_NAME | grep "$DEVICE_IP" | grep -o 'comment ".*"' | sed 's/comment "\(.*\)"/\1/')
|
|
if [ -n "$COMMENT" ]; then
|
|
echo " Device: $COMMENT"
|
|
fi
|
|
exit 0
|
|
else
|
|
echo "🟢 $DEVICE_IP is ALLOWED"
|
|
exit 1
|
|
fi
|
|
;;
|
|
|
|
log)
|
|
if [ -f "$LOG_FILE" ]; then
|
|
echo "========================================"
|
|
echo "Device Control Log"
|
|
echo "========================================"
|
|
tail -n 50 $LOG_FILE
|
|
else
|
|
echo "No log file found at $LOG_FILE"
|
|
fi
|
|
;;
|
|
|
|
clear)
|
|
echo "WARNING: This will unblock ALL devices!"
|
|
echo -n "Are you sure? (yes/no): "
|
|
read CONFIRM
|
|
if [ "$CONFIRM" = "yes" ]; then
|
|
ipset flush $IPSET_NAME
|
|
echo "✓ All devices unblocked"
|
|
log_action "CLEAR: All devices unblocked"
|
|
else
|
|
echo "Cancelled"
|
|
fi
|
|
;;
|
|
|
|
help|--help|-h)
|
|
echo "OpenWRT Device Access Control"
|
|
echo ""
|
|
echo "Usage:"
|
|
echo " $0 init - Initialize blocking system"
|
|
echo " $0 block <IP> [NAME] - Block device internet access"
|
|
echo " $0 unblock <IP> [NAME] - Allow device internet access"
|
|
echo " $0 list - List all blocked devices"
|
|
echo " $0 status <IP> - Check if device is blocked"
|
|
echo " $0 log - View recent actions"
|
|
echo " $0 clear - Unblock all devices"
|
|
echo " $0 help - Show this help"
|
|
echo ""
|
|
echo "Examples:"
|
|
echo " $0 block 10.0.0.100 \"Kids Tablet\""
|
|
echo " $0 unblock 10.0.0.100"
|
|
echo " $0 status 10.0.0.100"
|
|
echo ""
|
|
;;
|
|
|
|
*)
|
|
echo "Error: Unknown action '$ACTION'"
|
|
echo "Run '$0 help' for usage information"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
exit 0
|