Bypass ny fanakanana ILV miaraka amin'ny DNSTap sy BGP
Tena voadaroka ny lohahevitra, fantatro. Ohatra, misy lehibe lahatsoratra, fa ny ampahany IP amin'ny lisitry ny sakana ihany no raisina ao. Hanampy sehatra ihany koa izahay.
Noho ny zava-misy fa ny fitsarana sy ny RKN dia manakana ny zava-drehetra avy amin'ny havanana sy ankavia, ary ny mpanome tolotra dia miezaka mafy tsy ho tafiditra amin'ny lamandy navoakan'ny Revizorro, ny fatiantoka mifandraika amin'ny fanakanana dia tena goavana. Ary ao anatin'ireo tranokala voasakana "ara-dalΓ na" dia misy maro mahasoa (salama, rutracker)
Mipetraka ivelan'ny fari-piadidian'ny RKN aho, saingy nijanona tao an-trano ny ray aman-dreniko sy ny havako ary ny namako. Noho izany dia nanapa-kevitra ny hamorona fomba mora ho an'ny olona lavitra ny IT mba hialana amin'ny fanakanana, indrindra raha tsy misy ny fandraisan'izy ireo anjara.
Amin'ity naoty ity dia tsy hamaritra ireo zavatra fototra amin'ny tambajotra aho amin'ny dingana, fa hamaritra ny fitsipika ankapobeny amin'ny fomba fampiharana io tetika io. Noho izany dia tsy maintsy manana ny fahalalana ny fomba fiasan'ny tambajotra amin'ny ankapobeny ary amin'ny Linux manokana.
Karazana hidin-trano
Andeha aloha hamelombelona ny fitadidiantsika izay voasakana.
Misy karazana hidin-trano maromaro ao amin'ny XML tsy misy entana avy amin'ny RKN:
IP
ΠΠΎΠΌΠ΅Π½
URL
Ho an'ny fahatsorana, ahenanay ho roa izy ireo: IP sy sehatra, ary hesorinay fotsiny ilay sehatra tsy hanakana amin'ny alΓ lan'ny URL (ny marimarina kokoa, efa nanao izany ho antsika izy ireo).
Mba hanaovana izany dia mila VPS kely vahiny isika, indrindra amin'ny fifamoivoizana tsy misy fetra - misy maro amin'izy ireo amin'ny 3-5 bucks. Mila maka an'io any an-dafy akaiky ianao mba tsy dia lehibe loatra ny ping, fa avereno jerena fa tsy mifanojo foana ny Internet sy ny jeografia. Ary satria tsy misy SLA ho an'ny vola 5, tsara kokoa ny maka ampahany 2+ avy amin'ny mpamatsy samihafa ho an'ny fandeferana diso.
Manaraka izany dia mila manangana tonelina miafina avy amin'ny router mpanjifa mankany amin'ny VPS isika. Mampiasa Wireguard aho ho haingana sy mora indrindra apetraka. Manana router mpanjifa mifototra amin'ny Linux ihany koa aho (APU2 na zavatra ao amin'ny OpenWRT). Amin'ny tranga sasany amin'ny Mikrotik / Cisco, azonao atao ny mampiasa ny protocoles misy amin'izy ireo toy ny OpenVPN sy GRE-over-IPSEC.
Famantarana sy famerenana ny fifamoivoizana mahaliana
Azonao atao, mazava ho azy, ny mamono ny fifamoivoizana amin'ny Internet amin'ny firenena vahiny. Saingy, azo inoana fa hijaly mafy amin'izany ny hafainganan'ny fiasana amin'ny votoaty eo an-toerana. Ambonin'izany, ny fepetra takian'ny bandwidth amin'ny VPS dia ho avo kokoa.
Noho izany, mila mizara ny fifamoivoizana amin'ny tranokala voasakana isika ary mivantana mivantana mankany amin'ny tonelina. Na dia tonga any aza ny sasany amin'ny fifamoivoizana "fanampiny", dia mbola tsara lavitra noho ny mitondra ny zava-drehetra amin'ny tonelina.
Mba hitantana ny fifamoivoizana dia hampiasa ny protocol BGP izahay ary hanambara ny lalana mankany amin'ireo tambajotra ilaina avy amin'ny VPS mankany amin'ny mpanjifa. Andeha horaisintsika ho iray amin'ireo daemon BGP miasa sy mora indrindra ny BIRD.
IP
Miaraka amin'ny fanakanana amin'ny alΓ lan'ny IP, mazava ny zava-drehetra: manambara fotsiny ireo IP voasakana rehetra miaraka amin'ny VPS izahay. Ny olana dia misy subnets 600 arivo eo ho eo ao amin'ny lisitra averin'ny API, ary ny ankamaroan'izy ireo dia / 32 mpampiantrano. Ity isan'ny lalana ity dia mety hampifangaro ny router mpanjifa malemy.
Noho izany, rehefa manamboatra ny lisitra dia nanapa-kevitra ny hamintina ny tambajotra / 24 raha manana mpampiantrano 2 na mihoatra. Araka izany, nahena ho ~100 arivo ny isanβny zotra. Ny script amin'izany dia ho avy.
sehatra
Sarotra kokoa izany ary misy fomba maro. Ohatra, azonao atao ny mametraka Squid mangarahara amin'ny router mpanjifa tsirairay ary manao interception HTTP ao ary mijery ny tΓ nana TLS mba hahazoana ny URL nangatahana amin'ny tranga voalohany ary ny sehatra avy amin'ny SNI amin'ny faharoa.
Saingy noho ny karazana TLS1.3 + eSNI vaovao rehetra, ny fanadihadiana HTTPS dia miha-mihena isan'andro. Eny, ary mihasarotra kokoa ny fotodrafitrasa eo amin'ny lafiny mpanjifa - tsy maintsy mampiasa OpenWRT farafaharatsiny ianao.
Noho izany, nanapa-kevitra aho fa handeha amin'ny lalan'ny fanelanelanana valiny amin'ny fangatahana DNS. Eto koa, manomboka mihodinkodina eo ambonin'ny lohanao ny DNS-over-TLS / HTTPS, saingy azontsika atao (amin'izao fotoana izao) mifehy an'io ampahany io amin'ny mpanjifa - na manafoana izany na mampiasa ny servero manokana ho an'ny DoT / DoH.
Ahoana no hanakana ny DNS?
Eto koa dia mety misy fomba fiasa maromaro.
Fanakanana ny fifamoivoizana DNS amin'ny PCAP na NFLOG
Ireo fomba fisakanana roa ireo dia ampiharina amin'ny utility sidmat. Saingy efa ela no tsy nanohana azy ary tena primitive ny fiasa, ka mbola mila manoratra harness ho azy ianao.
Famakafakana ny logs server DNS
Indrisy anefa fa ny recursors fantatro dia tsy afaka misoratra anarana valiny, fa ny fangatahana ihany. Amin'ny ankapobeny, lojika izany, satria, tsy toy ny fangatahana, ny valiny dia manana rafitra sarotra ary sarotra ny manoratra azy ireo amin'ny endrika lahatsoratra.
DNSTap
Soa ihany fa maro amin'izy ireo no efa manohana ny DNSTap amin'ity tanjona ity.
Inona no atao hoe DNSTap?
Izy io dia protocole client-server mifototra amin'ny Protocol Buffers and Frame Streams ho an'ny famindrana avy amin'ny mpizara DNS mankany amin'ny mpanangona fanontaniana sy valiny DNS voarafitra. Amin'ny ankapobeny, ny mpizara DNS dia mandefa metadata fanontaniana sy valiny (karazana hafatra, IP client/server, sns.) miampy hafatra DNS feno ao amin'ny endrika (binary) izay iarahany amin'izy ireo amin'ny tambajotra.
Zava-dehibe ny mahatakatra fa ao amin'ny paradigma DNSTap, ny mpizara DNS dia miasa toy ny mpanjifa ary ny mpanangona dia miasa ho mpizara. Izany hoe, ny mpizara DNS dia mifandray amin'ny mpanangona, fa tsy ny mifamadika amin'izany.
Ankehitriny DNSTap dia tohanana amin'ny mpizara DNS malaza rehetra. Saingy, ohatra, ny BIND amin'ny fizarana maro (toa an'i Ubuntu LTS) dia matetika natsangana noho ny antony tsy misy fanohanana azy. Koa aoka isika tsy hanahirana amin'ny reassembly, fa haka recursor maivana sy haingana kokoa - Unbound.
Ahoana no hisambotra DNSTap?
Misy SASANYΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Fitaovana CLI hiasa amin'ny hetsika DNSTap, saingy tsy mety amin'ny famahana ny olanay. Noho izany, nanapa-kevitra ny hamorona ny bisikiletako manokana aho izay hanao izay rehetra ilaina: dnstap-bgp
Algorithm asa:
Rehefa natomboka dia mameno lisitr'ireo sehatra avy amin'ny rakitra lahatsoratra, mamadika azy ireo (habr.com -> com.habr), manilika tsipika tapaka, duplicates ary subdomains (izany hoe raha misy habr.com sy www.habr.com ny lisitra, ny voalohany ihany no hampidirana azy) ary hanangana hazo tovana ho an'ny fikarohana haingana amin'ity lisitra ity
Miasa ho mpizara DNSTap, miandry fifandraisana avy amin'ny mpizara DNS. Amin'ny ankapobeny dia samy manohana ny socket UNIX sy TCP izy, fa ny server DNS fantatro dia tsy afaka mampiasa afa-tsy ny socket UNIX.
Ny fonosan'ny DNSTap miditra dia avadika ho rafitra Protobuf aloha, ary avy eo ny hafatra DNS binary, izay hita ao amin'ny iray amin'ireo sahan'ny Protobuf, dia averina amin'ny haavon'ny rakitra DNS RR.
Voamarina raha ao anatin'ny lisitra feno ny mpampiantrano nangatahana (na ny sahan'ny ray aman-dreniny), raha tsy izany dia tsy raharahaina ny valiny
A/AAAA/CNAME RRs ihany no voafantina avy amin'ny valinteny ary ny adiresy IPv4/IPv6 mifanaraka aminy dia alaina avy amin'izy ireo.
Ny adiresy IP dia voatahiry miaraka amin'ny TTL azo amboarina ary avoaka amin'ny BGP mitovy amin'ny rehetra
Rehefa mahazo valiny manondro IP efa voatahiry dia havaozina ny TTL azy
Rehefa tapitra ny TTL dia esorina amin'ny cache sy amin'ny fanambarana BGP ny fidirana
Fampiasa fanampiny:
Famerenana ny lisitry ny sehatra nataon'i SIGHUP
Mitazona ny cache mifanaraka amin'ny tranga hafa dnstap-bgp amin'ny HTTP/JSON
Avereno kopia ny cache amin'ny kapila (ao amin'ny tahiry BoltDB) hamerenana ny ao anatiny aorian'ny fanombohana
Fanohanana amin'ny fifindrana any amin'ny sehatra anaram-baovao hafa (holazaina eto ambany ny antony ilana izany)
fanohanana IPv6
fameperana:
Tsy mbola tohanana ny sehatra IDN
Vitsy ny fikandrana BGP
nanangona aho RPM sy DEB fonosana ho mora fametrahana. Tokony hiasa amin'ny OS rehetra vao haingana miaraka amin'ny systemd. tsy manana fiankinan-doha izy ireo.
Ny tetika
Noho izany, andeha isika hanomboka hanangona ny singa rehetra. Vokatr'izany dia tokony hahazo zavatra toy ity topolojia tambajotra ity isika:
Ny lojikan'ny asa, heveriko, dia mazava amin'ny kisary:
Namboarina ho DNS ny mpizara anay, ary tsy maintsy mandeha amin'ny VPN ihany koa ny fangatahana DNS. Ilaina izany mba tsy ahafahan'ny mpamatsy mampiasa DNS interception hanakana.
Rehefa manokatra ny tranokala, ny mpanjifa dia mandefa fanontaniana DNS toy ny hoe "inona ny IP an'ny xxx.org"
Unbound mamaha ny xxx.org (na maka azy ao amin'ny cache) ary mandefa valiny amin'ny mpanjifa "xxx.org manana IP toy izany sy izany", mandika izany amin'ny alΓ lan'ny DNSTap
dnstap-bgp manambara ireo adiresy ao MATOKY amin'ny alΓ lan'ny BGP raha ao anaty lisitra voasakana ny sehatra
MATOKY manao dokambarotra lalana mankany amin'ireo IP ireo miaraka amin'ny next-hop self mpanjifa ny router
Ny fonosana manaraka avy amin'ny mpanjifa mankany amin'ireo IP ireo dia mandalo amin'ny tonelina
Ao amin'ny mpizara, ho an'ny lalana mankany amin'ny tranokala voasakana, mampiasa latabatra misaraka ao anaty BIRD aho ary tsy mifandray amin'ny OS amin'ny fomba rehetra.
Ity rafitra ity dia manana tsy fahampiana: ny fonosana SYN voalohany avy amin'ny mpanjifa, azo inoana fa hanana fotoana hialana amin'ny alΓ lan'ny mpamatsy an-trano. tsy voalaza avy hatrany ny lalana. Ary eto dia azo atao ny safidy arakaraka ny fomba ataon'ny mpamatsy ny fanakanana. Raha mandroaka fifamoivoizana fotsiny izy dia tsy misy olana. Ary raha averina amin'ny DPI sasany izy, dia azo atao ny vokatra manokana (ara-teorika).
Mety tsy hanaja ny fahagagana DNS TTL koa ny mpanjifa, izay mety hahatonga ny mpanjifa hampiasa ireo fidirana efa simba avy amin'ny cache lovany fa tsy manontany ny Unbound.
Amin'ny fampiharana, na ny voalohany na ny faharoa dia tsy niteraka olana tamiko, fa ny mileage dia mety miovaova.
Tuning Server
Ho fanamorana ny fihodinana dia nanoratra aho anjara asan'ny Ansible. Izy io dia afaka manamboatra ny mpizara sy ny mpanjifa mifototra amin'ny Linux (natao ho an'ny fizarana mifototra amin'ny deb). Ny fanovana rehetra dia mazava tsara ary napetraka ao inventory.yml. Ity anjara asa ity dia nesorina tao amin'ny boky filalaovana lehibe, ka mety misy hadisoana - mangataka fangatahana tongasoa π
Andeha hojerentsika ireo singa fototra.
BGP
Rehefa mampandeha daemon BGP roa amin'ny mpampiantrano iray ihany, dia misy olana fototra: tsy te hanomboka BGP mijery amin'ny localhost ny BIRD (na amin'ny interface eo an-toerana). Avy amin'ny teny mihitsy. Tsy nanampy ny googling sy ny famakiana mailaka, nilaza izy ireo fa noforonina izany. Angamba misy fomba iray, saingy tsy hitako.
Azonao atao ny manandrana daemon BGP hafa, fa tiako ny BIRD ary ampiasainy na aiza na aiza izy io, tsy te hamokatra entity aho.
Noho izany dia nanafina ny dnstap-bgp aho tao anatin'ny toeran'ny tambajotra, izay mifandray amin'ny fakany amin'ny alΓ lan'ny interface veth: toy ny sodina izy io, izay mipetaka amin'ny sehatra samihafa ny tendrony. Amin'ny tsirairay amin'ireo fiafarana ireo dia manantona adiresy IP p2p manokana izay tsy mihoatra ny mpampiantrano, ka mety ho na inona na inona izy ireo. Io ihany no mekanika ampiasaina amin'ny fidirana amin'ireo dingana ao anatiny tianβny rehetra Docker sy container hafa.
Fa izany no nanoratana teny ary nampiana dnstap-bgp ny fampiasa efa voalaza etsy ambony amin'ny fitarihana ny tenanao amin'ny volonao mankany amin'ny toeran'ny anarana hafa. Noho izany dia tsy maintsy atao ho faka na avoaka amin'ny binary CAP_SYS_ADMIN amin'ny alΓ lan'ny baiko setcap.
Ohatra script amin'ny famoronana namespace
#!/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
Ity angamba no tokony ampiana amin'ny playbook. Tena tsara, mazava ho azy, ny manitsy ny mombamomba sy ny famoahana ny zo ilaina, fa kamo loatra aho.
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
Misintona sy manodina lisitra
Script ho fampidinana sy fanodinana lisitry ny adiresy IP
Izy io dia misintona ny lisitra, mamintina ny prefix pfx. The dont_add ΠΈ dont_summarize azonao atao ny milaza ny IP sy ny tambajotra mba hitsingevana na tsy hamintina. nilaiko izany. Ny subnet an'ny VPS-ko dia tao amin'ny lisitry ny sakana π
Ny mahatsikaiky dia ny RosKomSvoboda API dia manakana ny fangatahana amin'ny mpampiasa mpampiasa Python default. Toa nahazo ilay script-kiddy. Noho izany dia novainay ho Ognelis izany.
Hatreto dia tsy miasa afa-tsy amin'ny IPv4 izy io. kely ny ampahany amin'ny IPv6, saingy ho mora amboarina izany. Raha tsy hoe tsy maintsy mampiasa bird6 koa ianao.
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 havaozina
Manao izany amin'ny satroboninahitra aho indray mandeha isan'andro, angamba mendrika ny misintona azy isaky ny 4 ora. izany, araka ny hevitro, dia ny fe-potoana fanavaozana takian'ny RKN amin'ny mpamatsy. Fanampin'izay, manana fanakanana hafa maika izy ireo, izay mety ho tonga haingana kokoa.
Manao ireto manaraka ireto:
Mandeha ny script voalohany ary manavao ny lisitry ny lalana (rkn_routes.list) ho an'ny BIRD
Avereno indray ny BIRD
Manavao sy manadio ny lisitry ny sehatra ho an'ny dnstap-bgp
Avereno indray ny 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
Nosoratana tsy nisy fieritreretana firy izy ireo, ka raha mahita zavatra azo hatsaraina ianao dia mandehana.
Fametrahana mpanjifa
Eto aho dia hanome ohatra ho an'ny router Linux, fa raha ny Mikrotik / Cisco dia tokony ho mora kokoa izany.
Voalohany, nanangana BIRD izahay:
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;
}
Aorian'izay dia ampy ny mangataka ny kernel hijery ity takelaka ity alohan'ny hijerena ny 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
Ny zava-drehetra, dia mijanona ny manitsy ny DHCP amin'ny router mba hizara ny adiresy IP an'ny mpizara ho DNS, ary vonona ny drafitra.
fahadisoana
Miaraka amin'ny algorithm amin'izao fotoana izao amin'ny famoronana sy fanodinana ny lisitry ny sehatra, dia ahitana, ankoatry ny zavatra hafa, youtube.com sy ny CDNs.
Ary izany dia mitarika ho amin'ny zava-misy fa ny horonan-tsary rehetra dia handeha amin'ny alalan'ny VPN, izay mety hanakana ny fantsona manontolo. Angamba mendrika ny hanangona lisitr'ireo sehatra malaza-fanilihana izay manakana ny RKN amin'izao fotoana izao, manify ny tsinay. Ary atsipazo izy ireo rehefa mamaky.
famaranana
Ny fomba voalaza dia ahafahanao mandingana saika ny fanakanana rehetra ataon'ny mpamatsy amin'izao fotoana izao.
Amin 'ny fitsipika, dnstap-bgp dia azo ampiasaina amin'ny tanjona hafa izay ilΓ na ny fanaraha-maso ny fifamoivoizana mifototra amin'ny anaran'ny sehatra. Ataovy ao an-tsaina fotsiny fa amin'izao androntsika izao, tranokala an'arivony dia afaka mihantona amin'ny adiresy IP mitovy (ao ambadiky ny Cloudflare sasany, ohatra), noho izany dia manana fahamendrehana kely io fomba io.
Saingy ho an'ny filΓ na amin'ny fanidiana hidy dia ampy izany.