Блокировка доступа по странам к Nextcloud, Centos 7 Firewalld + ipset

Настроим блокировку доступа к серверу Nextcloud по странам (определенным подсетям), белому или черному списку. С помощью ipset возможно написать только одно правило, а не использовать много однотипных правил для firewalld, что позволит ускорить его работу.

Проверяем запущен ли фаервол, если нет, запускаем:

terminal
[root@enk2x]# systemctl enable firewalld
[root@enk2x]# systemctl start firewalld
[root@enk2x]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Сб 2020-02-08 18:20:16 MSK; 1 weeks 1 days ago
Docs: man:firewalld(1)
Main PID: 6636 (firewalld)
CGroup: /system.slice/firewalld.service
└─6636 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid...

По умолчанию есть активная зона public для интерфейса ens192:

terminal
[root@enk2x]# firewall-cmd --get-active-zones
public
interfaces: ens192
[root@enk2x]#

Создаем "Белый список"

terminal
[root@enk2x]# firewall-cmd --permanent --new-ipset=whitelist --type=hash:net
[root@enk2x]# firewall-cmd --reload

Создаем скрипт который закинет в whitelist дипазоны нужных нам стран:

terminal
[root@enk2x]# nano 001.sh
#!/bin/bash
wget -O spisokgol http://www.ipdeny.com/ipblocks/data/countries/{ru,ua}.zone
list=$(cat spisokgol)
for ipnet in $list
do
firewall-cmd --permanent --ipset=whitelist --add-entry=$ipnet
done
echo "Завершено"
[root@enk2x]#

Сделаем скрипт исполняемым:

terminal
[root@enk2x]# chmod +x 001.sh

выполняем

terminal
[root@enk2x]# ./001.sh

Добавим нужные нам сети, которых нет в списке:

terminal
[root@enk2x]# firewall-cmd --permanent --ipset=whitelist --add-entry=192.168.1.0/24

Перезагрузим:

terminal
[root@enk2x]# firewall-cmd --reload

Проверить списки ipset:

terminal
[root@enk2x]# firewall-cmd --get-ipsets

Проверить адреса в списке "whitelist" можно командой:

terminal
[root@enk2x]# firewall-cmd --ipset=whitelist --get-entries

Проверить есть ли в списке нужная нам сеть:

terminal
[root@enk2x]# firewall-cmd --ipset=whitelist --get-entries | grep 192.168.
212.192.168.0/23
91.192.168.0/22
62.192.168.0/22
185.192.168.0/22
192.168.1.0/24
[root@enk2x]#

Добавим расширенное правило доступа к веб серверу для портов 80 и 443 например:

terminal
[root@enk2x]# firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=whitelist port protocol="tcp" port="80" accept'
[root@enk2x]# firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=whitelist port protocol="tcp" port="443" accept'
Тоже самое но указав сервис вместо порта:
terminal
[root@enk2x]# firewall-cmd --permanent --add-rich-rule='rule source ipset=whitelist service name="http" accept'
[root@enk2x]# firewall-cmd --permanent --add-rich-rule='rule source ipset=whitelist service name="https" accept'
Перечитаем конфигурацию:
terminal
[root@enk2x]# firewall-cmd --reload

Аналогично можно создать списки доступов и к другим сервисам, например ssh серверу.

Может потребоваться создать наоборот "черный список":

terminal
[root@enk2x]# firewall-cmd --permanent --new-ipset=blacklist --type=hash:net

Удаляем правила созданные ранее:

terminal
[root@enk2x]# firewall-cmd --permanent --zone=public --remove-rich-rule='rule source ipset=whitelist port protocol="tcp" port="80" accept'
[root@enk2x]# firewall-cmd --permanent --zone=public --remove-rich-rule='rule source ipset=whitelist port protocol="tcp" port="443" accept'

Добавляем правило доступа со всех адресов:

terminal
[root@enk2x]# firewall-cmd --permanent --zone=public --add-port 80/tcp
[root@enk2x]# firewall-cmd --permanent --zone=public --add-port 443/tcp
Или тоже самое, но указав сервис:
terminal
[root@enk2x]# firewall-cmd --zone=public --permanent --add-service=http
[root@enk2x]# firewall-cmd --zone=public --permanent --add-service=https
Добавляем расширенное правило блокировки всех портов для адресов из черного списка:
terminal
[root@enk2x]# firewall-cmd --permanent --add-rich-rule 'rule source ipset=blacklist drop'
Или только для определенного порта:
terminal
[root@enk2x]# firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=blacklist port protocol="tcp" port="80" drop'
[root@enk2x]# firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=blacklist port protocol="tcp" port="443" drop'
Или запись для сервиса:
terminal
[root@enk2x]# firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=blacklist service name="http" drop'
[root@enk2x]# firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=blacklist service name="https" drop'

Blacklist (или любой другой созданный лист ipset) можно заполнить добавляя адреса или сети в xml файл по пути: /etc/firewalld/ipsets/blacklist.xml в таком формате:

terminal
[root@enk2x]# nano /etc/firewalld/ipsets/blacklist.xml
<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:net">
<short>black-list</short>
<entry>192.168.9.0/24</entry>
<entry>192.168.10.3</entry>
</ipset>

Второй способ добавления адресов или сетей:

terminal
[root@enk2x]# firewall-cmd --permanent --ipset=blacklist --add-entry=192.168.20.0/24
Удаление:
terminal
[root@enk2x]# firewall-cmd --permanent --ipset=blacklist --remove-entry=192.168.20.0/24

 

Добавление через ipset:

terminal
[root@enk2x]# ipset -A blacklist 192.168.2.0/24
Удалить:
terminal
[root@enk2x]# ipset -D blacklist 192.168.2.0/24
Просмотреть списки адресов:
terminal
[root@enk2x]# ipset -L | less
Удалить список:
terminal
[root@enk2x]# ipset -X whitelist
Очистить список с адресами:
terminal
[root@enk2x]# ipset -F whitelist

Если вы добавляете адреса напрямую через ipset, то будьте готовы к тому, что после перезагрузки конфигурации командой  firewall-cmd --reload список окажется пустым, предварительно сохраните конфигурацию в файл:
terminal
[root@enk2x]# mkdir /etc/ipset
[root@enk2x]# ipset save > /etc/ipset/ipset.conf
Восстановление:
terminal
[root@enk2x]# ipset restore < /etc/ipset/ipset.conf

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *