Geoblock
VPS
Раздел «VPS»Я сталкивался с постоянными атаками на почтовый сервер на VPS из двух конкретных стран. Рабочим решением оказалась полная блокировка этих стран.
Есть два популярных провайдера geoblock-баз: Maxmind и DB-IP. Их можно использовать через python-библиотеку geoipsets.
Установка
Раздел «Установка»Установите пакеты:
sudo apt install python3 python3.12 python3-pip python3-venv ipsetСоздайте python virtual environment:
python3 -m venv .venvПроверьте, что все работает:
source .venv/bin/activateКонфиг Geoblock
Раздел «Конфиг Geoblock»Создайте конфиг geoblock по документации geoipsets.
Например /home/user/geoipsets.conf:
[general]provider=dbipfirewall=iptablesaddress-family=ipv4,ipv6
[countries]RUCNПроверьте работу:
source .venv/bin/activategeoipsets -o /home/user -c /home/user/geoipsets.confСкрипт Geoblock
Раздел «Скрипт Geoblock»Создайте скрипт, который обновляет geoblock ipsets и заново создает iptables-правила.
Например /home/user/geoblock.sh:
#!/bin/bash
output_path="/home/user"venv_path="/home/user/.venv/bin/activate"config_path="/home/user/geoipsets.conf"log="/home/user/geoblock.log"
echo "Updating Blocklist $(date)" >> $logsource $venv_pathgeoipsets -o $output_path -c $config_path >> $log
for i in $(find "${output_path}/geoipsets" -name "*.ipv*");do name=$(basename $i) echo $name >> $log /usr/sbin/ipset flush $name >> $log /usr/sbin/ipset restore --exist --file $i >> $log command=$(if [[ $name == *ipv4 ]]; then echo "/usr/sbin/iptables"; else echo "/usr/sbin/ip6tables"; fi) $command -D FORWARD -m set --match-set $name src -j DROP &>/dev/null $command -D INPUT -m set --match-set $name src -j DROP &>/dev/null $command -D DOCKER-USER -m set --match-set $name src -j DROP &>/dev/null $command -I DOCKER-USER 1 -m set --match-set $name src -j DROP >> $log $command -I INPUT 1 -m set --match-set $name src -j DROP >> $log $command -I FORWARD 1 -m set --match-set $name src -j DROP >> $logdoneПроверьте, что все работает и ipsets заполнены:
chmod +x /home/user/geoblock.shsudo /home/user/geoblock.shsudo ipset list RU.ipv4Расписание Cron
Раздел «Расписание Cron»Запускайте скрипт geoblock при загрузке и раз в неделю.
Например, добавьте в sudo crontab -e:
20 0 * * 2 /home/user/geoblock.sh@reboot sleep 120 && /home/user/geoblock.shПроверьте запуск при ребуте и еженедельно. После перезагрузки есть задержка 2 минуты, чтобы успеть исправить блокировку.
OPNSense
Раздел «OPNSense»Alias
Раздел «Alias»Перейдите в Firewall > Aliases > GeoIP settings и добавьте ссылку на базу geoblock с вашим license key:
https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country-CSV&license_key=your-license-key&suffix=zipПерейдите в Firewall > Aliases и создайте aliases для стран, которые хотите блокировать, или whitelist для конкретной страны:
Name: GeoblockType: GeoIP (IPv4, IPv6)Content: Select all the countries you want to blockName: UKType: GeoIP (IPv4, IPv6)Content: Select UKFirewall
Раздел «Firewall»Перейдите в Firewall > Rules > WAN и создайте правила:
Action: BlockInterface: WANDirection: inTCP/IP Version: IPv4+IPv6Protocol: anySource: GeoblockDestination: anyDescription: Blocks specific countriesAction: PassInterface: WANDirection: inTCP/IP Version: IPv4+IPv6Protocol: TCPSource: UKDestination: WAN addressDestination port range: 443Description: Whitelist UK on port 443Cron
Раздел «Cron»Создайте cron-задачу для ежедневного обновления списков.
Перейдите в System > Settings > Cron и добавьте:
Enabled: checkedMinutes: 0Hours: 0Day of the month: *Months: *Days of the week: *Command: Update and reload firewall aliases