Bypass bloke ILV ak DNSTap ak BGP

Bypass bloke ILV ak DNSTap ak BGP

Sijè a byen chire, mwen konnen. Pou egzanp, gen yon ekselan atik, men se sèlman yon pati IP nan blocklist la konsidere la. Nou pral ajoute tou domèn.

Akòz lefèt ke tribinal yo ak RKN yo bloke tout bagay agoch ​​ak dwa, ak founisè yo ap eseye di pa tonbe anba amann yo pibliye pa Revizorro, pèt ki asosye nan bloke yo byen gwo. Ak nan mitan sit yo bloke "lejitimman" gen anpil moun ki itil (alo, rutracker)

M ap viv andeyò jiridiksyon RKN, men paran m, fanmi m ak zanmi m rete nan peyi m. Se konsa, li te deside vini ak yon fason fasil pou moun ki lwen IT kontoune bloke a, de preferans san yo pa patisipasyon yo ditou.

Nan nòt sa a, mwen pa pral dekri bagay rezo debaz etap pa etap, men mwen pral dekri prensip jeneral ki jan konplo sa a ka aplike. Se konsa, konesans sou ki jan rezo a travay an jeneral ak nan Linux an patikilye se yon dwe genyen.

Kalite kadna

Premyèman, ann rafrechi memwa nou sou sa ki bloke.

Gen plizyè kalite kadna nan XML telechaje soti nan RKN:

  • IP
  • Domèn
  • URL

Pou senplisite, nou pral redwi yo a de: IP ak domèn, ak soti nan bloke pa URL nou pral tou senpleman rale soti domèn nan (oswa pito, sa a te deja fè pou nou).

Bon moun ki soti Roskomsvoboda aplike yon bèl bagay API, atravè ki nou ka jwenn sa nou bezwen:

Aksè nan sit bloke yo

Pou fè sa, nou bezwen kèk ti VPS etranje, de preferans ak trafik san limit - gen anpil nan yo pou 3-5 dolar. Ou bezwen achte l 'nan tou pre aletranje pou ke ping la pa twò wo, men ankò kenbe nan tèt ou ke entènèt la ak jewografi pa toujou kowenside. Epi kòm pa gen okenn SLA pou 5 dolar, li pi bon yo pran 2+ moso nan men founisè diferan pou tolerans fay.

Apre sa, nou bezwen mete kanpe yon tinèl chiffres soti nan routeur kliyan an nan VPS la. Mwen itilize Wireguard kòm pi rapid ak pi fasil pou konfigirasyon paske... Routeur kliyan mwen yo baze sou Linux tou (APU2 oswa yon bagay sou OpenWRT). Nan ka kèk Mikrotik / Cisco, ou ka itilize pwotokòl ki disponib sou yo tankou OpenVPN ak GRE-over-IPSEC.

Idantifikasyon ak redireksyon trafik enterè yo

Ou ka, nan kou, sispann tout trafik entènèt soti nan ale aletranje. Men, gen plis chans, vitès la nan travay ak kontni lokal yo pral soufri anpil nan sa a. Anplis de sa, kondisyon yo ki Pleasant sou yon VPS yo pral pi wo.

Se poutèt sa, nou pral bezwen yon jan kanmenm izole trafik nan sit bloke epi selektivman wout li nan tinèl la. Menm si kèk nan trafik "anplis" rive la, li toujou pi bon pase kondwi tout bagay nan tinèl la.

Pou jere trafik, nou pral sèvi ak pwotokòl BGP la epi fè piblisite pou wout ki mennen nan rezo ki nesesè yo soti nan VPS nou an bay kliyan yo. Ann pran BIRD kòm yon demon BGP, kòm li se youn nan pi fonksyonèl ak pratik.

IP

Tout bagay klè ak bloke IP: nou tou senpleman anonse tout IP bloke soti nan VPS. Pwoblèm lan se ke gen apeprè 600 mil subnet nan lis la bay pa API a, ak vas majorite nan yo se / 32 gen tout pouvwa a. Nimewo sa a nan wout ka konfonn routeurs kliyan fèb.

