DNSTap සහ BGP සමඟින් ILV අවහිර කිරීම මඟහරින්න

DNSTap සහ BGP සමඟින් ILV අවහිර කිරීම මඟහරින්න

මාතෘකාව හොඳටම බැටකෑවා, මම දන්නවා. උදාහරණයක් ලෙස, විශිෂ්ට එකක් තිබේ ලිපියක්, නමුත් අවහිර ලැයිස්තුවේ IP කොටස පමණක් එහි සලකා බලනු ලැබේ. අපි වසම් ද එකතු කරන්නෙමු.

උසාවිය සහ RKN විසින් දකුණට සහ වමට සියල්ල අවහිර කිරීමත්, Revizorro විසින් නිකුත් කරන ලද දඩ මුදලට නොවැටීමට සැපයුම්කරුවන් දැඩි උත්සාහයක් දරමින් සිටින නිසාත්, අවහිර කිරීමෙන් සිදුවන පාඩු තරමක් විශාලය. "නීත්‍යානුකූලව" අවහිර කරන ලද අඩවි අතර බොහෝ ප්‍රයෝජනවත් ඒවා තිබේ (ආයුබෝවන්, rutracker)

මම ජීවත් වන්නේ RKN හි අධිකරණ බලයෙන් පිටත, නමුත් මගේ දෙමාපියන්, ඥාතීන් සහ මිතුරන් නිවසේ රැඳී සිටියා. එබැවින් තොරතුරු තාක්ෂණයෙන් දුරස්ව සිටින පුද්ගලයින්ට අවහිර කිරීම් මඟ හැරීමට පහසු ක්‍රමයක් ඉදිරිපත් කිරීමට තීරණය විය, වඩාත් සුදුසු වන්නේ ඔවුන්ගේ සහභාගීත්වයෙන් තොරවය.

මෙම සටහනේදී, මම මූලික ජාල දේවල් පියවරෙන් පියවර විස්තර නොකරමි, නමුත් මෙම යෝජනා ක්රමය ක්රියාත්මක කළ හැකි ආකාරය පිළිබඳ පොදු මූලධර්ම මම විස්තර කරමි. එබැවින් ජාලය පොදුවේ ක්‍රියා කරන ආකාරය සහ විශේෂයෙන් ලිනක්ස් හි ක්‍රියා කරන ආකාරය පිළිබඳ දැනුමක් තිබිය යුතුය.

අගුල් වර්ග

පළමුව, අවහිර වී ඇති දේ පිළිබඳ අපගේ මතකය අලුත් කර ගනිමු.

RKN වෙතින් බාන ලද XML හි අගුලු වර්ග කිහිපයක් තිබේ:

  • IP
  • ඩොමේන්
  • URL එක

සරල බව සඳහා, අපි ඒවා දෙකකට අඩු කරන්නෙමු: IP සහ වසම, සහ අපි URL මගින් අවහිර කිරීමෙන් වසම ඉවත් කරන්නෙමු (වඩාත් නිවැරදිව, ඔවුන් දැනටමත් අප වෙනුවෙන් මෙය කර ඇත).

හොඳ මිනිසුන්ගෙන් රොස්කොම්ස්වෝබෝඩා අපූරු දෙයක් අවබෝධ විය API, එමගින් අපට අවශ්‍ය දේ ලබා ගත හැක:

අවහිර කළ අඩවි වෙත ප්රවේශය

මෙය සිදු කිරීම සඳහා, අපට කුඩා විදේශීය VPS කිහිපයක් අවශ්‍ය වේ, වඩාත් සුදුසු වන්නේ අසීමිත ගමනාගමනය සමඟ - රුපියල් 3-5 සඳහා මේවායින් බොහොමයක් තිබේ. පිං ඉතා විශාල නොවන පරිදි ඔබ එය විදේශයන්හි රැගෙන යා යුතුය, නමුත් නැවතත්, අන්තර්ජාලය සහ භූගෝලය සැමවිටම සමපාත නොවන බව සැලකිල්ලට ගන්න. සහ රුපියල් 5 සඳහා SLA නොමැති බැවින්, වැරදි ඉවසීම සඳහා විවිධ සැපයුම්කරුවන්ගෙන් කෑලි 2+ ගැනීම වඩා හොඳය.

ඊළඟට, අපි සේවාදායක රවුටරයේ සිට VPS වෙත සංකේතනය කළ උමගක් සකස් කළ යුතුය. සැකසීමට වේගවත්ම සහ පහසුම ලෙස මම Wireguard භාවිතා කරමි. මට Linux මත පදනම් වූ සේවාදායක රවුටර ද ඇත (APU2 හෝ OpenWRT හි යමක්). සමහර Mikrotik / Cisco වලදී, ඔබට OpenVPN සහ GRE-over-IPSEC වැනි ඒවායේ ඇති ප්‍රොටෝකෝල භාවිතා කළ හැකිය.

උනන්දුවක් දක්වන ගමනාගමනය හඳුනා ගැනීම සහ හරවා යැවීම

ඔබට, ඇත්ත වශයෙන්ම, විදේශ රටවල් හරහා සියලුම අන්තර්ජාල ගමනාගමනය අක්රිය කළ හැකිය. එහෙත්, බොහෝ දුරට, දේශීය අන්තර්ගතයන් සමඟ වැඩ කිරීමේ වේගය මෙයින් බොහෝ සෙයින් දුක් විඳිනු ඇත. තවද, VPS හි කලාප පළල අවශ්‍යතා බෙහෙවින් වැඩි වනු ඇත.

එමනිසා, අපට කෙසේ හෝ අවහිර කළ අඩවි සඳහා ගමනාගමනය වෙන් කර එය උමගට තෝරා ගැනීමට අවශ්‍ය වනු ඇත. සමහර "අතිරේක" ගමනාගමනය එහි පැමිණියද, උමග හරහා සෑම දෙයක්ම ධාවනය කිරීමට වඩා එය තවමත් වඩා හොඳය.

ගමනාගමනය කළමනාකරණය කිරීම සඳහා, අපි BGP ප්‍රොටෝකෝලය භාවිතා කර අපගේ VPS වෙතින් සේවාලාභීන් වෙත අවශ්‍ය ජාල වෙත මාර්ග නිවේදනය කරන්නෙමු. අපි BIRD වඩාත් ක්‍රියාකාරී සහ පහසු BGP ඩීමන් එකක් ලෙස ගනිමු.

IP

IP මඟින් අවහිර කිරීමත් සමඟ, සියල්ල පැහැදිලිය: අපි VPS සමඟ අවහිර කළ සියලුම IPs ප්‍රකාශ කරන්නෙමු. ගැටළුව වන්නේ API ආපසු ලබා දෙන ලැයිස්තුවේ උපජාල 600 ක් පමණ ඇති අතර ඒවායින් අතිමහත් බහුතරය / 32 සත්කාරක වේ. මෙම මාර්ග ගණන දුර්වල සේවාදායක රවුටර ව්‍යාකූල කළ හැක.

එබැවින්, ලැයිස්තුව සැකසීමේදී, එය ධාරක 24 ක් හෝ වැඩි ගණනක් තිබේ නම්, ජාලය / 2 දක්වා සාරාංශ කිරීමට තීරණය විය. මේ අනුව, මාර්ග ගණන ~ 100 දහස දක්වා අඩු විය. මේ සඳහා පිටපත අනුගමනය කරනු ඇත.

වසම්

එය වඩාත් සංකීර්ණ වන අතර ක්රම කිහිපයක් තිබේ. උදාහරණයක් ලෙස, ඔබට සෑම සේවාදායක රවුටරයකම විනිවිද පෙනෙන දැල්ලන් ස්ථාපනය කර එහි HTTP අන්තර්ක්‍රියා කර TLS හෑන්ඩ්ෂේක් වෙත එබී බැලීම සඳහා පළමු අවස්ථාවේදී ඉල්ලූ URL සහ දෙවන අවස්ථාවේදී SNI වෙතින් වසම ලබා ගත හැක.

