DNSTap болон BGP ашиглан ILV блоклохыг тойрч гарах

DNSTap болон BGP ашиглан ILV блоклохыг тойрч гарах

Сэдэв нэлээн зодуулж байна, би мэднэ. Жишээлбэл, агуу зүйл байдаг нийтлэл, гэхдээ зөвхөн блоклох жагсаалтын IP хэсгийг тэнд авч үзнэ. Бид мөн домэйн нэмэх болно.

Шүүхүүд болон RKN нь баруун, зүүн бүх зүйлийг хааж, үйлчилгээ үзүүлэгчид Ревизоррогийн торгууль төлөхгүй байхыг хичээж байгаа тул блоклохоос гарах алдагдал нэлээд их байна. Мөн "хууль ёсоор" хаагдсан сайтуудын дунд олон хэрэгтэй сайтууд байдаг (сайн уу, rutracker)

Би RKN-ийн харьяалалаас гадуур амьдардаг ч эцэг эх, хамаатан садан, найз нөхөд маань гэртээ үлдсэн. Тиймээс IT-ээс хол байгаа хүмүүст саад тотгорыг тойрч гарах хялбар аргыг олохоор шийдсэн бөгөөд тэдний оролцоогүй байсан нь дээр.

Энэ тэмдэглэлд би сүлжээний үндсэн зүйлсийг алхам алхмаар тайлбарлахгүй, гэхдээ энэ схемийг хэрхэн хэрэгжүүлэх ерөнхий зарчмуудыг тайлбарлах болно. Тиймээс сүлжээ ерөнхийдөө, ялангуяа Линукс дээр хэрхэн ажилладаг талаар мэдлэгтэй байх ёстой.

Түгжээний төрлүүд

Эхлээд юу хаагдсан тухай санах ойгоо сэргээцгээе.

RKN-ээс буулгасан XML-д хэд хэдэн төрлийн түгжээ байдаг:

  • IP
  • Домэйн нэр
  • URL

Энгийн байхын тулд бид тэдгээрийг хоёр болгон бууруулна: IP болон домэйн, бид зүгээр л URL хаягаар блоклохоос домэйныг татах болно (илүү нарийвчлалтай, тэд бидэнд үүнийг аль хэдийн хийсэн).

сайн хүмүүс Роскомсвобода гайхалтай хэрэгжүүлсэн API, үүгээр дамжуулан бид хэрэгцээтэй зүйлээ авах боломжтой:

Хаагдсан сайтуудад хандах

Үүнийг хийхийн тулд бидэнд хязгааргүй траффиктэй жижиг гадаад VPS хэрэгтэй - эдгээр нь 3-5 доллараар олон байдаг. Пинг нь тийм ч том биш байхын тулд та үүнийг ойрын гадаадад авах хэрэгтэй, гэхдээ Интернет болон газарзүй нь үргэлж давхцдаггүй гэдгийг дахин анхаарч үзээрэй. Мөн 5 долларын SLA байхгүй тул алдааг тэсвэрлэхийн тулд өөр өөр үйлчилгээ үзүүлэгчээс 2+ ширхэг авах нь дээр.

Дараа нь бид үйлчлүүлэгчийн чиглүүлэгчээс VPS рүү шифрлэгдсэн хонгилыг тохируулах хэрэгтэй. Би Wireguard-ийг хамгийн хурдан бөгөөд тохируулахад хялбар байдлаар ашигладаг, учир нь... Миний үйлчлүүлэгч чиглүүлэгчид бас Линукс дээр суурилсан (APU2 эсвэл OpenWRT дахь ямар нэгэн зүйл). Зарим Mikrotik / Cisco-ийн хувьд та OpenVPN болон GRE-over-IPSEC зэрэг дээр байгаа протоколуудыг ашиглаж болно.

Сонирхлын урсгалыг тодорхойлох, дахин чиглүүлэх

Мэдээжийн хэрэг, та гадаадын улс орнуудаар дамжуулан интернетийн бүх урсгалыг унтрааж болно. Гэхдээ орон нутгийн агуулгатай ажиллах хурд нь үүнээс ихээхэн хохирол амсах магадлалтай. Дээрээс нь VPS дээрх зурвасын өргөний шаардлага илүү өндөр байх болно.

Тиймээс бид ямар нэгэн байдлаар хаагдсан сайтууд руу траффик хуваарилж, туннел руу чиглүүлэх шаардлагатай болно. Хэдийгээр "нэмэлт" замын зарим хэсэг нь тэнд очсон ч энэ нь бүх зүйлийг хонгилоор жолоодохоос хамаагүй дээр юм.

Траффикийг зохицуулахын тулд бид BGP протоколыг ашиглаж, VPS-ээс үйлчлүүлэгчдэд шаардлагатай сүлжээнүүдийн маршрутыг сурталчлах болно. BIRD-ийг BGP дэмон болгон авч үзье, учир нь энэ нь хамгийн ажиллагаатай, тохиромжтой юм.

IP

IP-ээр блоклосноор бүх зүйл тодорхой байна: бид VPS-ээр хаасан бүх IP-г зарлах болно. Асуудал нь API-ийн буцаадаг жагсаалтад 600 мянга орчим дэд сүлжээнүүд байгаа бөгөөд тэдгээрийн дийлэнх нь /32 хост байдаг. Энэ тооны маршрут нь сул үйлчлүүлэгчийн чиглүүлэгчдийг төөрөлдүүлж болзошгүй юм.

Тиймээс жагсаалтыг боловсруулахдаа 24 ба түүнээс дээш хосттой бол сүлжээ / 2 хүртэл нэгтгэн дүгнэхээр шийдсэн. Тиймээс маршрутын тоог ~100 мянга болгож бууруулсан. Үүний скриптийг дагаж мөрдөх болно.

Домэйн

Энэ нь илүү төвөгтэй бөгөөд хэд хэдэн арга байдаг. Жишээлбэл, та үйлчлүүлэгчийн чиглүүлэгч бүр дээр ил тод Squid суулгаж, HTTP хөндлөнгийн оролцоог хийж, эхний тохиолдолд хүссэн URL хаягийг, хоёрдугаарт SNI-аас домэйныг авахын тулд TLS гар барих боломжтой.

Гэвч бүх төрлийн шинээр бий болсон TLS1.3 + eSNI-ийн улмаас HTTPS шинжилгээ өдөр бүр улам бүр багассаар байна. Тиймээ, үйлчлүүлэгчийн дэд бүтэц улам төвөгтэй болж байна - та дор хаяж OpenWRT ашиглах хэрэгтэй болно.

Тиймээс би DNS асуулгад хариу барих замыг сонгохоор шийдсэн. Энд ч гэсэн ямар ч DNS-over-TLS / HTTPS таны толгой дээр эргэлдэж эхэлдэг, гэхдээ бид (одоохондоо) клиент дээрх энэ хэсгийг хянах боломжтой - үүнийг идэвхгүй болгох эсвэл DoT / DoH-д өөрийн серверийг ашиглах боломжтой.

DNS-г хэрхэн таслах вэ?

Энд бас хэд хэдэн арга байж болно.

  • PCAP эсвэл NFLOG-ээр дамжуулан DNS урсгалыг саатуулах
    Эдгээр таслан зогсоох аргыг хоёуланг нь хэрэгсэлд хэрэгжүүлдэг сидмат. Гэхдээ энэ нь удаан хугацаанд дэмжигдээгүй бөгөөд функциональ байдал нь маш энгийн тул та үүнд зориулж бэхэлгээ бичих хэрэгтэй.
  • DNS серверийн бүртгэлд дүн шинжилгээ хийх
    Харамсалтай нь, миний мэддэг рекурсорууд хариултыг бүртгэх боломжгүй, гэхдээ зөвхөн хүсэлтийг бүртгэдэг. Зарчмын хувьд энэ нь логик юм, учир нь хүсэлтээс ялгаатай нь хариултууд нь нарийн төвөгтэй бүтэцтэй бөгөөд тэдгээрийг текст хэлбэрээр бичихэд хэцүү байдаг.
  • DNSTap
    Аз болоход тэдний олонх нь энэ зорилгоор DNSTap-ийг аль хэдийн дэмждэг.

DNSTap гэж юу вэ?

DNSTap болон BGP ашиглан ILV блоклохыг тойрч гарах

Энэ нь DNS серверээс бүтэцлэгдсэн DNS асуулга, хариулт цуглуулагч руу шилжүүлэхэд зориулагдсан Протоколын буфер ба Frame Streams дээр суурилсан клиент-серверийн протокол юм. Үндсэндээ DNS сервер нь асуулга болон хариултын мета өгөгдлийг (мессежийн төрөл, клиент/серверийн IP гэх мэт) болон бүрэн DNS мессежийг сүлжээгээр дамжуулан тэдгээртэй ажилладаг (хоёртын) хэлбэрээр дамжуулдаг.

DNSTap парадигмд DNS сервер нь клиент, коллектор нь серверийн үүрэг гүйцэтгэдэг гэдгийг ойлгох нь чухал юм. Өөрөөр хэлбэл, DNS сервер нь коллекторт холбогддог бөгөөд эсрэгээр нь биш юм.

Өнөөдөр DNSTap нь бүх алдартай DNS серверүүдэд дэмжигддэг. Гэхдээ жишээлбэл, олон түгээлтийн BIND (Ubuntu LTS гэх мэт) нь ихэвчлэн ямар нэг шалтгааны улмаас дэмжлэггүйгээр хөрвүүлэгддэг. Тиймээс дахин бүтээн байгуулалтад санаа зовох хэрэггүй, харин илүү хөнгөн бөгөөд хурдан рекурсорыг авч үзье - Unbound.

DNSTap-г хэрхэн барих вэ?

Байдаг зарим дугаар DNSTap үйл явдлын урсгалтай ажиллах CLI хэрэгслүүд байдаг боловч бидний асуудлыг шийдвэрлэхэд тохиромжгүй байдаг. Тиймээс би өөрийн унадаг дугуй зохион бүтээхээр шийдсэн бөгөөд энэ нь шаардлагатай бүх зүйлийг хийх болно. dnstap-bgp

Ажлын алгоритм:

  • Ажиллаж эхлэх үед энэ нь текст файлаас домэйнуудын жагсаалтыг ачаалж, тэдгээрийг эргүүлж (habr.com -> com.habr), эвдэрсэн мөр, давхардал, дэд домайнуудыг оруулахгүй (жишээ нь хэрэв жагсаалтад habr.com болон www.habr.com орсон бол, Энэ нь зөвхөн эхнийх нь ачаалагдах болно) бөгөөд энэ жагсаалтаас хурдан хайхын тулд угтвар модыг бүтээдэг
  • DNSTap серверийн үүрэг гүйцэтгэж, DNS серверээс холбогдохыг хүлээнэ. Зарчмын хувьд энэ нь UNIX болон TCP сокетуудыг хоёуланг нь дэмждэг боловч миний мэдэх DNS серверүүд зөвхөн UNIX залгууруудыг ашиглах боломжтой.
  • Ирж буй DNSTap пакетуудыг эхлээд Protobuf бүтцэд салгаж, дараа нь Protobuf талбаруудын аль нэгэнд байрлах хоёртын DNS мессежийг DNS RR бичлэгүүдийн түвшинд задлан шинжилдэг.
  • Хүссэн хост (эсвэл түүний эх домэйн) ачаалагдсан жагсаалтад байгаа эсэхийг шалгадаг бөгөөд хэрэв байхгүй бол хариуг үл тоомсорлодог.
  • Хариултаас зөвхөн A/AAAA/CNAME RR-г сонгох ба тэдгээрээс харгалзах IPv4/IPv6 хаягуудыг гаргаж авдаг.
  • IP хаягууд нь тохируулж болох TTL-ээр хадгалагдаж, бүх тохируулсан BGP-д сурталчилдаг
  • Аль хэдийн кэштэй IP хаягийг зааж өгсөн хариултыг хүлээн авах үед түүний TTL шинэчлэгддэг
  • TTL хугацаа дууссаны дараа оруулгыг кэш болон BGP мэдэгдлээс устгана