Se poutèt sa, lè pwosesis lis la, li te deside sòm jiska / 24 rezo a si gen 2 oswa plis gen tout pouvwa a nan li. Kidonk, kantite wout yo te redwi a ~ 100 mil. Script la pou sa a pral swiv.

Domèn

Li pi konplike e gen plizyè fason. Pou egzanp, ou ka enstale Squid transparan sou chak routeur kliyan epi entèsepte HTTP la epi rekonèt sou yon lanmen TLS yo nan lòd yo jwenn URL yo mande a nan premye ka a ak domèn nan SNI nan dezyèm lan.

Men, akòz tout nouvo TLS1.3 + eSNI, analiz HTTPS ap vin pi piti ak mwens reyalis chak jou. Ak enfrastrikti sou bò kliyan an vin pi konplike - w ap oblije itilize omwen OpenWRT.

Se poutèt sa, mwen deside pran chemen an nan entèsepte repons a demann DNS. Isit la, tou, tout kalite DNS-sou-TLS/HTTPS kòmanse plane sou tèt nou, men nou ka (pou kounye a) kontwole pati sa a sou kliyan an - swa enfim li oswa itilize pwòp sèvè nou an pou DoT/DoH.

Ki jan yo detounen DNS?

Genyen tou plizyè apwòch isit la.

  • Antsepte trafik DNS atravè PCAP oswa NFLOG
    Tou de metòd entèsepsyon sa yo aplike nan sèvis piblik la sidmat. Men, li pa te sipòte pou yon tan long ak fonksyonalite a trè primitif, kidonk ou toujou bezwen ekri yon obligatwa pou li.
  • DNS sèvè log analiz
    Malerezman, resous mwen konnen yo pa konnen ki jan yo konekte repons yo, men se sèlman demann yo. Nan prensip, sa a se lojik, paske, kontrèman ak demann, repons yo gen yon estrikti konplèks epi li difisil pou ekri yo nan fòm tèks.
  • DNSTap
    Erezman, anpil nan yo deja sipòte DNSTap pou rezon sa yo.

ki sa ki DNSTap?

Bypass bloke ILV ak DNSTap ak BGP

Sa a se yon pwotokòl kliyan-sèvè ki baze sou Pwotokòl Tanpon ak Frame Streams pou transfere kesyon DNS estriktire ak repons soti nan yon sèvè DNS nan yon pèseptè. Esansyèlman, sèvè DNS la transmèt metadone demann ak repons (kalite mesaj, IP kliyan/sèvè, elatriye) plis mesaj DNS konplè nan fòm (binè) kote li travay avèk yo sou rezo a.

Li enpòtan pou w konprann ke nan paradigm DNSTap la, sèvè a DNS aji kòm yon kliyan, ak pèseptè a aji kòm yon sèvè. Sa vle di, sèvè dns la konekte ak pèseptè a, epi yo pa vise vèrsa.

Jodi a, DNSTap sipòte nan tout sèvè DNS popilè. Men, pou egzanp, BIND nan anpil distribisyon (tankou Ubuntu LTS) souvan konpile pou kèk rezon san sipò li yo. Se konsa, se pou nou pa deranje ak rebati, men pran yon resous ki pi lejè ak pi vit - Unbound.

Ki jan yo trape DNSTap?

Gen kèk kantite Gen sèvis piblik CLI pou travay ak koule nan evènman DNSTap, men yo pa apwopriye pou rezoud pwoblèm nou an. Se konsa, mwen deside envante pwòp bisiklèt mwen an, ki pral fè tout sa ki nesesè: dnstap-bgp

