Шумо албатта метавонед тамоми трафики интернетиро тавассути кишварҳои хориҷӣ хомӯш кунед. Аммо, ба эҳтимоли зиёд, суръати кор бо мундариҷаи маҳаллӣ аз ин хеле зарар хоҳад дид. Ғайр аз он, талаботҳои фарохмаҷро дар VPS хеле баландтар хоҳанд буд.
Аз ин рӯ, ба мо лозим меояд, ки трафикро ба сайтҳои басташуда ҷудо кунем ва онро интихобан ба нақб равона кунем. Ҳатто агар як қисми трафики "иловагӣ" ба он ҷо расад, он ҳанӯз ҳам беҳтар аз рондани ҳама чиз тавассути нақб аст.
Барои идоракунии трафик, мо протоколи BGP-ро истифода мебарем ва масирҳоро ба шабакаҳои зарурӣ аз VPS ба мизоҷон эълон мекунем. Биёед BIRD-ро ҳамчун яке аз демонҳои функсионалӣ ва қулайи BGP гирем.
IP
Бо бастани IP, ҳама чиз равшан аст: мо танҳо ҳама IP-ҳои басташударо бо VPS эълон мекунем. Мушкилот дар он аст, ки дар рӯйхат тақрибан 600 ҳазор зершабақаҳо мавҷуданд, ки API бармегардонанд ва аксарияти куллии онҳо /32 мизбон мебошанд. Ин шумораи масирҳо метавонад роутерҳои муштарии заифро иштибоҳ кунад.
Аз ин рӯ, ҳангоми коркарди рӯйхат тасмим гирифта шуд, ки то шабака / 24 ҷамъбаст карда шавад, агар он 2 ё зиёда ҳост дошта бошад. Ҳамин тариқ, шумораи хатсайрҳо то ~ 100 ҳазор кам карда шуд. Скрипт барои ин пайравӣ хоҳад кард.
Доменҳо
Ин мураккабтар аст ва якчанд роҳ вуҷуд дорад. Масалан, шумо метавонед Squid-и шаффофро дар ҳар як роутери муштарӣ насб кунед ва дар он ҷо HTTP муҳосира кунед ва ба дастфишори TLS нигаред, то дар ҳолати аввал URL-и дархостшуда ва домени SNI дар дуюм ба даст оред.
Аммо аз сабаби ҳама навъҳои нави TLS1.3 + eSNI, таҳлили HTTPS рӯз аз рӯз камтар ва камтар воқеӣ мешавад. Бале, ва инфрасохтор дар тарафи муштарӣ мураккабтар мешавад - шумо бояд ҳадди аққал OpenWRT-ро истифода баред.
Дар ин ҷо низ метавонад якчанд равиш вуҷуд дошта бошад.
Боздошти трафики DNS тавассути PCAP ё NFLOG
Ҳардуи ин усулҳои дастгиркунӣ дар хидматрасонӣ амалӣ карда мешаванд сидмат. Аммо он муддати тӯлонӣ дастгирӣ намешавад ва функсия хеле ибтидоӣ аст, бинобар ин ба шумо лозим меояд, ки барои он як асбоб нависед.
Таҳлили гузоришҳои сервери DNS
Мутаассифона, рекурсорҳое, ки ба ман маълуманд, наметавонанд посухҳоро сабт кунанд, балки танҳо дархостҳо. Аслан, ин мантиқист, зеро бар хилофи дархостҳо, ҷавобҳо сохтори мураккаб доранд ва навиштани онҳо дар шакли матн душвор аст.
DNSTap
Хушбахтона, бисёре аз онҳо аллакай DNSTap-ро бо ин мақсад дастгирӣ мекунанд.
DNSTap чист?
Ин як протоколи муштарӣ-сервер аст, ки ба буферҳои протокол ва ҷараёнҳои чаҳорчӯба барои интиқол аз сервери DNS ба коллектори дархостҳо ва посухҳои сохтории DNS асос ёфтааст. Аслан, сервери DNS метамаълумоти дархост ва посухро (навъи паём, мизоҷ/сервер ва ғ.) ва инчунин паёмҳои мукаммали DNS-ро дар шакли (бинарӣ), ки дар он бо онҳо тавассути шабака кор мекунад, интиқол медиҳад.
Фаҳмидани он муҳим аст, ки дар парадигмаи DNSTap сервери DNS ҳамчун муштарӣ ва коллектор ҳамчун сервер амал мекунад. Яъне сервери DNS ба коллектор пайваст мешавад, на баръакс.
Имрӯз DNSTap дар ҳама серверҳои маъмули DNS дастгирӣ карда мешавад. Аммо, масалан, BIND дар бисёр дистрибюсияҳо (ба монанди Ubuntu LTS) аксар вақт бо ягон сабаб бидуни дастгирии он сохта мешавад. Пас, биёед бо аз нав васлкунӣ ташвиш надиҳем, балки рекурсори сабуктар ва тезтарро гирем - Unbound.
Чӣ тавр DNSTap-ро сайд кардан мумкин аст?
вуҷуд доранд баъзеколичество Утилитҳои CLI барои кор бо ҷараёни рӯйдодҳои DNSTap, аммо онҳо барои ҳалли мушкилоти мо мувофиқ нестанд. Аз ин рӯ, ман қарор додам, ки велосипеди шахсии худро ихтироъ кунам, ки ҳама чизи заруриро иҷро мекунад: dnstap-bgp
Алгоритми кор:
Ҳангоми оғозёбӣ, он рӯйхати доменҳоро аз файли матнӣ бор мекунад, онҳоро тағир медиҳад (habr.com -> com.habr), сатрҳои шикаста, такрорӣ ва зердоменҳоро истисно мекунад (яъне агар рӯйхат habr.com ва www.habr.com дошта бошад, он танҳо аввалин бор карда мешавад) ва дарахти префиксро барои ҷустуҷӯи зуд тавассути ин рӯйхат месозад
Он ҳамчун сервери DNSTap амал карда, интизори пайвастшавӣ аз сервери DNS аст. Аслан, он ҳам розеткаҳои UNIX ва TCP-ро дастгирӣ мекунад, аммо серверҳои DNS, ки ман медонам, метавонанд танҳо розеткаҳои UNIX-ро истифода баранд.
Пакетҳои воридотии DNSTap аввал ба сохтори Protobuf бесериализатсия карда мешаванд ва сипас худи паёми DNS дуӣ, ки дар яке аз майдонҳои Protobuf ҷойгир аст, ба сатҳи сабтҳои DNS RR таҳлил карда мешавад.
Мизоҷ сервери моро ҳамчун DNS танзим кардааст ва дархостҳои DNS низ бояд тавассути VPN гузаранд. Ин барои он зарур аст, ки провайдер барои бастани боздошти DNS истифода набарад.
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
Зеркашӣ ва коркарди рӯйхатҳо
Скрипт барои зеркашӣ ва коркарди рӯйхати суроғаҳои IP
Он рӯйхатро зеркашӣ мекунад, ба префикс ҷамъбаст мекунад pfx. Дар илова накунед и ҷамъбаст накунед шумо метавонед ба IP ва шабакаҳо бигӯед, ки гузаред ё ҷамъбаст накунед. ба ман лозим буд. зершабакаи VPS-и ман дар рӯйхати блокҳо буд 🙂
Аҷиб дар он аст, ки API RosKomSvoboda дархостҳоро бо агенти корбари пешфарзи Python блок мекунад. Чунин ба назар мерасад, ки скрипт-кудак онро гирифтааст. Аз ин рӯ, мо онро ба Ognelis иваз мекунем.
То ҳол, он танҳо бо IPv4 кор мекунад. ҳиссаи IPv6 хурд аст, аммо ислоҳ кардани он осон хоҳад буд. Агар шумо набояд якди6-ро истифода баред.
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)
Скрипт барои навсозӣ
Ман онро дар як рӯз як маротиба дар болои тоҷ медаванд, шояд он меарзад, ки онро ҳар 4 соат кашем. ин, ба андешаи ман, давраи навсозӣ аст, ки RKN аз провайдерҳо талаб мекунад. Илова бар ин, онҳо боз як бастаи фаврии фаврӣ доранд, ки метавонанд зудтар ба даст оянд.
Рӯйхати доменҳоро барои dnstap-bgp навсозӣ ва тоза мекунад
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
Онҳо бе андешаи зиёд навишта шудаанд, бинобар ин, агар шумо чизеро бинед, ки беҳтар карда мешавад - ба он равед.
Танзимоти муштарӣ
Дар ин ҷо ман барои роутерҳои Linux мисолҳо хоҳам дод, аммо дар мавриди Mikrotik / Cisco он бояд боз ҳам осонтар бошад.
Аввалан, мо 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;
}
Ҳамин тариқ, мо масирҳои аз BGP гирифташударо бо ҷадвали масиркунии ядрои рақами 222 ҳамоҳанг хоҳем кард.
Пас аз он, кифоя аст, ки ядро пурсад, ки пеш аз дидани пешфарз ба ин лавҳа нигоҳ кунад:
# 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
Ҳама чиз барои танзим кардани DHCP дар роутер боқӣ мемонад, то суроғаи IP нақби серверро ҳамчун DNS паҳн кунад ва схема омода аст.
Нобудӣ
Бо алгоритми ҷорӣ барои тавлид ва коркарди рӯйхати доменҳо, он дар байни чизҳои дигарро дар бар мегирад, youtube.com ва CDN-ҳои он.