itdoginfo / domain-routing-openwrt

Automatic configuration of Openwrt router for routing by domains. Ansible role and shell script
https://t.me/itdoginfo
236 stars 60 forks source link

Out of memory на старых роутерах когда используется ip.lst вместо ipsum.lst #2

Closed olologin closed 2 years ago

olologin commented 2 years ago

Сразу говорю, я не предлагаю эти изменения для мёрджа, просто оставляю инфу, может кто-то ещё будет нуждаться в таком и найдёт это в гугле. Возможно настройки не оптимальны.

Я тут попользовался вашим конфигом (не ansible, в основном брал с хабра). Всё отлично, через неделю понял что суммаризованым списком немного неудобно пользоваться. Начал пытаться использовать ip.lst вместо ipsum.lst, и разумеется на моём картофельном роутере начал лететь OOM при рестарте фаерволла. Я не понимаю что там этот фаерволл делает, но жрёт память при рестарте он дико. В итоге я таки победил свой роутер и теперь пользуюсь более точным списоком ip.lst.

Роутер у меня TP-Link TL-WR842N v3 Пишет что 56MiB оперативы всего. OpenWRT 22.03

Идея моих изменений такая: Не грузим никакие списки при рестарте фаерволла, загружаем все айпишники уже после рестарта. Перед рестартом желательно ресетнуть всё тоже.

Во-первых надо:

opkg update
opkg install zram-swap

Это чуть-чуть "добавит" оперативы.

Мои изменённые конфиги: (/etc/init.d/hirkn)

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

START=99

dir=/tmp/lst
SUBNET=https://antifilter.download/list/subnet.lst
IP=https://antifilter.download/list/ip.lst
COMMUNITY=https://community.antifilter.download/list/community.lst

mkdir -p $dir

echo "Run download lists"
rm -f /$dir/subnet.lst && wget -P $dir $SUBNET
rm -f /$dir/ip.lst && wget -P $dir $IP
rm -f /$dir/community.lst && wget -P $dir $COMMUNITY

# Check file at reboot
if [ ! -f $dir/subnet.lst ]
then
    wget -P $dir $SUBNET
fi

if [ ! -f $dir/ip.lst ]
then
    wget -P $dir $IP
fi

if [ ! -f $dir/community.lst ]
then
    wget -P $dir $COMMUNITY
fi

echo "Flushing old ruleset (Because otherwise firewall restart can be killed by OOM)"
nft flush ruleset
echo "Restarting firewall"
/etc/init.d/firewall restart
# nft list ruleset
echo "Adding community.lst"
cat /tmp/lst/community.lst | xargs -r -n1000 | sed 's/ /,/g' | xargs -n1 sh -c 'nft add element inet fw4 vpn_community { "$@" }' dummy
echo "Adding subnet.lst"
cat /tmp/lst/subnet.lst | xargs -r -n1000 | sed 's/ /,/g' | xargs -n1 sh -c 'nft add element inet fw4 vpn_subnets { "$@" }' dummy
echo "Adding ip.lst"
cat /tmp/lst/ip.lst | xargs -r -n1000 | sed 's/ /,/g' | xargs -n1 sh -c 'nft add element inet fw4 vpn_ip { "$@" }' dummy

(/etc/config/firewall) Как видим в конфиге я не использую loadfile (он закомменчен)

config ipset
        option name 'vpn_ip'
        option match 'dst_ip'
        #option loadfile '/tmp/lst/ip.lst'

config ipset
        option name 'vpn_subnets'
        option match 'dst_net'
        #option loadfile '/tmp/lst/subnet.lst'

config ipset
        option name 'vpn_community'
        option match 'dst_net'
        #option loadfile '/tmp/lst/community.lst'

config rule
        option name 'mark_subnet'
        option src 'lan'
        option dest '*'
        option proto 'all'
        option ipset 'vpn_subnets'
        option set_mark '0x1'
        option target 'MARK'

config rule
        option name 'mark_ip'
        option src 'lan'
        option dest '*'
        option proto 'all'
        option ipset 'vpn_ip'
        option set_mark '0x1'
        option target 'MARK'
        option family 'ipv4'

config rule
        option name 'mark_community'
        option src 'lan'
        option dest '*'
        option proto 'all'
        option ipset 'vpn_community'
        option set_mark '0x1'
        option target 'MARK'
        option family 'ipv4'
itdoginfo commented 2 years ago

С swap файлом на роутерах нужно быть острожнее, у вас flash память может совсем не долго прослужить. Ваш роутер поддерживает USB, можно ещё поизвращаться и закинуть swap на флешку. Да, nftables отжирает при загрузке в районе 50MB памяти. А чисто community.lst, без ip\ipsum не закрыл потребность?

olologin commented 2 years ago

@itdoginfo Это zram, это не своп файл, он на флеш память не должен писаться.

По поводу community.lst - похоже что не хватает.

olologin commented 2 years ago

Хотя конечно сейчас попользовался и заметил что в ip.lst всё-таки не всё что нужно находится. Получается что идеального варианта нет и всё-таки ipsum.lst получше. Но в любом случае у меня и с ipsum.lst были OOM периодически, так что это всё не бесполезно. Думаю можно закрыть чтоб не выглядело как issue.