Algorithm travay:

  • Lè yo lanse, li chaje yon lis domèn ki soti nan yon dosye tèks, envèse yo (habr.com -> com.habr), ekskli liy kase, doublons ak subdomains (sa vle di si lis la gen habr.com ak www.habr.com, li pral chaje sèlman premye a) epi li bati yon pyebwa prefiks pou rechèch rapid nan lis sa a
  • Aji kòm yon sèvè DNSTap, li tann pou yon koneksyon soti nan sèvè a DNS. Nan prensip, li sipòte tou de sipò UNIX ak TCP, men sèvè DNS mwen konnen yo sèlman sipòte sipò UNIX.
  • Pakè DNSTap k ap fèk ap rantre yo premye deserialize nan estrikti Protobuf la, epi apre mesaj binè DNS li menm, ki chita nan youn nan jaden Protobuf yo, analize nan nivo dosye DNS RR.
  • Li tcheke si lame a mande (oswa domèn paran li) nan lis la chaje, si se pa sa, repons lan inyore
  • Se sèlman A/AAAA/CNAME RR yo chwazi nan repons lan epi adrès IPv4/IPv6 korespondan yo ekstrè nan men yo.
  • Adrès IP yo nan kachèt ak yon TTL configurable epi yo pibliye yo bay tout parèy BGP konfigirasyon yo
  • Lè w ap resevwa yon repons ki montre yon IP ki deja kache, TTL li yo mete ajou
  • Apre TTL la ekspire, yo retire antre nan kachèt la ak nan anons BGP

Fonksyonalite adisyonèl:

  • Re-li lis domèn pa SIGHUP
  • Senkronize kachèt ak lòt ka dnstap-bgp atravè HTTP/JSON
  • Duplike kachèt la sou disk (nan baz done BoltDB) pou retabli sa li apre yon rekòmanse
  • Sipò pou chanje nan yon espas non rezo diferan (pou kisa sa nesesè yo pral dekri anba a)
  • IPv6 sipò

Limitasyon:

  • Domèn IDN yo poko sipòte
  • Kèk paramèt BGP

Mwen kolekte RPM ak DEB pakè pou enstalasyon fasil. Ta dwe travay sou tout OS ki relativman resan ak systemd, paske... yo pa gen okenn depandans.

Scheme

Se konsa, ann kòmanse rasanble tout eleman yo ansanm. Kòm yon rezilta, nou ta dwe jwenn yon bagay tankou topoloji rezo sa a:
Bypass bloke ILV ak DNSTap ak BGP

Lojik travay la, mwen panse, klè nan dyagram nan:

  • Kliyan an gen sèvè nou an configuré kòm yon DNS, ak demann DNS yo dwe tou ale nan VPN la. Sa nesesè pou founisè a pa ka itilize entèsepsyon DNS pou bloke.
  • Lè yon kliyan ouvri yon sit entènèt, li voye yon demann DNS tankou "ki IP xxx.org genyen?"
  • délivrer rezoud xxx.org (oswa pran li nan kachèt la) epi voye yon repons bay kliyan an "xxx.org gen yon IP konsa ak sa yo", an menm tan kopi li atravè DNSTap.
  • dnstap-bgp fè piblisite adrès sa yo nan Zwazo atravè BGP si domèn nan se sou lis la bloke
  • Zwazo piblisite yon wout pou IP sa yo ak next-hop self routeur kliyan
  • Pake ki vin apre soti nan kliyan an nan IP sa yo ale nan tinèl la

Sou sèvè a, mwen sèvi ak yon tab separe andedan BIRD pou wout ki mennen nan sit bloke epi li pa kwaze ak OS la nan okenn fason.

Gen yon dezavantaj nan konplo sa a: premye pake SYN ki soti nan kliyan an ap gen plis chans pou yo ale nan founisè domestik la paske Wout la pa anonse imedyatman. Ak isit la gen opsyon posib depann sou fason founisè a fè bloke a. Si li jis gout trafik, Lè sa a, pa gen okenn pwoblèm. Men, si li redireksyon li nan kèk DPI, Lè sa a, (teyorikman) efè espesyal yo posib.

