Skip to content

Instantly share code, notes, and snippets.

@growler
Last active July 13, 2018 15:23
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save growler/57ef6080e99b647123211531635df3b2 to your computer and use it in GitHub Desktop.
Save growler/57ef6080e99b647123211531635df3b2 to your computer and use it in GitHub Desktop.

Весь список блокируемых РКН адресов умещается в 64K префиксов для linux ipset(8). С таким объемом точно справляется хилый intel linux box в качестве внешнего маршрутизатора, и, возможно, справится SOHO железка с OpenWRT (не проверял).

Для обхода блокировок понадобится:

  • linux box в качестве маршрутизатора между внутренней сетью (интерфейс $INT_IF, сеть $INT_NET)
  • vpn на какую-нибудь площадку (интерфейс $VPN_IF -- предполагается, что VPN делает NAT сама)
  1. Сначала надо преобразовать список адресов в формат, приемлимый для 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
  1. Затем надо сделать отдельную таблицу для 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

Номер таблицы смотрите сами, какой удобнее.

  1. Затем сделать пустой ipset:
ipset create FUCKRKN hash:net family inet hashsize 1024 maxelem 131072
  1. Затем надо сделать правила 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
  1. Наконец, надо подменить ipset на новый (и удалить старый):
cat fuckrkn.ipset | ipset restore
ipset swap FUCKRKN FUCKRKN-NEW
ipset destroy FUCKRKN-NEW

enjoy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment