Support direct IP/CIDR in whitelist add/del commands
Previously whitelist only accepted named presets (cloudflare, aws, etc). Now `xdp-defense whitelist add 8.8.8.8/32` works directly for both IPv4 and IPv6 addresses, writing to the shared pinned BPF map. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -443,13 +443,56 @@ cmd_country_list() {
|
|||||||
|
|
||||||
cmd_whitelist_add() {
|
cmd_whitelist_add() {
|
||||||
local name=$1
|
local name=$1
|
||||||
[ -z "$name" ] && { log_err "Usage: xdp-defense whitelist add <preset>"; exit 1; }
|
[ -z "$name" ] && { log_err "Usage: xdp-defense whitelist add <preset|ip/cidr>"; exit 1; }
|
||||||
|
|
||||||
|
# Direct IP/CIDR: contains a dot (IPv4) or colon (IPv6) with digits
|
||||||
|
if [[ "$name" =~ ^[0-9]+\.[0-9]+ ]] || [[ "$name" =~ ^[0-9a-fA-F]*: ]]; then
|
||||||
|
local map_name key_hex
|
||||||
|
if [[ "$name" == *":"* ]]; then
|
||||||
|
map_name="whitelist_v6"
|
||||||
|
key_hex=$(python3 -c "from ${COMMON_PY} import cidr_to_key_v6; print(cidr_to_key_v6('$name'))" 2>/dev/null)
|
||||||
|
else
|
||||||
|
map_name="whitelist_v4"
|
||||||
|
key_hex=$(python3 -c "from ${COMMON_PY} import cidr_to_key; print(cidr_to_key('$name'))" 2>/dev/null)
|
||||||
|
fi
|
||||||
|
[ -z "$key_hex" ] && { log_err "Invalid CIDR: $name"; exit 1; }
|
||||||
|
|
||||||
|
local map_id
|
||||||
|
map_id=$(get_map_id "$map_name")
|
||||||
|
[ -z "$map_id" ] && { log_err "$map_name map not found. Is XDP loaded?"; exit 1; }
|
||||||
|
|
||||||
|
bpftool map update id "$map_id" key hex $key_hex value hex 01 00 00 00 00 00 00 00 2>/dev/null
|
||||||
|
log_ok "Whitelisted: $name"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
python3 "$LIB_DIR/xdp_whitelist.py" add "$name"
|
python3 "$LIB_DIR/xdp_whitelist.py" add "$name"
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd_whitelist_del() {
|
cmd_whitelist_del() {
|
||||||
local name=$1
|
local name=$1
|
||||||
[ -z "$name" ] && { log_err "Usage: xdp-defense whitelist del <name>"; exit 1; }
|
[ -z "$name" ] && { log_err "Usage: xdp-defense whitelist del <name|ip/cidr>"; exit 1; }
|
||||||
|
|
||||||
|
# Direct IP/CIDR
|
||||||
|
if [[ "$name" =~ ^[0-9]+\.[0-9]+ ]] || [[ "$name" =~ ^[0-9a-fA-F]*: ]]; then
|
||||||
|
local map_name key_hex
|
||||||
|
if [[ "$name" == *":"* ]]; then
|
||||||
|
map_name="whitelist_v6"
|
||||||
|
key_hex=$(python3 -c "from ${COMMON_PY} import cidr_to_key_v6; print(cidr_to_key_v6('$name'))" 2>/dev/null)
|
||||||
|
else
|
||||||
|
map_name="whitelist_v4"
|
||||||
|
key_hex=$(python3 -c "from ${COMMON_PY} import cidr_to_key; print(cidr_to_key('$name'))" 2>/dev/null)
|
||||||
|
fi
|
||||||
|
[ -z "$key_hex" ] && { log_err "Invalid CIDR: $name"; exit 1; }
|
||||||
|
|
||||||
|
local map_id
|
||||||
|
map_id=$(get_map_id "$map_name")
|
||||||
|
[ -z "$map_id" ] && { log_err "$map_name map not found"; exit 1; }
|
||||||
|
|
||||||
|
bpftool map delete id "$map_id" key hex $key_hex 2>/dev/null && log_ok "Removed from whitelist: $name"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
python3 "$LIB_DIR/xdp_whitelist.py" del "$name"
|
python3 "$LIB_DIR/xdp_whitelist.py" del "$name"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user