Saihestu ILV blokeatzea DNSTap eta BGPrekin

Saihestu ILV blokeatzea DNSTap eta BGPrekin

Gaia nahiko landua dago, badakit. Esaterako, handia dago artikuluan, baina bloke-zerrendaren IP zatia bakarrik hartzen da kontuan. Domeinuak ere gehituko ditugu.

Epaitegiek eta RKNk dena eskuinetik eta ezkerretik blokeatzen dutenez, eta hornitzaileak Revizorrok emandako isunetan ez erortzen ahalegintzen ari direnez, blokeoaren ondoriozko galerak nahiko handiak dira. Eta "legez" blokeatutako guneen artean erabilgarri asko daude (kaixo, rutracker)

RKNren eskumenetik kanpo bizi naiz, baina nire gurasoak, senideak eta lagunak etxean geratu ziren. Beraz, ITtik urrun dauden pertsonek blokeoa saihesteko modu erraz bat sortzea erabaki zen, ahal izanez gero, haien parte-hartzerik gabe.

Ohar honetan, ez ditut oinarrizko sareko gauzak deskribatuko urratsetan, baina eskema hau nola inplementa daitekeen printzipio orokorrak deskribatuko ditut. Beraz, sareak orokorrean eta Linuxen bereziki nola funtzionatzen duen jakitea ezinbestekoa da.

Sarraila motak

Lehenik eta behin, freskatu dezagun blokeatzen ari denaren memoria.

RKN-tik deskargatutako XML-an hainbat blokeo mota daude:

  • IP
  • Π”ΠΎΠΌΠ΅Π½
  • URL

Soiltasunerako, bitara murriztuko ditugu: IP eta domeinua, eta domeinua URL bidez blokeatzetik aterako dugu besterik gabe (zehatzago esanda, dagoeneko egin digute).

jende ona Roskomsvoboda zoragarri bat konturatu zen API, zeinaren bidez behar duguna lor dezakegu:

Blokeatutako guneetarako sarbidea

Horretarako, atzerriko VPS txiki batzuk behar ditugu, ahal izanez gero trafiko mugagabearekin - horietako asko daude 3-5 dolarren truke. Atzerritik hurbil hartu behar duzu ping-a oso handia izan ez dadin, baina, berriro ere, kontuan izan Internet eta geografia ez direla beti bat egiten. Eta 5 dolarren truke SLArik ez dagoenez, hobe da hornitzaile ezberdinetatik 2 pieza baino gehiago hartzea akatsen tolerantziarako.

Ondoren, enkriptatutako tunel bat konfiguratu behar dugu bezeroaren bideratzailetik VPSera. Wireguard erabiltzen dut konfiguratzeko azkarrena eta errazena. Linux-en oinarritutako bezero-bideratzaileak ere baditut (APU2 edo OpenWRT-n zerbait). Mikrotik / Cisco batzuen kasuan, eskuragarri dauden protokoloak erabil ditzakezu OpenVPN eta GRE-over-IPSEC bezalakoak.

Intereseko trafikoa identifikatzea eta birbideratzea

Noski, atzerriko herrialdeetako Interneteko trafiko guztia itzal dezakezu. Baina, ziurrenik, tokiko edukiekin lan egiteko abiadurak asko sufrituko du hori. Gainera, VPS-en banda-zabaleraren eskakizunak askoz handiagoak izango dira.

Hori dela eta, blokeatutako guneetara trafikoa nolabait esleitu eta tunelera selektiboki zuzendu beharko dugu. Trafiko "gehigarri" batzuk bertara iristen badira ere, oraindik askoz hobea da tuneletik dena gidatzea baino.

Trafikoa kudeatzeko, BGP protokoloa erabiliko dugu eta beharrezko sareetarako ibilbideak iragarriko ditugu gure VPStik bezeroei. Har dezagun BIRD BGP deabrurik funtzional eta erosoenetako bat bezala.

IP

IP bidezko blokeoarekin, dena argi dago: blokeatutako IP guztiak VPSrekin iragartzen ditugu. Arazoa da APIak itzultzen dituen zerrendan 600 mila azpisare inguru daudela, eta horietako gehienak /32 ostalariak dira. Ibilbide kopuru honek bezeroaren bideratzaile ahulak nahas ditzake.

Hori dela eta, zerrenda prozesatzeko orduan, sarera laburbiltzea erabaki zen / 24 2 ostalari edo gehiago baditu. Horrela, ibilbide kopurua ~ 100 milara murriztu zen. Honen gidoia jarraituko du.

domeinuak

Konplikatuagoa da eta hainbat modu daude. Esaterako, Squid garden bat instala dezakezu bezero-bideratzaile bakoitzean eta HTTP atzematea egin eta TLS esku-harremanean begiratu, lehen kasuan eskatutako URLa eta bigarrenean SNIren domeinua lortzeko.

Baina TLS1.3 + eSNI berrien ondorioz, HTTPS analisia gero eta errealagoa da egunero. Bai, eta bezeroaren aldetik azpiegitura gero eta konplikatuagoa da - gutxienez OpenWRT erabili beharko duzu.

Hori dela eta, DNS kontsulten erantzunak atzemateko bidea hartzea erabaki nuen. Hemen ere, edozein DNS-over-TLS / HTTPS zure buruaren gainetik pasatzen hasten da, baina (oraingoz) zati hau kontrolatu dezakegu bezeroan - desgaitu edo zure zerbitzaria erabili DoT / DoHrako.

Nola atzeman DNS?

Hemen ere hainbat planteamendu egon daitezke.

  • DNS trafikoa atzematea PCAP edo NFLOG bidez
    Atzemateko bi metodo hauek erabilgarritasunean inplementatzen dira sidmat. Baina denbora luzez ez da onartzen eta funtzionaltasuna oso primitiboa da, beraz, oraindik arnes bat idatzi behar duzu horretarako.
  • DNS zerbitzariaren erregistroen analisia
    Zoritxarrez, ezagutzen ditudan errekurtsoek ezin dituzte erantzunak erregistratu, eskaerak baizik. Printzipioz, hori logikoa da, izan ere, eskaerak ez bezala, erantzunek egitura konplexua dute eta zaila baita testu moduan idaztea.
  • DNSTap
    Zorionez, horietako askok dagoeneko onartzen dute DNSTap horretarako.

Zer da DNSTap?

Saihestu ILV blokeatzea DNSTap eta BGPrekin

Bezero-zerbitzariko protokolo bat da, DNS zerbitzari batetik DNS egituratutako kontsulta eta erantzunen biltzaile batera transferitzeko Protokolo Bufferetan eta Frame Stream-etan oinarrituta. Funtsean, DNS zerbitzariak kontsulten eta erantzunen metadatuak (mezu mota, bezero/zerbitzariaren IPa, etab.) gehi DNS mezu osoak transmititzen ditu haiekin lan egiten duen forma (bitarrean) sarean.

Garrantzitsua da ulertzea DNSTap paradigman, DNS zerbitzariak bezero gisa eta biltzaileak zerbitzari gisa jokatzen duela. Hau da, DNS zerbitzaria biltzailearekin konektatzen da, eta ez alderantziz.

Gaur egun DNSTap DNS zerbitzari ezagun guztietan onartzen da. Baina, adibidez, BIND banaketa askotan (Ubuntu LTS bezalakoa) askotan arrazoiren batengatik eraikitzen da bere laguntzarik gabe. Beraz, ez gaitezen berriro muntatzearekin kezkatu, baina hartu recursor arinagoa eta azkarragoa - Unbound.

Nola harrapatu DNSTap?

Ez dago batzuk zenbakia CLI utilitateak DNSTap gertaeren korronte batekin lan egiteko, baina ez dira egokiak gure arazoa konpontzeko. Horregatik, beharrezkoa den guztia egingo duen nire bizikleta asmatzea erabaki nuen: dnstap-bgp

Lan algoritmoa:

  • Abian jartzen denean, testu-fitxategi batetik domeinuen zerrenda kargatzen du, alderantzikatu egiten du (habr.com -> com.habr), lerro hautsiak, bikoiztuak eta azpidomeinuak baztertzen ditu (hau da, zerrendak habr.com eta www.habr.com baditu, lehenengoa bakarrik kargatuko da) eta aurrizki-zuhaitz bat eraikitzen du zerrenda honetan azkar bilatzeko
  • DNSTap zerbitzari gisa jardunez, DNS zerbitzari baten konexioaren zain dago. Printzipioz, UNIX eta TCP socketak onartzen ditu, baina ezagutzen ditudan DNS zerbitzariek UNIX socketak soilik erabil ditzakete.
  • Sarrerako DNSTap paketeak lehenik Protobuf egitura batean deserializatu egiten dira, eta gero DNS mezu bitarra bera, Protobuf eremuetako batean kokatuta, DNS RR erregistroen mailara analizatzen da.
  • Eskatutako ostalaria (edo bere domeinu nagusia) kargatutako zerrendan dagoen egiaztatzen da, hala ez bada, erantzuna ez da aintzat hartuko
  • Erantzuntik A/AAAA/CNAME RRak bakarrik hautatzen dira eta dagozkion IPv4/IPv6 helbideak ateratzen dira.
  • IP helbideak TTL konfiguragarriarekin gordetzen dira eta konfiguratutako BGP parekide guztiei iragartzen zaizkie
  • Dagoeneko cachean gordetako IP bat seinalatzen duen erantzuna jasotzen duzunean, bere TTL eguneratzen da
  • TTL iraungi ondoren, sarrera cachetik eta BGP iragarkietatik kentzen da

Funtzio gehigarriak:

  • SIGHUPek domeinuen zerrenda berrirakurtzen
  • Cachea beste instantzia batzuekin sinkronizatuta mantentzea dnstap-bgp HTTP/JSON bidez
  • Bikoiztu diskoko cachea (BoltDB datu-basean) berrabiarazi ondoren bere edukia leheneratzeko
  • Beste sareko izen-espazio batera aldatzeko laguntza (zergatik behar den azalduko da behean)
  • IPv6 euskarria

murrizketak:

  • IDN domeinuak ez dira onartzen oraindik
  • BGP ezarpen gutxi

bildu nuen RPM eta DEB erraz instalatzeko paketeak. Systemd duten sistema eragile berri samarretan funtzionatu beharko luke. ez dute inolako menpekotasunik.

Eskema

Beraz, has gaitezen osagai guztiak batera muntatzen. Ondorioz, sarearen topologia honen antzeko zerbait lortu beharko genuke:
Saihestu ILV blokeatzea DNSTap eta BGPrekin

Lanaren logika, nire ustez, argi ikusten da diagramatik:

  • Bezeroak DNS gisa konfiguratuta dauka gure zerbitzaria, eta DNS kontsultak ere VPN bidez joan behar dira. Hau beharrezkoa da hornitzaileak ezin dezan DNS atzematea erabili blokeatzeko.
  • Gunea irekitzean, bezeroak DNS kontsulta bat bidaltzen du "zein dira xxx.org-en IPak" bezalakoak?
  • Lotu gabe xxx.org konpontzen du (edo cachetik hartzen du) eta bezeroari erantzuna bidaltzen dio "xxx.org-ek halako eta halako IP du", paraleloki bikoiztuz DNSTap bidez.
  • dnstap-bgp urtean iragartzen ditu helbide hauek BIRD BGP bidez domeinua blokeatutako zerrendan badago
  • BIRD IP hauetarako ibilbide bat iragartzen du next-hop self bezeroen bideratzailea
  • Bezerotik IP hauetara datozen paketeak tuneletik igarotzen dira

Zerbitzarian, blokeatutako guneetarako ibilbideetarako, BIRD-en barruan taula bereizi bat erabiltzen dut eta ez du inolaz ere OSarekin gurutzatzen.

Eskema honek eragozpen bat du: bezeroaren lehen SYN paketeak, ziurrenik, etxeko hornitzailetik irteteko denbora izango du. ibilbidea ez da berehala iragartzen. Eta hemen aukerak posible dira hornitzaileak blokeoa egiten duenaren arabera. Trafikoa jaisten badu, ez dago arazorik. Eta DPI batzuetara birbideratzen badu, orduan (teorian) efektu bereziak posible dira.

Baliteke bezeroek DNS TTL mirariak errespetatzea ere, eta horrek bezeroak bere cache usteleko sarrera zaharkituak erabiltzea eragin dezake Unbound galdetu beharrean.

Praktikan, ez lehenak ez bigarrenak ez zidaten arazorik sortu, baina zure kilometrajea alda daiteke.

Zerbitzariaren sintonizazioa

Errodatzeko erraztasunagatik, idatzi nuen Ansibleren rola. Linux-en oinarritutako zerbitzariak eta bezeroak konfigura ditzake (deb-en oinarritutako banaketarako diseinatua). Ezarpen guztiak nahiko agerikoak dira eta ezarrita daude inbentarioa.yml. Rol hau nire jolas liburu handitik moztuta dago, beraz, akatsak izan ditzake - eskatu ongi etorri πŸ™‚

Goazen osagai nagusietatik.

Bgp

Ostalari berean bi BGP deabru exekutatzeak oinarrizko arazo bat du: BIRD-ek ez du BGP parekatzea nahi lokaleko ostalariarekin (edo edozein interfaze lokalarekin). Hitzetik batere. Google-k eta posta-zerrendak irakurtzeak ez zuen lagundu, hau diseinuz dela diote. Beharbada badago moduren bat, baina ez nuen aurkitu.

Beste BGP deabru bat probatu dezakezu, baina BIRD gustatzen zait eta nonahi erabiltzen dut, ez dut entitaterik sortu nahi.

Hori dela eta, dnstap-bgp sareko izen-eremuaren barruan ezkutatu nuen, errora veth interfazearen bidez konektatuta dagoena: hodi baten modukoa da, zeinaren muturrak izen-espazio ezberdinetan irteten direlarik. Mutur horietako bakoitzean, ostalaritik haratago doazen p2p IP helbide pribatuak zintzilikatzen ditugu, edozer izan daitezen. Barruko prozesuetara sartzeko erabiltzen den mekanismo bera da denek maitatua Docker eta beste edukiontzi batzuk.

Horretarako idatzi zen gidoia eta dnstap-bgp-era gehitu zen goian lehendik deskribatutako funtzionaltasuna iletik arrastatu beste izen-espazio batera. Horregatik, root gisa exekutatu behar da edo CAP_SYS_ADMIN bitarrari eman behar zaio setcap komandoaren bidez.

Izen-espazioa sortzeko script adibidea

#!/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",
]

txoria.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

Lehenespenez, Ubuntun, Unbound bitarra AppArmor profilak atxikitzen du, eta horrek DNSTap socket mota guztietara konektatzea debekatzen du. Profil hau ezabatu edo desgai dezakezu:

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

Hau seguruenik playbook-era gehitu beharko litzateke. Ideala da, noski, profila zuzentzea eta beharrezko eskubideak ematea, baina alferra nengoen.

lotu gabe.konf

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

Zerrendak deskargatu eta prozesatzea

IP helbideen zerrenda deskargatzeko eta prozesatzeko scripta
Zerrenda deskargatzen du, aurrizkiarekin laburtzen du pfx. Urtean ez_gehitu ΠΈ ez_laburtu IP eta sareei esan diezaiekezu saltatzeko edo laburtzeko. Behar nuen. nire VPSaren azpisarea blokeo zerrendan zegoen πŸ™‚

Dibertigarria da RosKomSvoboda APIak eskaerak blokeatzen dituela Python erabiltzaile-agente lehenetsiarekin. Badirudi gidoi-umeak lortu duela. Horregatik, Ognelis-era aldatzen dugu.

Orain arte, IPv4rekin bakarrik funtzionatzen du. IPv6-ren kuota txikia da, baina erraza izango da konpontzea. Bird6 ere erabili behar ez baduzu behintzat.

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)

Eguneratzeko gidoia
Koroan exekutatzen dut egunean behin, agian merezi du 4 ordutik behin tiratzea. hau da, nire ustez, RKNk hornitzaileei eskatzen dien berritze epea. Gainera, premiazko beste blokeo batzuk dituzte, azkarrago iritsi daitezkeenak.

Honako hau egiten du:

  • Lehenengo script-a exekutatzen du eta ibilbideen zerrenda eguneratzen du (rkn_routes.list) TXORIarentzat
  • Berriz kargatu BIRD
  • Dnstap-bgp-ren domeinuen zerrenda eguneratzen eta garbitzen du
  • Kargatu berriro 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

Asko pentsatu gabe idatzi ziren, beraz, hobetu daitekeen zerbait ikusten baduzu, zoaz.

Bezeroaren konfigurazioa

Hemen Linux bideratzaileentzako adibideak emango ditut, baina Mikrotik / Ciscoren kasuan are errazagoa izan beharko litzateke.

Lehenik eta behin, BIRD ezarri dugu:

txoria.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;
}

Horrela, BGPtik jasotako ibilbideak kernelaren bideratze-taularen 222 zenbakiarekin sinkronizatuko ditugu.

Horren ondoren, nahikoa da nukleoari plaka hau begiratzeko eskatzea lehenetsitakoa begiratu aurretik:

# 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

Dena, bideratzailean DHCP konfiguratzea geratzen da zerbitzariaren tunelaren IP helbidea DNS gisa banatzeko, eta eskema prest dago.

Mugak

Domeinuen zerrenda sortzeko eta prozesatzeko egungo algoritmoarekin, besteak beste, youtube.com eta bere CDNak.

Eta horrek bideo guztiak VPN bidez pasako direla dakar, eta horrek kanal osoa oztopatu dezake. Agian merezi du oraingoz RKN blokeatzen duten domeinu-bazterketa ezagunen zerrenda osatzea, erraiak meheak dira. Eta saltatu itzazu analizatzerakoan.

Ondorioa

Deskribatutako metodoak hornitzaileek gaur egun ezartzen duten ia edozein blokeo saihesteko aukera ematen du.

Printzipioz, dnstap-bgp Domeinu-izenaren arabera trafiko-kontrol mailaren bat behar den beste edozein helburutarako erabil daiteke. Kontuan izan, gure garaian, mila gune IP helbide berean zintzilikatu daitezkeela (Cloudflare batzuen atzean, adibidez), beraz, metodo honek zehaztasun baxu samarra du.

Baina sarrailak saihesteko beharretarako, nahikoa da hau.

Gehiketak, aldaketak, tira eskaerak - ongi etorri!

Iturria: www.habr.com

Gehitu iruzkin berria