Весь список блокируемых РКН адресов умещается в 64K префиксов для linux ipset(8)
. С таким объемом точно справляется хилый intel linux box в качестве внешнего маршрутизатора, и, возможно, справится SOHO железка с OpenWRT (не проверял).
Для обхода блокировок понадобится:
- linux box в качестве маршрутизатора между внутренней сетью (интерфейс
$INT_IF
, сеть$INT_NET
) - vpn на какую-нибудь площадку (интерфейс
$VPN_IF
-- предполагается, что VPN делает NAT сама)
- Сначала надо преобразовать список адресов в формат, приемлимый для
ipset(8)
:
git clone https://github.com/zapret-info/z-i
cd z-i
cat dump.csv |\
tail -n +2 |\
iconv -f cp1251 -t utf-8 |\
cut -d';' -f 1 |\
tr '|' '\n' | tr -d ' ' |\
iprange | (\
echo "create FUCKRKN-NEW hash:net family inet hashsize 1024 maxelem 131072" ;\
while read a ; do echo "add FUCKRKN-NEW $a" ; done \
) > fuckrkn.ipset
- Затем надо сделать отдельную таблицу для policy routing в VPN (если еще нет) и настроить маршрут:
echo 209 FUCKRKN >> /etc/iproute2/rt_tables
ip route add table FUCKRKN dev $VPN
ip rule add fwmark 10 table FUCKRKN pref 30010
Номер таблицы смотрите сами, какой удобнее.
- Затем сделать пустой ipset:
ipset create FUCKRKN hash:net family inet hashsize 1024 maxelem 131072
- Затем надо сделать правила iptables для отметки нужных потоков (если у вас есть NAT, то, скорее всего, правила restore-mark тоже уже есть, тогда их создавать не надо):
iptables -t mangle -I PREROUTING 1 -i $INT_IF -j CONNMARK --restore-mark
iptables -t mangle -I INPUT 1 -j CONNMARK --restore-mark
iptables -t mangle -I OUTPUT 1 -j CONNMARK --restore-mark
iptables -t mangle -I PREROUTING 2 -i $INT_IF -s $INT_NET -m set --match-set FUCKRKN dst -j MARK --set-mark 10
iptables -t mangle -I PREROUTING 3 -m mark --mark 13 -j CONNMARK --save-mark
- Наконец, надо подменить ipset на новый (и удалить старый):
cat fuckrkn.ipset | ipset restore
ipset swap FUCKRKN FUCKRKN-NEW
ipset destroy FUCKRKN-NEW
enjoy