Traefik — 4. разрешаем доступ для Googlebot
5 июля 2023
В блокировке по странам есть один немаловажный нюанс: если IP адреса поискового бота будут принадлежать блокируемой стране, то он тоже будет заблокирован. И если с Яндексом проблем нет, то Google может пострадать. Но есть один простой выход. Для этого нужно добавить IP адреса серверов Googlebot в список исключений Traefik.
Для этих целей в файле конфигурации существует параметр allowedIPAddresses, который разрешает доступ перечисленным IP адресам независимо от остальной конфигурации. Список необходимых адресов можно найти в Интернете.
Для удобства я написал скрипт на Python, который самостоятельно получает список IP и добавляет его в файл конфигурации Traefik. Для его работы нужно добавить сначала параметр allowedIPAddresses в нужное место и прописать хотя бы один IP:
http: middlewares: my-geoblock: plugin: geoblock: allowLocalRequests: "true" allowUnknownCountries: "false" api: https://get.geojs.io/v1/ip/country/{ip} apiTimeoutMs: "750" cacheSize: "15" blackListMode: false countries: - RU forceMonthlyUpdate: "true" logAllowedRequests: "false" logApiRequests: "true" logLocalRequests: "false" unknownCountryApiResponse: nil allowedIPAddresses: - 192.0.2.0/24
Да, здесь я использовал для примера IP для документации. В дальнейшем он будет заменён скриптом.
А вот и сам скрипт. Его можно запускать как вручную, время от времени, так и добавить в cron. На всякий случай рекомендую сделать резервную копию конфигурации Traefik.
- googlebots.py
#!/usr/bin/python3 import urllib.request import json # Название middleware с geoblock middleware_name = "my-geoblock" # Файл конфигурации host.yml conf_file = "/home/username/docker/traefik/data/custom/host.yml" # Получаем список IP-адресов гуглоботов url = "https://developers.google.com/search/apis/ipranges/googlebot.json" w = "" for line in urllib.request.urlopen(url): w = w + line.decode("utf-8").strip() z = json.loads(w) ip = [] for item in z["prefixes"]: if "ipv4Prefix" in item: ip.append(item["ipv4Prefix"]) # Читаем содержимое файла конфигурации fc = [] f = open(conf_file, "r") for item in f: fc.append(item) f.close() # Переписываем файл insection = False point = False f = open(conf_file, "w") for item in fc: if point: if item.strip()[0] == "-": continue else: insection = False point = False if item.strip() == middleware_name + ":": # Нашли требуемый модификатор insection = True if insection and (item.strip() == "allowedIPAddresses:"): # Вот сюда надо вставлять данные point = True f.write(item) if point: # Записываем список IP for q in ip: f.write(" - " + q + "\n") f.close()
Обратите внимание на строки 7 и 9. В них вам нужно будет прописать название вашего middleware и полный путь к файлу host.yml.
