greystone
Active Member
Hallo zusammen,
heute hat mich der ClaudeBot genervt. Der prügelt doch tatsächlich mit 1700 verschiedenen AWS IPs auf einen meiner Server ein, um den zu indizieren. Es gibt wie immer viele Wege zum Ziel.
Ich habe mich heute entschieden das per iptables zu drosseln, mit ips, die ich aus dem apache log file extrahiere. Das ist recht generisch und funktioniert so gut wie überall. Hier ist das Script, falls das jemand gebrauchen kann (block-bot.sh):
heute hat mich der ClaudeBot genervt. Der prügelt doch tatsächlich mit 1700 verschiedenen AWS IPs auf einen meiner Server ein, um den zu indizieren. Es gibt wie immer viele Wege zum Ziel.
Ich habe mich heute entschieden das per iptables zu drosseln, mit ips, die ich aus dem apache log file extrahiere. Das ist recht generisch und funktioniert so gut wie überall. Hier ist das Script, falls das jemand gebrauchen kann (block-bot.sh):
Code:
#!/bin/bash
declare -rx PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
declare -rx LC_ALL=C
# --- configure your environment here
declare -rx botname="claudebot" # <----- add your specific botname(s) (regex) here
declare -rx logfile=/var/log/apache2/your-access.log # <----- add your apache2 access-log-file-path here
declare -rx conn_limit="1/sec" # <----- how many bot connections do you allow?
# --- configuration section end
get_bot_ips() {
grep -Ei "$botname" "$logfile" \
| gawk 'ips[$1]!=1 {ips[$1]=1;print $1}'
}
setup_chain() {
local chain=$1
{
iptables -F $chain
iptables -X $chain
iptables -N $chain
} &>/dev/null
}
eexit() {
echo "Fatal Error: $1"
echo "aborting"
echo
exit 1
}
mylog() {
echo "$(date) : $1"
}
main() {
echo
which gawk &>/dev/null || eexit "gawk missing. please install"
which iptables &>/dev/null || eexit "iptables missing. please install"
[ -r "$logfile" ] || eexit "apache logfile $logfile not readable. please check variable \$logfile"
mylog "doing iptables base setup for $botname rate limiting..."
iptables -D INPUT -j _MYBOT &>/dev/null
local ip
setup_chain _MYBOT
setup_chain _RATE_LIMIT
iptables -A _RATE_LIMIT -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -m limit --limit $conn_limit -j ACCEPT
iptables -A _RATE_LIMIT -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW -m limit --limit $conn_limit -j ACCEPT
iptables -A _RATE_LIMIT -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j DROP
iptables -A _RATE_LIMIT -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW -j DROP
mylog "adding bot ips..."
while read ip ; do
((count=count+1))
iptables -A _MYBOT -s $ip -j _RATE_LIMIT
done < <(get_bot_ips)
iptables -A _MYBOT -j RETURN
iptables -I INPUT 1 -j _MYBOT
mylog "added $count rules / ips for Bot-Pattern '$botname'"
mylog "bot rate limiting finished for Bot-Pattern '$botname'"
echo
}
main
Last edited: