Set up a webserver on a local IP alias. Preferrably something nobody else listens on. I use 127.0.0.44.
I wrote a tiny, quick webserver to serve static pages. It's written in PHP, and can serve nearly a million pages per minute. It's available under PartyVan.
ban:
#!/bin/sh
# IPFW binary
ipfw="/sbin/ipfw"
# Index prefix of autoban rules
prefix="44???"
if [ -z "${1}" ]
then
echo "Usage: ${0} <ip>"
exit 64
fi
if [ "$(id -u)" -ne 0 ]
then
echo "Must be run as root."
exit 32
fi
luser="${1}"
# Determine if the IP is already banned
banned=$( ${ipfw} list | egrep "^${prefix}" | grep "from ${luser}" | cut -d" " -f1 | sort )
if [ -n "${banned}" ]
then
echo "Already banned, in rule(s): ${banned}"
exit 16
fi
# Obtain biggest index
last=$( ${ipfw} list | egrep "^${prefix}" | cut -d" " -f1 | sort | tail -n 1 )
# Is it an index?
if [ -z "${last}" ]
then
# Populate it with a sane value
index="$( echo "${prefix}" | tr '?' '0' )"
else
# Increment
index="$(( "${last}" + 1 ))"
fi
rule="${index} fwd 127.0.0.44 tcp from "${luser}" to any 80 in recv fxp0"
${ipfw} add ${rule}
unban:
#!/bin/sh
# IPFW binary
ipfw="/sbin/ipfw"
# Index prefix of autoban rules
prefix="44???"
if [ -z "${1}" ]
then
echo "Usage: ${0} <ip>"
exit 64
fi
if [ "$(id -u)" -ne 0 ]
then
echo "Must be run as root."
exit 32
fi
luser="${1}"
# Determine if the IP is already banned
banned=$( ${ipfw} list | egrep "^${prefix}" | grep "from ${luser}" | cut -d" " -f1 | sort )
if [ -z "${banned}" ]
then
echo "Not banned. Check rulesets manually."
exit 16
fi
# Unban
echo "Unbanning: ${banned}"
${ipfw} del ${banned}
banlist:
#!/bin/sh
# IPFW binary
ipfw="/sbin/ipfw"
# Index prefix of autoban rules
prefix="44???"
if [ "$(id -u)" -ne 0 ]
then
echo "Must be run as root."
exit 32
fi
# Get list of banned IPs
${ipfw} list | egrep "^${prefix}" | cut -d" " -f1,6 | sort | while read number ip
do
echo "${number} -> ${ip}"
done