Mirak yo posib tou ak kliyan ki pa respekte DNS TTL la, ki ka mennen nan kliyan an lè l sèvi avèk kèk dosye demode nan kachèt pouri li yo olye pou yo mande Unbound.

Nan pratik, ni premye a ni dezyèm lan pa te lakòz pwoblèm pou mwen, men kantite mil ou ka varye.

Akor sèvè

Pou fasilite woule soti, mwen te ekri wòl pou Ansible. Li ka configured tou de serveurs ak kliyan ki baze sou Linux (ki fèt pou distribisyon ki baze sou deb). Tout paramèt yo byen evidan epi yo mete nan envantè.yml. Wòl sa a te koupe nan gwo liv jwèt mwen an, kidonk li ka gen erè - rale demann yo Byenveni :)

Ann ale nan eleman prensipal yo.

BGP

Lè w ap kouri de demon BGP sou menm lame a, yon pwoblèm fondamantal parèt: BIRD pa vle ogmante BGP peering ak localhost la (oswa ak nenpòt koòdone lokal). Soti nan mo a absoliman. Googling ak lekti lis adrès pa t 'ede, yo reklame ke li se pa konsepsyon. Gen dwa gen yon fason, men mwen pa jwenn li.

Ou ka eseye yon lòt demon BGP, men mwen renmen BIRD epi mwen sèvi ak li toupatou, mwen pa vle kreye plis antite.

Se poutèt sa, mwen kache dnstap-bgp andedan espas non rezo a, ki konekte ak rasin lan atravè koòdone veth la: li se tankou yon tiyo, bout yo ki rete deyò nan espas non diferan. Nan chak nan bout sa yo nou tache adrès IP p2p prive ki pa ale pi lwen pase lame a, pou yo ka anyen. Sa a se menm mekanis ki itilize pou jwenn aksè nan pwosesis anndan an pi renmen tout moun Docker ak lòt resipyan.

Se poutèt sa li te ekri script ak fonksyonalite ki deja dekri anwo a nan trennen tèt ou nan cheve nan yon lòt espas non te ajoute nan dnstap-bgp. Poutèt sa, li dwe kouri kòm rasin oswa bay binè CAP_SYS_ADMIN atravè lòd la setcap.

Egzanp script pou kreye espas non

#!/bin/bash

NS="dtap"

IP="/sbin/ip"
IPNS="$IP netns exec $NS $IP"

IF_R="veth-$NS-r"
IF_NS="veth-$NS-ns"

IP_R="192.168.149.1"
IP_NS="192.168.149.2"

/bin/systemctl stop dnstap-bgp || true

$IP netns del $NS > /dev/null 2>&1
$IP netns add $NS

$IP link add $IF_R type veth peer name $IF_NS
$IP link set $IF_NS netns $NS

$IP addr add $IP_R remote $IP_NS dev $IF_R
$IP link set $IF_R up

$IPNS addr add $IP_NS remote $IP_R dev $IF_NS
$IPNS link set $IF_NS up

/bin/systemctl start dnstap-bgp

dnstap-bgp.conf

namespace = "dtap"
domains = "/var/cache/rkn_domains.txt"
ttl = "168h"

[dnstap]
listen = "/tmp/dnstap.sock"
perm = "0666"

[bgp]
as = 65000
routerid = "192.168.149.2"

peers = [
    "192.168.149.1",
]

bird.conf

router id 192.168.1.1;

table rkn;

# Clients
protocol bgp bgp_client1 {
    table rkn;
    local as 65000;
    neighbor 192.168.1.2 as 65000;
    direct;
    bfd on;
    next hop self;
    graceful restart;
    graceful restart time 60;
    export all;
    import none;
}

# DNSTap-BGP
protocol bgp bgp_dnstap {
    table rkn;
    local as 65000;
    neighbor 192.168.149.2 as 65000;
    direct;
    passive on;
    rr client;
    import all;
    export none;
}