Нэмэлт функцууд:

  • SIGHUP-ын домэйнуудын жагсаалтыг дахин уншиж байна
  • Кэшийг бусад тохиолдлуудтай синхрончлох dnstap-bgp HTTP/JSON-ээр дамжуулан
  • Дахин эхлүүлсний дараа агуулгыг нь сэргээхийн тулд диск дээрх кэшийг (BoltDB мэдээллийн санд) хуулбарлана
  • Сүлжээний өөр нэрийн орон зайд шилжихэд дэмжлэг (энэ нь яагаад хэрэгтэй байгааг доор тайлбарлах болно)
  • IPv6 дэмжлэг

Хязгаарлалт:

  • IDN домэйнууд хараахан дэмжигдээгүй байна
  • Цөөн тооны BGP тохиргоо

Би цуглуулсан RPM ба DEB суулгахад хялбар багцууд. systemd-тэй харьцангуй сүүлийн үеийн бүх үйлдлийн системүүд дээр ажиллах ёстой, учир нь... тэдэнд хамаарал байхгүй.

Энэ схем

Тиймээс, бүх бүрэлдэхүүн хэсгүүдийг нэгтгэж эхэлцгээе. Үүний үр дүнд бид ийм сүлжээний топологитой төстэй зүйлийг авах ёстой:
DNSTap болон BGP ашиглан ILV блоклохыг тойрч гарах

Ажлын логик нь диаграмаас тодорхой харагдаж байна гэж би бодож байна.

  • Үйлчлүүлэгч нь манай серверийг DNS болгон тохируулсан бөгөөд DNS асуулга нь VPN-ээр дамжих ёстой. Энэ нь үйлчилгээ үзүүлэгч нь хаахын тулд DNS саадыг ашиглах боломжгүй байх шаардлагатай.
  • Сайтыг нээх үед үйлчлүүлэгч "xxx.org-ын IP хаягууд юу вэ" гэх мэт DNS асуулга илгээдэг.
  • Unbound xxx.org-г шийдэж (эсвэл кэшээс авдаг) "xxx.org ийм ийм IP байна" гэсэн хариуг үйлчлүүлэгч рүү илгээж, DNSTap-ээр зэрэгцүүлэн хуулбарлана.
  • dnstap-bgp эдгээр хаягуудыг зарлаж байна ШУДАРГА Хэрэв домэйн блоклогдсон жагсаалтад байгаа бол BGP-ээр дамжуулан
  • ШУДАРГА нь эдгээр IP хаяг руу чиглэсэн замыг сурталчилдаг next-hop self үйлчлүүлэгч чиглүүлэгч
  • Үйлчлүүлэгчээс эдгээр IP руу очих дараагийн пакетууд хонгилоор дамждаг

Сервер дээр хаагдсан сайтууд руу чиглүүлэхийн тулд би BIRD доторх тусдаа хүснэгтийг ашигладаг бөгөөд энэ нь ямар ч байдлаар үйлдлийн системтэй огтлолцохгүй.

Энэ схем нь сул талтай: үйлчлүүлэгчээс ирсэн анхны SYN багц нь дотоодын үйлчилгээ үзүүлэгчээр дамжин явах цагтай байх магадлалтай. маршрутыг шууд зарладаггүй. Энд үйлчилгээ үзүүлэгч хэрхэн блоклохоос хамаарч сонголт хийх боломжтой. Хэрэв тэр зүгээр л замын хөдөлгөөнийг бууруулдаг бол ямар ч асуудал байхгүй. Хэрэв тэр үүнийг зарим DPI руу чиглүүлбэл (онолын хувьд) тусгай эффектүүд боломжтой.

Үйлчлүүлэгчид DNS TTL гайхамшгийг хүндэтгэдэггүй байж магадгүй бөгөөд энэ нь үйлчлүүлэгч Unbound гэж асуухын оронд ялзарсан кэшийнхээ зарим хуучирсан оруулгуудыг ашиглахад хүргэж болзошгүй юм.

Практикт эхний болон хоёр дахь нь надад асуудал үүсгээгүй ч таны миль өөр өөр байж болно.

Сервер тааруулах

Хялбар болгохын тулд би бичсэн Ansible-д зориулсан дүр. Энэ нь Линукс дээр суурилсан сервер болон үйлчлүүлэгчдийн аль алиныг нь тохируулах боломжтой (деб дээр суурилсан түгээлтэд зориулагдсан). Бүх тохиргоонууд нь тодорхой бөгөөд тохируулагдсан байна inventory.yml. Энэ дүрийг миний том тоглоомын номноос хассан тул алдаа агуулсан байж магадгүй - татах хүсэлт тавтай морил 🙂

Үндсэн бүрэлдэхүүн хэсгүүдийг авч үзье.

BGP

Нэг хост дээр хоёр BGP дэмон ажиллуулах нь үндсэн асуудалтай: BIRD нь localhost (эсвэл ямар нэгэн локал интерфэйс)тэй BGP peering тохируулахыг хүсэхгүй байна. Үгнээс нь. Google болон захидлын жагсаалтыг унших нь тус болсонгүй, тэд үүнийг загвараар хийсэн гэж мэдэгджээ. Магадгүй ямар нэгэн арга зам байгаа ч би олсонгүй.

Та өөр BGP демоныг туршиж үзэж болно, гэхдээ би BIRD-д дуртай бөгөөд үүнийг хаа сайгүй ашигладаг, би нэгж үүсгэхийг хүсэхгүй байна.

Тиймээс, би dnstap-bgp-ийг veth интерфейсээр дамжуулан root-тэй холбогдсон сүлжээний нэрийн талбар дотор нуусан: энэ нь хоолой шиг, төгсгөл нь өөр өөр нэрийн зайд наалддаг. Эдгээр төгсгөл бүр дээр бид хостоос хэтрэхгүй хувийн p2p IP хаягуудыг өлгөх тул тэдгээр нь юу ч байж болно. Энэ нь доторх процессуудад хандахад ашигладаг ижил механизм юм бүгдэд нь хайртай Docker болон бусад савнууд.

Үүний тулд үүнийг бичсэн скрипт Мөн дээр дурьдсан өөр нэрийн зай руу үсээр чирэх функцийг dnstap-bgp-д нэмсэн. Ийм учраас үүнийг root хэлбэрээр ажиллуулах эсвэл setcap командаар CAP_SYS_ADMIN хоёртын файлд өгөх ёстой.

Нэрийн орон зай үүсгэх жишээ скрипт

#!/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

Анхдагч байдлаар, Ubuntu-д Unbound хоёртын файлыг AppArmor профайлаар бэхэлсэн бөгөөд энэ нь түүнийг бүх төрлийн DNSTap залгуурт холбохыг хориглодог. Та энэ профайлыг устгах эсвэл идэвхгүй болгож болно:

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

Үүнийг тоглоомын дэвтэрт нэмэх хэрэгтэй байх. Мэдээжийн хэрэг профайлыг засч, шаардлагатай эрхийг олгох нь хамгийн тохиромжтой, гэхдээ би хэтэрхий залхуу байсан.

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

