Zapret: what's new

Регулярно возникает такой вопрос.
Как мне сделать, чтобы дурился трафик не со всех адресов в локальной сети.
Только мой комп, остальные нет. Все, только не телик. Только проводные, но не wifi. И тд.
Критериев можно придумать бесконечное множество.
Философия zapret категорически отвергает шаблонные схемы. Да, можно было бы сделать переменную типа FOOL_ONLY_FROM=192.168.10.0/24. Это просто и удобно. Но не универсально.
Потому поступаем иначе.
Вводится переменная FILTER_MARK=0x10000000.
Если она установлена, в правила ip/nf tables добавляется фильтр по этому mark bit.
Устанавливаете mark bit вы сами по каким угодно критериям. Учите ip/nf tables, за вас делать это zapret не будет.
Важно установить mark до фактического перенаправления трафика. Перенаправление на tpws идет на этапе prerouting или output. На nfqws - на этапе postrouting. Потому универсально это можно сделать

  • для nftables в хуках prerouting и output с приоритетом -102 или ниже
  • для iptables потребуется синхронизация с применением правил zapret. Можно использовать скрипты, указываемые в переменных конфига INIT_FW_POST_UP_HOOK и INIT_FW_PRE_DOWN_HOOK. Правила следует добавлять через iptables -t mangle -I PREROUTING или iptables -t mangle -I OUTPUT для проходящего и исходящего с самой системы трафика , соответственно. Можно так же и отказаться от INIT_APPLY_FW и применять фаервол самостоятельно (в доке Прикручивание к системе управления фаерволом или своей системе запуска)

Для nftables основная схема процессинга nfqws - POSTNAT. nfqws не видит исходных адресов локальной сети, потому даже если вписать дополнительные условия в правила, это не сработает, если надо отсеивать отдельные клиенты в локалке.

Пример команд для nftables :

nft add table inet mytable
nft add chain inet mytable pre "{type filter hook prerouting priority -102;}"
nft add rule inet mytable pre iifname eth2 mark set mark or 0x10000000
nft add rule inet mytable pre ip saddr 192.168.10.0/24 mark set mark or 0x10000000
nft add rule inet mytable pre ip6 saddr fd00:1::/16 mark set mark or 0x10000000
nft add chain inet mytable out "{type nat hook output priority -102;}"
nft add rule inet mytable out mark set mark or 0x10000000

Здесь дурится

  • все, исходящее с самой системы
  • все, пришедшее с интерфейса eth2
  • все, имеющее source ipv4 192.168.10.0/24
  • все, имеющее source ipv6 fd00:1::/16

Осталось это куда-нибудь красиво поместить. На openwrt лучше всего использовать файлы в /etc/nftables.d . В этой директории пишутся файлы, содержащие не команды nft, а файлы описания цепочек внутри таблицы fw4

Перепись того же самого в файл /etc/nftables/99-my.nft

chain my_pre {
    type filter hook prerouting priority -102;
    iifname eth2 mark set mark or 0x10000000;
    ip saddr 192.168.10.0/24 mark set mark or 0x10000000;
    ip6 saddr fd00:1::/16 mark set mark or 0x10000000;
}
chain my_out {
    type nat hook output priority -102;
    mark set mark or 0x10000000;
}

А если надо только wifi ? Тут вам придется переиграть стандартную lan/wan схему в openwrt.
Отделить проводные интерфейсы в lan1, беспроводные в lan2.
Будет 2 моста или 1 мост, а другой интерфейс без моста.
Или даже сделать 2 wifi сети с разными интерфейсами. Одну для себя, другую для роскомнадзора.
Чтобы входящие интерфейсы были разными , имели разные локальные подсети.
И с каждого интерфейса настроить маршрутизацию в wan.

Есть и другой способ решить поставленную задачу. См custom script 20-fw-extra