Заблокировать определенные ip/url для клиентов vpn сервера

Привет.
У меня есть vps в европе на debian. Я получаю к нему доступ с помощью wireguard и shadowsocks.
Я хочу, чтобы клиенты моего vps не могли через него зайти на некоторые адреса. Например, я хочу запретить заходить на sber.ru, чтобы люди случайно не зашли туда с иностранного ip и не были заблокированы сбером.

На первом шаге я хочу блокировать не по URL, а хотя бы по IP.
Как это сделать? Я правильно понимаю, что надо использовать iptables table=FILTER & chain=FORWARD?
iptables -A FORWARD -d 5.255.255.242 -j DROP
так не сработало. Клиент может пинговать 5.255.255.242. Где я ошибся?

На втором шаге я хочу блокировать по url. Я хочу сделать это так:

  1. регулярно поддомены домена sber.ru (вроде находил такие сервисы), регулярно резолвить ip этих доменов и добавлять в iptables … drop
  2. найти подсеть, принадлежащую сберу и заблокировать ip диапазон

Нормальный вариант?. Я понимаю, что клиент может настроить свой dns и мое решение не сработает на 100%

Вероятно, вы добавили правило в конец таблицы (-A), выше разрешающих правил.

Нормальный, только это всё равно блокировка по домену, а не по URL.

Пару лет назад искал сети Сбера для мобильного приложения. Сейчас может ещё что-то добавилось.
194.54.12.0/22
84.252.146.0/24
185.157.97.0/24
185.174.128.64/26

whois -h whois.radb.net – “-i origin AS35237” | sed -nre ‘s/^route: (.)/\1/p’

непосредственно по домену проще всего сделать через прокси
теоретически можно по SNI. поставить ndpi и настроить его на фильтрацию определенных SNI, как это делает РКН

apt install whois curl -y

iptables -t raw -F
iptables -t raw -X
clear
for prefix in $(whois -h whois.radb.net -- '-i origin AS35237' | grep -oP "\d+\.\d+\.\d+\.\d+\/\d+"); do
  iptables -A PREROUTING -t raw -s "${prefix}" -j DROP;
done

iptables -S -t raw

test:

curl -s --connect-timeout 10 https://online.sberbank.ru/CSAFront/index.do | grep -q "Сбербанк Онлайн" && echo "accessible" || echo "blocked"

сбер блочит аккаунт? я десятки раз заходил в акк с разных впнов, и в тинькофф тоже.
Кстати, FORWARD правило сработает только для wireguard, для shadowsocks надо в OUTPUT, или редактировать конфиг на клиенте

Спасибо. Сделал -I, сработало для WG. И еще сделал
iptables -A PREROUTING -t raw -s "${prefix}" -j DROP;

Но для Outline / Shadowsocks это не сработало. Я подумал, дело в том, что для outline пакеты не проходят через nat, а как бы рождаются на самом vps. И сделал
iptables -I OUTPUT -d 5.255.255.242 -j DROP
Но это тоже не сработало. Подскажите пожалуйста, как заблокировать этот адрес для outline через iptables?

output не сработал у меня для SS.

Ну я сбер для примера привел. Знаю точно недавно ВТБ блокировал. Помимо банков, я хочу заблокировать еще рабочие подключения, чтобы случайно при включенном vpn не подставиться перед безой.

заблокируйте 1.1.1.2 и проверьте его на клиенте через curl, у меня все сработало. ICMP PING не покажет блокировки т.к. он не поддерживается ss

curl 5.255.255.242
curl: (52) Empty reply from server

А без включенного vpn - нет ошибки. Значит, заблокировал.

типа работает?
А можно еще чуть чуть ключевых слов, чтобы я почитал, почему ping не покажет блокировки?

shadowsocks это прокси, поддерживает только TCP и UDP протоколы, команда ping работает с протоколом ICMP, и некоторые клиенты shadowsocks на запрос ping обычно отсылают фейковый ответ
image
первый пинг - напрямую, настоящий
второй пинг - через sing-box tun, фейк

на outline клиенте я так понял у вас тоже самое

да, у меня при подключении через SS дико короткий пинг и я не понимал, почему так. Спасибо

Спасибо. Написал свой по аналогии.

Попробуйте

clear
cd /root/
rm -rf /root/firewall
mkdir -p /root/firewall
cd /root/firewall
touch /root/firewall/run && chmod 755 /root/firewall/run
touch /root/firewall/data_raw
touch /root/firewall/data_clean
touch /root/firewall/list_as
clear && ls -lah

Редактировать список автономных станций, по одному номеру AS на каждой строке

nano /root/firewall/list_as

AS35237
AS24823
AS15632

Исполняемый файл

nano /root/firewall/run

#!/bin/bash

# where's the iptables
iptables=$(which iptables)

# raw file cleanup
rm -rf /root/firewall/data_raw
touch /root/firewall/data_raw

# refreshing data: autonomous systems
for list_as in $(cat /root/firewall/list_as); do
 whois -h whois.radb.net -- "-i origin $list_as" | grep -oP "\d+\.\d+\.\d+\.\d+\/\d+" >> /root/firewall/data_raw;
done

# removing duplicates
sort -u /root/firewall/data_raw > /root/firewall/data_clean

# raw table cleaning
"$iptables" -t raw -F
"$iptables" -t raw -X

# applying new iptables settings
for prefix in $(cat /root/firewall/data_clean | grep -oP "\d+\.\d+\.\d+\.\d+\/\d+"); do
  "$iptables" -A PREROUTING -t raw -s "${prefix}" -j DROP;
done

Пробуем исполнить

/root/firewall/run

Результаты здесь

iptables -S -t raw

Спасибо

оптимизацию списка лучше делать через прогу iprange или aggregate (можно pipe сразу после grep): подсеть ростелекома 2664 линий в whois radb, после прогона iprange становится 756 линий

я добавил 30 тыс DROP правил и пропускная способность VPS снизилась до 1мегабита… Поэтому вместо множества правил
-A PREROUTING -t raw -s “${prefix}” -j DROP
лучше использовать ipset create, add и использовать одно правило
-m set --match-set ipset_name src -j DROP
с ним снижения производительности не заметил (даже на all листе с 500к строк отсюда)

еще по логике лучше бы использовать DST а не SRC блок, нет?