# Static routes list
protocol static static_rkn {
    table rkn;
    include "rkn_routes.list";
    import all;
    export none;
}

rkn_routes.list

route 3.226.79.85/32 via "ens3";
route 18.236.189.0/24 via "ens3";
route 3.224.21.0/24 via "ens3";
...

dns

Pa default, nan Ubuntu, binè Unbound la sere ak yon pwofil AppArmor, ki entèdi li konekte ak nenpòt ki priz DNSTap. Ou ka swa efase pwofil sa a oswa enfim li:

# cd /etc/apparmor.d/disable && ln -s ../usr.sbin.unbound .
# apparmor_parser -R /etc/apparmor.d/usr.sbin.unbound

Sa a ta dwe pwobableman ajoute nan playbook la. Li ta ideyal, nan kou, korije pwofil la ak bay dwa ki nesesè yo, men mwen te twò parese.

unbound.conf

server:
    chroot: ""
    port: 53
    interface: 0.0.0.0
    root-hints: "/var/lib/unbound/named.root"
    auto-trust-anchor-file: "/var/lib/unbound/root.key"
    access-control: 192.168.0.0/16 allow

remote-control:
    control-enable: yes
    control-use-cert: no

dnstap:
    dnstap-enable: yes
    dnstap-socket-path: "/tmp/dnstap.sock"
    dnstap-send-identity: no
    dnstap-send-version: no

    dnstap-log-client-response-messages: yes

Telechaje ak pwosesis lis

Script pou telechaje ak trete yon lis adrès IP
Li telechaje lis la, rezime nan prefiks la pfx. Nan pa_ajoute и pa_rezime ou ka di IP yo ak rezo ki bezwen sote oswa ou pa rezime. Mwen te bezwen sa paske... sous-rezo VPS mwen an te sou blocklist la :)

Bagay la komik se ke RosKomSvoboda API a bloke demann ak ajan itilizatè a default Python. Sanble yo te resevwa script kiddy la. Se poutèt sa, nou chanje li nan Ognelis.

Pou kounye a li travay sèlman ak IPv4 paske... Pataje IPv6 piti, men li pral fasil pou ranje. Sòf si ou gen tou sèvi ak bird6.

rkn.py

#!/usr/bin/python3

import json, urllib.request, ipaddress as ipa

url = 'https://api.reserve-rbl.ru/api/v2/ips/json'
pfx = '24'

dont_summarize = {
    # ipa.IPv4Network('1.1.1.0/24'),
}

dont_add = {
    # ipa.IPv4Address('1.1.1.1'),
}

req = urllib.request.Request(
    url,
    data=None, 
    headers={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
    }
)

f = urllib.request.urlopen(req)
ips = json.loads(f.read().decode('utf-8'))

prefix32 = ipa.IPv4Address('255.255.255.255')

r = {}
for i in ips:
    ip = ipa.ip_network(i)
    if not isinstance(ip, ipa.IPv4Network):
        continue

    addr = ip.network_address

    if addr in dont_add:
        continue

    m = ip.netmask
    if m != prefix32:
        r[m] = [addr, 1]
        continue

    sn = ipa.IPv4Network(str(addr) + '/' + pfx, strict=False)

    if sn in dont_summarize:
        tgt = addr
    else:
        tgt = sn

    if not sn in r:
        r[tgt] = [addr, 1]
    else:
        r[tgt][1] += 1

o = []
for n, v in r.items():
    if v[1] == 1:
        o.append(str(v[0]) + '/32')
    else:
        o.append(n)

for k in o:
    print(k)

Script pou aktyalizasyon
Mwen kouri li yon fwa pa jou nan kouwòn lan, petèt li vo kouri li yon fwa chak 4 èdtan paske ... Sa a, nan opinyon mwen, se peryòd renouvèlman ke RKN mande nan men founisè yo. Anplis de sa, yo gen kèk lòt bloke super-ijan ki ka rive pi vit.

Èske sa ki annapre yo:

  • Kouri premye script la epi mete ajou lis wout yo (rkn_routes.list) pou ZWAWA
  • Rechaje BIRD
  • Mete ajou ak netwaye lis domèn pou dnstap-bgp
  • Rechaje dnstap-bgp

rkn_update.sh

#!/bin/bash

ROUTES="/etc/bird/rkn_routes.list"
DOMAINS="/var/cache/rkn_domains.txt"

# Get & summarize routes
/opt/rkn.py | sed 's/(.*)/route 1 via "ens3";/' > $ROUTES.new

if [ $? -ne 0 ]; then
    rm -f $ROUTES.new
    echo "Unable to download RKN routes"
    exit 1
fi

if [ -e $ROUTES ]; then
    mv $ROUTES $ROUTES.old
fi

mv $ROUTES.new $ROUTES

/bin/systemctl try-reload-or-restart bird

# Get domains
curl -s https://api.reserve-rbl.ru/api/v2/domains/json -o - | jq -r '.[]' | sed 's/^*.//' | sort | uniq > $DOMAINS.new

if [ $? -ne 0 ]; then
    rm -f $DOMAINS.new
    echo "Unable to download RKN domains"
    exit 1
fi

if [ -e $DOMAINS ]; then
    mv $DOMAINS $DOMAINS.old
fi

mv $DOMAINS.new $DOMAINS

/bin/systemctl try-reload-or-restart dnstap-bgp

Yo te ekri san yo pa panse anpil, kidonk si ou wè yon bagay ki ka amelyore, ale pou li.

Konfigirasyon kliyan an

Isit la mwen pral bay egzanp pou routeurs Linux, men nan ka Mikrotik / Cisco li ta dwe menm pi senp.

Premyèman, mete kanpe BIRD:

bird.conf

router id 192.168.1.2;
table rkn;

protocol device {
    scan time 10;
};

# Servers
protocol bgp bgp_server1 {
    table rkn;
    local as 65000;
    neighbor 192.168.1.1 as 65000;
    direct;
    bfd on;
    next hop self;
    graceful restart;
    graceful restart time 60;
    rr client;
    export none;
    import all;
}

protocol kernel {
    table rkn;
    kernel table 222;
    scan time 10;
    export all;
    import none;
}

Nan fason sa a nou pral senkronize wout yo resevwa nan men BGP ak nimewo 222 tab routage nwayo a.

Apre sa, li ase pou mande nwayo a gade tab sa a anvan ou gade youn nan default:

# ip rule add from all pref 256 lookup 222
# ip rule
0:  from all lookup local
256:    from all lookup 222
32766:  from all lookup main
32767:  from all lookup default

Sa a se li, tout sa ki rete se konfigirasyon DHCP sou routeur la distribye adrès IP tinèl sèvè a kòm DNS ak konplo a pare.

Limit

Avèk algorithm aktyèl la pou jenere ak trete lis domèn, li gen ladan, pami lòt bagay, youtube.com ak CDN li yo.

Ak sa a mennen nan lefèt ke tout videyo yo pral voye nan VPN a, ki ka bouche chanèl la tout antye. Li ta ka vo konpile yon lis domèn eksepsyon popilè ke RKN toujou twò fèb pou bloke. Epi sote yo lè analize.

Konklizyon

Metòd ki dekri a pèmèt ou kontoune prèske nenpòt blokaj ke founisè yo aplike kounye a.

Nan prensip, dnstap-bgp ka itilize pou nenpòt lòt rezon kote yo bezwen yon sèten nivo jesyon trafik ki baze sou yon non domèn. Ou jis bezwen pran an kont ke sèjousi mil sit ka pann sou menm adrès IP la (dèyè kèk Cloudflare, pou egzanp), kidonk metòd sa a gen presizyon olye ki ba.

Men, pou bezwen yo nan kontoune bloke, sa a se byen ase.

Ajoute, modifye, demann rale yo akeyi!

Sous: www.habr.com

Add nouvo kòmantè