නමුත් සෑම ආකාරයකම නව Fangled TLS1.3 + eSNI නිසා, HTTPS විශ්ලේෂණය සෑම දිනකම අඩුවෙන් සැබෑ වෙමින් පවතී. ඔව්, සහ සේවාදායක පැත්තේ යටිතල පහසුකම් වඩාත් සංකීර්ණ වෙමින් පවතී - ඔබට අවම වශයෙන් OpenWRT භාවිතා කිරීමට සිදුවනු ඇත.

එබැවින්, DNS ඉල්ලීම් වලට ප්‍රතිචාර වලට බාධා කිරීමේ මාර්ගයක් ගැනීමට මම තීරණය කළෙමි. මෙහිදී ද, ඕනෑම DNS-over-TLS / HTTPS ඔබේ හිසට ඉහළින් සැරිසැරීමට පටන් ගනී, නමුත් අපට (දැනට) මෙම කොටස සේවාලාභියා මත පාලනය කළ හැකිය - එක්කෝ එය අක්‍රිය කරන්න හෝ DoT / DoH සඳහා ඔබේම සේවාදායකයක් භාවිතා කරන්න.

DNS බාධා කරන්නේ කෙසේද?

මෙහිදී ද ප්රවේශයන් කිහිපයක් තිබිය හැකිය.

  • PCAP හෝ NFLOG හරහා DNS ගමනාගමනය බාධා කිරීම
    මෙම බාධා කිරීම් ක්රම දෙකම උපයෝගීතාවයේ ක්රියාත්මක වේ sidmat. නමුත් එය දිගු කාලයක් සඳහා සහය නොදක්වන අතර ක්රියාකාරිත්වය ඉතා ප්රාථමික වේ, එබැවින් ඔබ තවමත් ඒ සඳහා පටි ලිවීමට අවශ්ය වේ.
  • DNS සේවාදායක ලඝු-සටහන් විශ්ලේෂණය
    අවාසනාවකට, මා දන්නා පුනරාවර්තනයන්ට ප්‍රතිචාර ලොග් කිරීමට නොහැකි නමුත් ඉල්ලීම් පමණි. ප්‍රතිපත්තිමය වශයෙන්, මෙය තාර්කික ය, මන්ද, ඉල්ලීම් මෙන් නොව, පිළිතුරු සංකීර්ණ ව්‍යුහයක් ඇති අතර ඒවා පෙළ ආකාරයෙන් ලිවීමට අපහසුය.
  • DNSTap
    වාසනාවකට මෙන්, ඔවුන්ගෙන් බොහෝ දෙනෙක් දැනටමත් මෙම කාර්යය සඳහා DNSTap සඳහා සහය දක්වයි.

DNSTap යනු කුමක්ද?

DNSTap සහ BGP සමඟින් ILV අවහිර කිරීම මඟහරින්න

එය DNS සේවාදායකයකින් ව්‍යුහගත DNS විමසුම් සහ ප්‍රතිචාර එකතුකරන්නෙකු වෙත මාරු කිරීම සඳහා ප්‍රොටෝකෝල බෆර සහ රාමු ප්‍රවාහ මත පදනම් වූ සේවාදායක-සේවාදායක ප්‍රොටෝකෝලය වේ. අත්‍යවශ්‍යයෙන්ම, DNS සේවාදායකය විමසුම් සහ ප්‍රතිචාර පාර-දත්ත (පණිවිඩයේ වර්ගය, සේවාදායක/සේවාදායක IP, ආදිය) සහ සම්පූර්ණ DNS පණිවිඩ ජාලය හරහා ඔවුන් සමඟ ක්‍රියා කරන (ද්විමය) ආකාරයෙන් සම්ප්‍රේෂණය කරයි.

DNSTap සුසමාදර්ශය තුළ, DNS සේවාදායකය සේවාදායකයෙකු ලෙස ක්‍රියා කරන අතර එකතුකරන්නා සේවාදායකයක් ලෙස ක්‍රියා කරන බව වටහා ගැනීම වැදගත්ය. එනම්, DNS සේවාදායකය එකතු කරන්නා වෙත සම්බන්ධ වන අතර, අනෙක් අතට නොවේ.

අද DNSTap සියලුම ජනප්‍රිය DNS සර්වර් වල සහය දක්වයි. නමුත්, උදාහරණයක් ලෙස, බොහෝ බෙදාහැරීම් වල (Ubuntu LTS වැනි) BIND බොහෝ විට යම් හේතුවක් නිසා එහි සහාය නොමැතිව ගොඩනගා ඇත. එබැවින් අපි නැවත එකලස් කිරීම ගැන කරදර නොවී, සැහැල්ලු හා වේගවත් පුනරාවර්තනයක් ගනිමු - 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 RRs පමණක් ප්‍රතිචාරයෙන් තෝරා ගනු ලබන අතර ඒවාට අනුරූප IPv4/IPv6 ලිපින උපුටා ගනු ලැබේ.
  • IP ලිපින වින්‍යාසගත කළ හැකි TTL සමඟ හැඹිලිගත කර ඇති අතර සියලුම වින්‍යාසගත BGP සම වයසේ මිතුරන් වෙත ප්‍රචාරණය කෙරේ.
  • දැනටමත් හැඹිලිගත IP වෙත ප්‍රතිචාරයක් ලැබෙන විට, එහි TTL යාවත්කාලීන වේ
  • TTL කල් ඉකුත් වූ පසු, ප්‍රවේශය හැඹිලියෙන් සහ BGP නිවේදනවලින් ඉවත් කරනු ලැබේ

අතිරේක ක්රියාකාරිත්වය:

  • SIGHUP මගින් වසම් ලැයිස්තුව නැවත කියවීම
  • හැඹිලිය වෙනත් අවස්ථාවන් සමඟ සමමුහුර්තව තබා ගැනීම dnstap-bgp HTTP/JSON හරහා
  • නැවත ආරම්භ කිරීමෙන් පසු එහි අන්තර්ගතය ප්‍රතිසාධනය කිරීමට තැටියේ ඇති හැඹිලිය (BoltDB දත්ත ගබඩාවේ) අනුපිටපත් කරන්න
  • වෙනත් ජාල නාම අවකාශයකට මාරුවීම සඳහා සහාය (මෙය අවශ්‍ය වන්නේ මන්දැයි පහත විස්තර කෙරේ)
  • IPv6 සහාය

සීමාවන්:

  • IDN වසම් තවමත් සහය නොදක්වයි
  • BGP සැකසුම් කිහිපයක්

මම එකතු කළා RPM සහ DEB පහසු ස්ථාපනය සඳහා පැකේජ. systemd සමඟ සාපේක්ෂව මෑත කාලීන සියලුම OS මත වැඩ කළ යුතුය. ඔවුන්ට කිසිදු යැපීමක් නැත.

යෝජනා ක්රමය

එබැවින්, අපි සියලු සංරචක එකට එකතු කිරීම ආරම්භ කරමු. එහි ප්‍රතිඵලයක් වශයෙන්, අපට මෙම ජාල ස්ථලකය වැනි දෙයක් ලබා ගත යුතුය:
DNSTap සහ BGP සමඟින් ILV අවහිර කිරීම මඟහරින්න

කාර්යයේ තර්කනය, මම හිතන්නේ, රූප සටහනෙන් පැහැදිලි ය:

  • සේවාලාභියා අපගේ සේවාදායකය DNS ලෙස වින්‍යාස කර ඇති අතර DNS විමසුම් VPN හරහාද යා යුතුය. සැපයුම්කරුට අවහිර කිරීමට DNS අන්තර්ක්‍රියා භාවිතා කළ නොහැකි වන පරිදි මෙය අවශ්‍ය වේ.
  • වෙබ් අඩවිය විවෘත කරන විට, සේවාදායකයා "xxx.org හි IPs මොනවාද" වැනි DNS විමසුමක් යවයි.
  • සංඛ්යාවට සමාන සංඛ්යාවකි xxx.org නිරාකරණය කරයි (හෝ එය හැඹිලියෙන් ගනී) සහ "xxx.org හි එවැනි සහ එවැනි IP තිබේ" යන සේවාලාභියාට ප්‍රතිචාරයක් යවයි, එය DNSTap හරහා සමාන්තරව අනුපිටපත් කරයි.
  • dnstap-bgp හි මෙම ලිපින නිවේදනය කරයි කුරුල්ලා වසම අවහිර කළ ලැයිස්තුවේ තිබේ නම් BGP හරහා
  • කුරුල්ලා සමඟ මෙම IP වෙත මාර්ගයක් ප්‍රචාරණය කරයි next-hop self සේවාදායක රවුටරය
  • සේවාලාභියාගේ සිට මෙම IPs වෙත පසුව එන පැකට් උමඟ හරහා ගමන් කරයි

සේවාදායකයේ, අවහිර කළ අඩවි සඳහා මාර්ග සඳහා, මම BIRD ඇතුළත වෙනම වගුවක් භාවිතා කරන අතර එය OS සමඟ කිසිදු ආකාරයකින් ඡේදනය නොවේ.

මෙම යෝජනා ක්රමයට අඩුපාඩුවක් ඇත: සේවාලාභියාගෙන් පළමු SYN පැකට්ටුව, බොහෝ විට, ගෘහස්ථ සැපයුම්කරු හරහා පිටවීමට කාලය ඇත. මාර්ගය වහාම නිවේදනය නොකෙරේ. සපයන්නා අවහිර කිරීම සිදු කරන්නේ කෙසේද යන්න මත පදනම්ව මෙහි විකල්ප තිබේ. නිකන් ට් රැෆික් එක දැම්මොත් අවුලක් නෑ. ඔහු එය යම් DPI වෙත හරවා යවන්නේ නම්, (න්‍යායාත්මකව) විශේෂ ප්‍රයෝග හැකි ය.

සේවාලාභීන් DNS TTL ආශ්චර්යයන්ට ගරු නොකරනු ඇත, එය Unbound ඉල්ලා සිටීම වෙනුවට සේවාදායකයාට එහි කුණු වූ හැඹිලියේ සමහර පරණ ඇතුළත් කිරීම් භාවිතා කිරීමට හේතු විය හැක.

ප්‍රායෝගිකව, පළමු හෝ දෙවැන්න මට ගැටලු ඇති කළේ නැත, නමුත් ඔබේ සැතපුම් ගණන වෙනස් විය හැකිය.

සේවාදායකය සුසර කිරීම

පෙරලීමේ පහසුව සඳහා, මම ලිව්වා Ansible සඳහා භූමිකාව. එය ලිනක්ස් මත පදනම්ව සේවාදායකයන් සහ සේවාලාභීන් යන දෙකම වින්‍යාසගත කළ හැකිය (ඩෙබ්-පාදක බෙදාහැරීම් සඳහා නිර්මාණය කර ඇත). සියලුම සැකසුම් ඉතා පැහැදිලි වන අතර ඒවා සකසා ඇත inventory.yml. මෙම භූමිකාව මගේ විශාල ක්‍රීඩා පොතෙන් කපා ඇත, එබැවින් එහි දෝෂ අඩංගු විය හැක - ඉල්ලීම් අදින්න සාදරයෙන් පිළිගනිමු 🙂

අපි ප්රධාන සංරචක හරහා යමු.

BGP

එකම ධාරකයක BGP ඩීමන් දෙකක් ධාවනය කිරීම මූලික ගැටලුවක් ඇත: BIRD හට දේශීය සත්කාරක (හෝ ඕනෑම දේශීය අතුරු මුහුණතක්) සමඟ BGP පීරිං පිහිටුවීමට අවශ්‍ය නොවේ. වචනයෙන් සම්පූර්ණයෙන්ම. ගූගල් කිරීම සහ තැපැල් ලැයිස්තු කියවීම උදව් කළේ නැත, ඔවුන් කියා සිටින්නේ මෙය නිර්මාණයක් බවයි. සමහර විට යම් මාර්ගයක් ඇත, නමුත් මම එය සොයා ගත්තේ නැත.

ඔබට වෙනත් BGP ඩීමන් එකක් උත්සාහ කළ හැකිය, නමුත් මම BIRD වලට කැමති අතර එය මා විසින් සෑම තැනකම භාවිතා කරයි, මට ආයතන නිෂ්පාදනය කිරීමට අවශ්‍ය නැත.

ඒ නිසා, මම dnstap-bgp ජාල නාම අවකාශය තුළ සඟවා තැබුවෙමි, එය veth අතුරුමුහුණත හරහා root වෙත සම්බන්ධ කර ඇත: එය පයිප්පයක් වැනි ය, එහි කෙළවර විවිධ නාම අවකාශයන්හි කැපී පෙනේ. මෙම එක් එක් කෙළවරක, අපි ධාරකයෙන් ඔබ්බට නොයන පුද්ගලික p2p IP ලිපින එල්ලා තබන්නෙමු, එබැවින් ඒවා ඕනෑම දෙයක් විය හැකිය. ඇතුළත ක්‍රියාවලි වලට ප්‍රවේශ වීමට භාවිතා කරන යාන්ත්‍රණයම මෙයයි සියල්ලන් විසින් ආදරය කරන ලදී ඩොකර් සහ අනෙකුත් බහාලුම්.

මේ සඳහා ලියා ඇත පිටපත සහ වෙනත් නාම අවකාශයකට කොණ්ඩයෙන් ඔබව ඇදගෙන යාම සඳහා ඉහත විස්තර කර ඇති ක්‍රියාකාරීත්වය 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 binary එක 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. මෙම එකතු කරන්න එපා и සාරාංශ කරන්න එපා ඔබට IPs සහ ජාල වෙත මඟ හැරීමට හෝ සාරාංශ නොකිරීමට පැවසිය හැක. මට එය අවශ්‍ය විය. මගේ VPS එකේ subnet එක blocklist එකේ තිබුනා 🙂

හාස්‍යජනක දෙය නම් RosKomSvoboda API පෙරනිමි Python පරිශීලක නියෝජිතයා සමඟ ඉල්ලීම් අවහිර කිරීමයි. script-kiddy ඒක තේරුම් අරන් වගේ. එමනිසා, අපි එය 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 වෙතින් ලැබෙන මාර්ග kernel routing table number 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 සහ එහි CDNs.

මෙය සියලුම වීඩියෝ VPN හරහා ගමන් කරන අතර එමඟින් මුළු නාලිකාවම අවහිර කළ හැකිය. සමහර විට එය දැනට RKN අවහිර කරන ජනප්රිය වසම්-බැහැර කිරීම් ලැයිස්තුවක් සම්පාදනය කිරීම වටී, බඩවැල් තුනී වේ. විග්‍රහ කිරීමේදී ඒවා මඟ හරින්න.

නිගමනය

විස්තර කරන ලද ක්‍රමය මඟින් සපයන්නන් දැනට ක්‍රියාත්මක කරන ඕනෑම අවහිරයක් මඟ හැරීමට ඔබට ඉඩ සලසයි.

ප්‍රතිපත්තිමය වශයෙන්, dnstap-bgp වසම් නාමය මත පදනම්ව යම් මට්ටමක රථවාහන පාලනයක් අවශ්‍ය වන වෙනත් ඕනෑම කටයුත්තක් සඳහා භාවිතා කළ හැක. අපේ කාලයේ, අඩවි දහසකට එකම IP ලිපිනය මත එල්ලා තැබිය හැකි බව මතක තබා ගන්න (උදාහරණයක් ලෙස, සමහර Cloudflare පිටුපස), එබැවින් මෙම ක්‍රමයට තරමක් අඩු නිරවද්‍යතාවයක් ඇත.

නමුත් අගුල් මඟ හැරීමේ අවශ්‍යතා සඳහා මෙය ප්‍රමාණවත් වේ.

එකතු කිරීම්, සංස්කරණය කිරීම්, ඉල්ලීම් අදින්න - සාදරයෙන් පිළිගනිමු!

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න