Регулярно возникает такой вопрос.
Как мне сделать, чтобы дурился трафик не со всех адресов в локальной сети.
Только мой комп, остальные нет. Все, только не телик. Только проводные, но не 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