Актуальная блокировка ботов без использования сторонних сервисов

C
На сайте с 13.01.2017
Offline
89
758

Т.к. блокировка через файл htaccess не такая хорошая и уже появилось много ip в списке, я решил найти другой эффективный и простой способ

Жду мнения экспертов, актуально ли это

Я использую Fastpanel, метод должен быть совместим с ней

После изучения, остановился на nftables

Делаю копию, у меня этот файл был без настроек а сам nftables был выключен

sudo cp /etc/nftables.conf /etc/nftables.conf.bak

Редактирую /etc/nftables.conf, конфиг сгенерировал в Claude

Для теста добавил туда только одну asn AS200373, которая в данный момент жестко сканирует

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    set blocked_v4 {
        type ipv4_addr
        flags interval
        elements = {
            45.3.32.0/20,
            45.3.48.0/21,
            45.3.62.0/24,
            65.111.0.0/20,
            65.111.20.0/22,
            65.111.24.0/21,
            95.141.242.0/24,
            104.167.19.0/24,
            104.167.25.0/24,
            104.207.32.0/19,
            151.123.176.0/23,
            151.123.178.0/24,
            193.56.28.0/24,
            195.63.0.0/19,
            209.50.160.0/19,
            216.26.224.0/19,
            217.181.64.0/19
        }
    }

    chain input {
        type filter hook input priority 0; policy drop;

        # Drop blocked ASN ranges first, before anything else
        ip saddr @blocked_v4 drop

        # Loopback (local machine talking to itself)
        iif lo accept

        # Allow replies to connections we initiated, drop garbage packets
        ct state established,related accept
        ct state invalid drop

        # Basic ICMP for diagnostics (ping, etc.)
        ip protocol icmp icmp type { echo-request, destination-unreachable, time-exceeded } accept

        # SSH
        tcp dport 22 accept

        # Web traffic
        tcp dport { 80, 443 } accept

        # FastPanel
        tcp dport 8888 accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Дальше нужно применить изменения

sudo nft -c -f /etc/nftables.conf


sudo systemctl enable nftables
sudo systemctl restart nftables

sudo systemctl status nftables
sudo nft list ruleset

Это должно защитить от примитивных ботов, которые игнорируют robots и создают высокую нагрузку

Дальше нужно добавить туда asn битерики и других, у меня все ip битерики были заблокированы еще в htaccess

Еще нашел список asn для блокировки на гитхабе https://raw.githubusercontent.com/wallacebrf/dns/refs/heads/main/ASN_LIST.txt , там почти все asn простых сканеров, Тенсент в том числе AS45090, AS132203

Думаю добавить их тоже

Получается, что так можно заблокировать страны и сети, откуда идут боты. Умных поведенческих это не коснется

Может здесь поделюсь своим списком блокировки, когда сделаю

И следующим шагом хочу настроить Crowdsec, бесплатно и с открытым кодом. Анализирует логи и принимает решение о блокировке, так же использует списки от сообщества

C
На сайте с 13.01.2017
Offline
89
#1

Весь список того мужика не хочу использовать без детального изучения, мне кажется, что он слишком много и жестко блокировал там, там видно как Vodafone попал в блокировку, а потом он убирал

И еще забыл написать, что заблокировал в htaccess по user agent ботов, которые представляются RewriteCond %{HTTP_USER_AGENT}:

AI2Bot, Ahrefs, Amazonbot, Applebot, Barkrowler, BitSightBot, BLEXBot, Bytespider, CCBot, Censys, ChatGPT, Cohere, Diffbot, DuckAssistBot, FacebookBot , GPTBot, Google-CloudVertexBot, Google-Extended, HeadlessChrome, ImagesiftBot, Kangaroo, MJ12Bot, MegaIndex.ru, Meta-ExternalAgent, Meta-ExternalFetcher, OAI-SearchBot, Omgili, PerplexityBot, Python-requests, SemrushBot, SERanking, Seznambot, Shodan, Sqlmap.org, Spider.cloud, Thinkbot, Timpibot, TikTokSpider, Webzio, YouBot, Vulnweb

facebookexternalhit, meta-externalagent, meta-webindexer, Amzn-SearchBot, DataForSeoBot, Go-http-client, DotBot, TerraCotta, keys-so-bot, Claude-SearchBot, DotBot, GetIntent

C
На сайте с 13.01.2017
Offline
89
#2

Если кому интересно, настроил crowdsec, сделал в Claude скрипт по блокировке asn и стран в nftables, по типу того с гитхаба. Он будет запускать по крону и обновлять списки

Теперь с ботами из этих стран тему можно закрывать, думаю что больше вреда от них, чем реальные посетители

#!/bin/bash
set -euo pipefail
# Albania, Argentina, Bangladesh, Brazil, Colombia, Costa Rica, Algeria,
# Ecuador, Hong Kong, Indonesia, India, Iraq, Jordan, Lebanon, Morocco,
# Malaysia, Nigeria, Nicaragua, Oman, Philippines, Pakistan, Puerto Rico,
# Paraguay, Singapore, Syria, Tunisia, Ukraine, Venezuela, Vietnam, South Africa
# (al, ar, bd, br, co, cr, dz, ec, hk, id, in, iq, jo, lb, ma, my, ng, ni,
#  om, ph, pk, pr, py, sg, sy, tn, ua, ve, vn, za)
COUNTRIES=(al ar bd br co cr dz ec hk id in iq jo lb ma my ng ni om ph pk pr py sg sy tn ua ve vn za)
COUNTRY_BASE="https://raw.githubusercontent.com/ipverse/country-ip-blocks/master/country"
# AS45102: Alibaba (US) Technology Co., Ltd.
# AS136907: Huawei Cloud
# AS55990: Huawei Cloud Service data center
# AS63655: Huawei Technologies Co., Ltd (HWDGNET)
# AS131444: Huawei (member of AS-HUAWEI set)
# AS141180: Huawei (member of AS-HUAWEI set)
# AS398705: Censys, Inc.
# AS132203: Tencent Building, Kejizhongyi Avenue
# AS45090: Shenzhen Tencent Computer Systems Company Limited
# AS35048: Biterika Group LLC
# AS204490: Kontel LLC (ASKONTEL)
# AS44812: IP Server LLC (IPSERVER-RU-NET)
# AS208677: "Cloud Technologies" LLC trading as Cloud.ru
# AS200373: 3xK Tech GmbH
ASNS=(AS45102 AS136907 AS55990 AS63655 AS131444 AS141180 AS398705 AS132203 AS45090 AS35048 AS204490 AS44812 AS208677 AS200373)
OUTFILE="/etc/nftables.d/geoblock.nft"
TMP=$(mktemp)
mkdir -p /etc/nftables.d
IPV4_CIDR_RE='^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}(/[0-9]{1,2})?$'
country_v4=()
asn_v4=()
# --- Country lists (IPv4 only) ---
for cc in "${COUNTRIES[@]}"; do
    echo "Fetching country $cc..."
    while IFS= read -r line; do
        line="${line%$'\r'}"
        [[ -z "$line" || "$line" == \#* ]] && continue
        [[ "$line" =~ $IPV4_CIDR_RE ]] || continue
        country_v4+=("$line")
    done < <(curl -fsSL "$COUNTRY_BASE/$cc/ipv4-aggregated.txt")
done
# --- ASN lists ---
for asn in "${ASNS[@]}"; do
    echo "Fetching ASN $asn..."
    count_before=${#asn_v4[@]}
    ipv6_skipped=0
    while IFS= read -r line; do
        line="${line%$'\r'}"
        [[ -z "$line" || "$line" == \#* ]] && continue
        if [[ "$line" == *:* ]]; then
            ipv6_skipped=$((ipv6_skipped + 1))
            continue
        fi
        [[ "$line" != */* ]] && line="${line}/32"
        [[ "$line" =~ $IPV4_CIDR_RE ]] || continue
        asn_v4+=("$line")
    done < <(curl -fsSL "https://asn.ipinfo.app/api/text/list/${asn}")
    echo "  -> $(( ${#asn_v4[@]} - count_before )) ranges (ipv6 skipped: $ipv6_skipped)"
done
{
    echo "add table inet geoblock"
    echo "delete table inet geoblock"
    echo "table inet geoblock {"
    echo "    set blocked_country_v4 {"
    echo "        type ipv4_addr; flags interval, auto-merge;"
    echo "        elements = { $(IFS=,; echo "${country_v4[*]}") }"
    echo "    }"
    echo "    set blocked_asn_v4 {"
    echo "        type ipv4_addr; flags interval, auto-merge;"
    echo "        elements = { $(IFS=,; echo "${asn_v4[*]}") }"
    echo "    }"
    echo "    chain input {"
    echo "        type filter hook input priority -300; policy accept;"
    echo "        ip saddr @blocked_country_v4 counter drop"
    echo "        ip saddr @blocked_asn_v4 counter drop"
    echo "    }"
    echo "}"
} > "$TMP"
mv "$TMP" "$OUTFILE"
nft -c -f "$OUTFILE"   # validate syntax before touching the live ruleset
nft -f "$OUTFILE"
echo "Loaded. country ranges: ${#country_v4[@]}, ASN ranges: ${#asn_v4[@]}"

Нужно анализировать логи и добавлять новых, когда появляются

Получается, что с помощью двух этих программ можно бесплатно настроить защиту, и еще в  htaccess по user agent блокируем сканеры и ботов. Остаются только ПФ боты, но с ними сложнее

eByeBots
На сайте с 10.12.2025
Offline
11
#3
Coby #:
и еще в  htaccess по user agent блокируем сканеры и ботов
Можно и так, а можно nginx использовать и там правила загружаются в память один раз при старте. К тому же htaccess нагружает сервер (если правил много, из-за особенности проверки) - но в целом юзабельно.
По поводу списков что Вы нашли, в основном сканеры используют HTTP 1.1 - в Apache и Nginx это можно проверять и отправлять на капчу или в блок (но ПС ботов нужно в исключения перед этим), сети не изучал что в списке - но если там хостинги - то вы можете потерять клиента с квн, учитывайте это.
Защита сайта от ботов через прокси-сервер с панелью аналитики: https://ebyebots.ru
C
На сайте с 13.01.2017
Offline
89
#4
eByeBots #:
Можно и так, а можно nginx использовать и там правила загружаются в память один раз при старте. К тому же htaccess нагружает сервер (если правил много, из-за особенности проверки) - но в целом юзабельно.
спасибо за совет, как в nginx не знаю, у меня fastpanel стоит, буду смотреть как там редактировать настройки

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий