bol-van / zapret

DPI bypass multi platform
6.03k stars 526 forks source link

Минимизация размера и компонентов для openwrt #371

Open gitalexch opened 2 weeks ago

gitalexch commented 2 weeks ago

Коллеги, имеется очень слабенький роутер 4/32 ROM/RAM, изи инсталл уже в него не лезет, собрал пакеты для openwrt 17, как в docs/compile/openwrt, там собралось 4 отдельных пакета, к сожалению, все они в роутер уже не помещаются, как не выкидывай ненужное, а помимо них ещё нужно запихнуть старт-ап скрипты, и с этим в связи с отсутствие авто-инсталла, и огромным и разветвлённым bash-кодом всё очень плохо, запихнуть их все в текущем виде не представляется возможным. Просьба подсказать по рекомендациям по уменьшению требуемого места, как я понимаю, можно смело выкинуть один из бинарников tpws/nfqws, возможно ещё не нужен ip2net и mdig если не планируется использовать ipset, я же правильно понимаю? Также может у кого есть упрощённые init-скрипты, чтоб не раскуривать sh-логику? Не совсем понимаю про генерацию правил для iptables, например, для tpws в каких случаях она нужна, и можно ли упростить (install скрипт для меня показался сильно запутанным, много вызовов из соседних скриптов, логика ускальзает) Может кто-то пытался собрать мини-пакет, например с одним бинарником tpws и инит-скриптами и скриптами install/remove для добавления/удаления правил для него, чтоб мне не изобретать велосипед?

Если нет, буду пробовать опакетить, на сколько я понимаю, openwrt позволяет запихнуть достаточно гибкую логику в пакет. По хорошему напрашивается мета-пакет zapret с возможностью выбора sub-компанентов....

bol-van commented 2 weeks ago

nfqws с зависимостями не влезет точно можно забыть пакованый upx tpws около 100кб весит к нему простенькую запускалку самому написать чисто для запуска процесса без иптаблес см /etc/init.d через procd это очень нетрудно правила иптаблес писать через /etc/firewall.user про скрипты запрета тоже забыть

bol-van commented 2 weeks ago

если есть усб - делать экструт на флэшке

gitalexch commented 2 weeks ago

увы, usb нет, запускать tpws от отдельного пользователя, от root же не выйдет? можно попросить пример настройки IPTABLES с REDIRECT по идее он должен меньше тратить ресурсов, ну и в случае openwrt там отдельный входящий интерфейс, на котором можно запускатьTPWS(почему нельзя биндиться к интерфейсу, а не к конкретному адресу? ) Можно как-то можно метить обработанный трафик с помощью самого TPWS, а затем его исключать, а то исключать по uid пользователя кажется не очень красиво ?

Правильно ли я понимаю, чтоб обрабатывать оба порта 443 и 80 нужно поднимать два отдельных экземпляра tpws?

gitalexch commented 2 weeks ago

пытаюсь написать конфиг через uci для tpws, кажется это не очень сложно и логично его хранить именно там....

Пока накидал что-то типа(не проверял):

#!/bin/sh /etc/rc.common

USE_PROCD=1
# after network
START=21
CONFIGURATION=zapret

PIDDIR=/var/run

load_fw_rules()
{
    iptables -t nat -I PREROUTING -i lan -p tcp --dport 443 -j REDIRECT --to-port 988
} 

unload_fw_rules()
{
    iptables -t nat -D PREROUTING -i lan -p tcp --dport 443 -j REDIRECT --to-port 988
}

start_service()
{
    echo "Starting daemon TPWS"
    load_fw_rules
    config_load "$CONFIGURATION"
    local opts
    local pid
    config_get opts tpws opts
    config_get pid tpws pid
    procd_open_instance
    procd_set_param command /opt/zapret/tpws/tpws "$opts"
    procd_set_param file /etc/config/zapret
    procd_set_param pidfile "$PIDDIR/$pid"
    procd_close_instance
    load_fw_rules
}

stop_service()
{
    # this procedure is called from stop()
    # stop() already stop daemons
    unload_fw_rules
}
bol-van commented 2 weeks ago

про иптаблес написно в доке иптаблес в инит плохая идея будут гонки с fw3 изменение настроек в люси порушит правило

gitalexch commented 2 weeks ago

В доках про iptables нашёл для TPWS только такое(или это вообще не то docs-iptables.txt):

For TPROXY :

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

ip -f inet rule add fwmark 1 lookup 100
ip -f inet route add local default dev lo table 100
# prevent loop
iptables  -t filter -I INPUT -p tcp --dport 988  -j REJECT
iptables  -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -j MARK --set-mark 1
iptables  -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 988

iptables  -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -m set --match-set zapret dst -j MARK --set-mark 1
iptables  -t mangle -A PREROUTING -i eth1 -p tcp --dport 80 -m mark --mark 0x1/0x1 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 988

но тут только про 80-ый порт речь, и ещё до этого всякие правила для dsync и проч, не уверен: 1) откуда берутся -j TPROXY и --tproxy-mark ? 2) умеет ли ipt в openwrt из коробки метить трафик, возможно нужен спец. модуль? 3) как быть с 443 портом? требуется ли для него запускать TPWS отдельный экземпляр?

bol-van commented 2 weeks ago

не надо тпрокси см реадме ближе к началу там есть днат можно еще проще сделать биндануть тпвс на br-lan и включить опции ожидания интерфейса и адреса --bind-wait-ifup 30 --bind-wait-ip 2 в иптаблес использовать -j REDIRECT --to 988

bol-van commented 2 weeks ago

тпвс расчитан на 1 инстанс, поскольку он может работать в сокс режиме все правила для хттп и тлс можно обьединить и использоаать в иптаблес мультипорт или 2 разных редиректа, если мультипорта нет

NewUse commented 1 week ago

Сделал облегчённую версию с минимальным init скриптом, лезет даже на 4МБ флешку вместе с luci (тестировал под openwrt 17, но должна работать на любой): https://github.com/bol-van/zapret/pull/413