Жагсаалтыг татаж авах, боловсруулах

IP хаягийн жагсаалтыг татаж авах, боловсруулах скрипт
Жагсаалтыг татаж аваад угтварыг нэгтгэнэ pfx. The бүү_нэм и Дүгнэлт хийх хэрэггүй Та IP болон сүлжээнүүдийг алгасах эсвэл хураангуйлахгүй байхыг хэлж болно. Надад хэрэгтэй байсан. Миний VPS-ийн дэд сүлжээ блоклох жагсаалтад байсан 🙂

Хамгийн инээдтэй нь RosKomSvoboda API нь Python хэрэглэгчийн анхдагч агенттай хүсэлтийг блоклодог. Зохиолч хүүхэд үүнийг ойлгосон бололтой. Тиймээс бид үүнийг Ognelis болгон өөрчилдөг.

Одоогоор энэ нь зөвхөн IPv4 дээр ажилладаг. IPv6-ийн эзлэх хувь бага боловч үүнийг засахад хялбар байх болно. Хэрэв та 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)

Шинэчлэх скрипт
Би үүнийг өдөрт нэг удаа титэм дээр ажиллуулдаг, магадгүй үүнийг 4 цаг тутамд татах нь зүйтэй болов уу. Энэ бол миний бодлоор RKN-ийн үйлчилгээ үзүүлэгчдээс шаарддаг шинэчлэх хугацаа юм. Нэмж дурдахад тэд илүү хурдан хүрч болзошгүй өөр нэг яаралтай хаалттай байдаг.

Дараах зүйлсийг хийдэг:

  • Эхний скриптийг ажиллуулж, маршрутын жагсаалтыг шинэчилнэ (rkn_routes.list) BIRD-д зориулсан
  • BIRD-г дахин ачаална уу
  • 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

Тэдгээрийг маш их бодолгүйгээр бичсэн тул хэрэв та сайжруулах боломжтой зүйлийг олж харвал үүнийг хий.

Үйлчлүүлэгчийн тохиргоо

Энд би Линукс чиглүүлэгчийн жишээг өгөх болно, гэхдээ 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

Бүх зүйл, серверийн туннелийн IP хаягийг DNS болгон түгээхийн тулд чиглүүлэгч дээрх DHCP-ийг тохируулахад л үлдэж, схем бэлэн боллоо.

дутагдлууд

Домэйн жагсаалтыг үүсгэх, боловсруулах одоогийн алгоритмын хувьд бусад зүйлсээс гадна дараахь зүйлийг багтаасан болно. youtube.com болон түүний CDN.

Энэ нь бүх видеог VPN-ээр дамжуулан илгээх бөгөөд энэ нь бүх сувгийг бөглөрөхөд хүргэдэг. RKN блоклоход хэтэрхий сул хэвээр байгаа алдартай үл хамаарах домэйнуудын жагсаалтыг гаргах нь зүйтэй болов уу. Мөн задлан шинжлэхдээ тэдгээрийг алгасах.

дүгнэлт

Тайлбарласан арга нь үйлчилгээ үзүүлэгчдийн хэрэгжүүлж буй бараг бүх блокуудыг тойрч гарах боломжийг олгодог.

Зарчмын хувьд, dnstap-bgp Домэйн нэр дээр тулгуурлан замын хөдөлгөөний тодорхой түвшний хяналт шаардлагатай үед өөр ямар ч зорилгоор ашиглаж болно. Бидний үед мянга мянган сайтууд ижил IP хаяг дээр өлгөгдсөн байж болно гэдгийг санаарай (жишээлбэл, зарим Cloudflare-ийн ард), тиймээс энэ арга нь бага нарийвчлалтай байдаг.

Гэхдээ түгжээг тойрч гарах хэрэгцээнд энэ нь хангалттай юм.

Нэмэлт, засвар, татах хүсэлт - тавтай морил!

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх