DNSTap మరియు BGPతో ILV నిరోధించడాన్ని బైపాస్ చేయండి

DNSTap మరియు BGPతో ILV నిరోధించడాన్ని బైపాస్ చేయండి

టాపిక్ చాలా కొట్టబడింది, నాకు తెలుసు. ఉదాహరణకు, ఒక గొప్ప ఉంది వ్యాసం, కానీ బ్లాక్‌లిస్ట్‌లోని IP భాగం మాత్రమే అక్కడ పరిగణించబడుతుంది. మేము డొమైన్‌లను కూడా జోడిస్తాము.

కోర్టులు మరియు RKN కుడి మరియు ఎడమ ప్రతిదానిని బ్లాక్ చేయడం మరియు ప్రొవైడర్లు Revizorro జారీ చేసిన జరిమానాల పరిధిలోకి రాకుండా తీవ్రంగా ప్రయత్నిస్తున్నందున, నిరోధించడం వల్ల కలిగే నష్టాలు చాలా పెద్దవి. మరియు "చట్టబద్ధంగా" నిరోధించబడిన సైట్‌లలో చాలా ఉపయోగకరమైనవి ఉన్నాయి (హలో, రూట్రాకర్)

నేను RKN అధికార పరిధికి వెలుపల నివసిస్తున్నాను, కానీ నా తల్లిదండ్రులు, బంధువులు మరియు స్నేహితులు ఇంట్లోనే ఉన్నారు. కాబట్టి IT నుండి దూరంగా ఉన్న వ్యక్తులు నిరోధించడాన్ని దాటవేయడానికి సులభమైన మార్గంతో ముందుకు రావాలని నిర్ణయించారు, ప్రాధాన్యంగా వారి భాగస్వామ్యం లేకుండా.

ఈ నోట్‌లో, నేను ప్రాథమిక నెట్‌వర్క్ విషయాలను దశల్లో వివరించను, కానీ ఈ పథకాన్ని ఎలా అమలు చేయాలనే సాధారణ సూత్రాలను వివరిస్తాను. కాబట్టి నెట్‌వర్క్ సాధారణంగా మరియు ముఖ్యంగా లైనక్స్‌లో ఎలా పనిచేస్తుందో తెలుసుకోవడం తప్పనిసరి.

తాళాల రకాలు

ముందుగా, బ్లాక్ చేయబడిన వాటి గురించి మన జ్ఞాపకశక్తిని రిఫ్రెష్ చేద్దాం.

RKN నుండి అన్‌లోడ్ చేయబడిన XMLలో అనేక రకాల లాక్‌లు ఉన్నాయి:

  • IP
  • Домен
  • URL

సరళత కోసం, మేము వాటిని రెండుకి తగ్గిస్తాము: IP మరియు డొమైన్, మరియు మేము URL ద్వారా బ్లాక్ చేయకుండా డొమైన్‌ను ఉపసంహరించుకుంటాము (మరింత ఖచ్చితంగా, వారు దీన్ని ఇప్పటికే మా కోసం చేసారు).

నుండి మంచి వ్యక్తులు రోస్కోమ్స్వోబోడా ఒక అద్భుతాన్ని గ్రహించాడు API, దీని ద్వారా మనకు అవసరమైన వాటిని పొందవచ్చు:

బ్లాక్ చేయబడిన సైట్‌లకు యాక్సెస్

దీన్ని చేయడానికి, మాకు కొన్ని చిన్న విదేశీ VPS అవసరం, ప్రాధాన్యంగా అపరిమిత ట్రాఫిక్‌తో - 3-5 బక్స్ కోసం వీటిలో చాలా ఉన్నాయి. పింగ్ చాలా పెద్దది కాదు కాబట్టి మీరు సమీపంలోని విదేశాలలో తీసుకోవాలి, కానీ మళ్ళీ, ఇంటర్నెట్ మరియు భౌగోళికం ఎల్లప్పుడూ ఏకీభవించవు. మరియు 5 బక్స్ కోసం SLA లేనందున, తప్పు సహనం కోసం వివిధ ప్రొవైడర్ల నుండి 2+ ముక్కలను తీసుకోవడం మంచిది.

తర్వాత, మేము క్లయింట్ రూటర్ నుండి VPSకి ఎన్‌క్రిప్టెడ్ టన్నెల్‌ను సెటప్ చేయాలి. నేను వైర్‌గార్డ్‌ని సెటప్ చేయడానికి వేగవంతమైన మరియు సులభమైనదిగా ఉపయోగిస్తాను. నా దగ్గర Linux ఆధారంగా క్లయింట్ రూటర్లు కూడా ఉన్నాయి (APU2 లేదా OpenWRTలో ఏదైనా). కొన్ని Mikrotik / Cisco విషయంలో, మీరు OpenVPN మరియు GRE-over-IPSEC వంటి వాటిలో అందుబాటులో ఉన్న ప్రోటోకాల్‌లను ఉపయోగించవచ్చు.

ఆసక్తి ఉన్న ట్రాఫిక్‌ను గుర్తించడం మరియు దారి మళ్లించడం

మీరు, వాస్తవానికి, విదేశీ దేశాల ద్వారా అన్ని ఇంటర్నెట్ ట్రాఫిక్‌ను ఆఫ్ చేయవచ్చు. కానీ, చాలా మటుకు, స్థానిక కంటెంట్‌తో పని చేసే వేగం దీని నుండి బాగా నష్టపోతుంది. అదనంగా, VPSలో బ్యాండ్‌విడ్త్ అవసరాలు చాలా ఎక్కువగా ఉంటాయి.

అందువల్ల, మేము బ్లాక్ చేయబడిన సైట్‌లకు ట్రాఫిక్‌ని ఏదో విధంగా కేటాయించాలి మరియు దానిని టన్నెల్‌కి ఎంపిక చేయాలి. కొన్ని "అదనపు" ట్రాఫిక్ అక్కడకు వచ్చినప్పటికీ, సొరంగం గుండా ప్రతిదానిని నడపడం కంటే ఇది చాలా మెరుగ్గా ఉంటుంది.

ట్రాఫిక్‌ని నిర్వహించడానికి, మేము BGP ప్రోటోకాల్‌ని ఉపయోగిస్తాము మరియు మా VPS నుండి క్లయింట్‌లకు అవసరమైన నెట్‌వర్క్‌లకు మార్గాలను ప్రకటిస్తాము. BIRDని అత్యంత క్రియాత్మకమైన మరియు అనుకూలమైన BGP డెమోన్‌లలో ఒకటిగా తీసుకుందాం.

IP

IP ద్వారా నిరోధించడంతో, ప్రతిదీ స్పష్టంగా ఉంటుంది: మేము VPSతో బ్లాక్ చేయబడిన అన్ని IPలను ప్రకటిస్తాము. సమస్య ఏమిటంటే, API తిరిగి ఇచ్చే జాబితాలో సుమారు 600 వేల సబ్‌నెట్‌లు ఉన్నాయి మరియు వాటిలో ఎక్కువ భాగం /32 హోస్ట్‌లు. ఈ సంఖ్యల మార్గాలు బలహీనమైన క్లయింట్ రూటర్‌లను గందరగోళానికి గురి చేస్తాయి.

అందువల్ల, జాబితాను ప్రాసెస్ చేస్తున్నప్పుడు, అది 24 లేదా అంతకంటే ఎక్కువ హోస్ట్‌లను కలిగి ఉంటే, నెట్‌వర్క్ / 2 వరకు సంగ్రహించాలని నిర్ణయించబడింది. అందువలన, మార్గాల సంఖ్య ~ 100 వేలకు తగ్గించబడింది. దీనికి సంబంధించిన స్క్రిప్ట్‌ను అనుసరించనున్నారు.

డొమైన్లు

ఇది మరింత క్లిష్టంగా ఉంటుంది మరియు అనేక మార్గాలు ఉన్నాయి. ఉదాహరణకు, మీరు ప్రతి క్లయింట్ రూటర్‌లో పారదర్శక స్క్విడ్‌ను ఇన్‌స్టాల్ చేయవచ్చు మరియు అక్కడ 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 ప్రశ్నలు మరియు ప్రతిస్పందనల కలెక్టర్‌కు బదిలీ చేయడానికి ప్రోటోకాల్ బఫర్‌లు మరియు ఫ్రేమ్ స్ట్రీమ్‌ల ఆధారంగా క్లయింట్-సర్వర్ ప్రోటోకాల్. ముఖ్యంగా, DNS సర్వర్ ప్రశ్న మరియు ప్రతిస్పందన మెటాడేటా (సందేశ రకం, క్లయింట్/సర్వర్ IP, మొదలైనవి) మరియు నెట్‌వర్క్‌లో వారితో పనిచేసే (బైనరీ) రూపంలో పూర్తి DNS సందేశాలను ప్రసారం చేస్తుంది.

DNSTap నమూనాలో, DNS సర్వర్ క్లయింట్‌గా మరియు కలెక్టర్ సర్వర్‌గా పనిచేస్తుందని అర్థం చేసుకోవడం ముఖ్యం. అంటే, DNS సర్వర్ కలెక్టర్‌కి కనెక్ట్ అవుతుంది మరియు దీనికి విరుద్ధంగా కాదు.

నేడు అన్ని ప్రముఖ DNS సర్వర్‌లలో DNSTap మద్దతు ఉంది. కానీ, ఉదాహరణకు, అనేక పంపిణీలలో (ఉబుంటు LTS వంటివి) BIND తరచుగా కొన్ని కారణాల వల్ల దాని మద్దతు లేకుండా నిర్మించబడుతుంది. కాబట్టి తిరిగి కలపడం గురించి ఇబ్బంది పడకుండా, తేలికైన మరియు వేగవంతమైన రికర్సర్‌ని తీసుకోండి - అన్‌బౌండ్.

DNSTapని ఎలా పట్టుకోవాలి?

ఉన్నాయి కొన్ని సంఖ్య DNSTap ఈవెంట్‌ల స్ట్రీమ్‌తో పని చేయడానికి CLI యుటిలిటీలు, కానీ అవి మా సమస్యను పరిష్కరించడానికి తగినవి కావు. అందువల్ల, అవసరమైన ప్రతిదాన్ని చేసే నా స్వంత సైకిల్‌ను కనిపెట్టాలని నిర్ణయించుకున్నాను: dnstap-bgp

పని అల్గోరిథం:

  • ప్రారంభించినప్పుడు, ఇది టెక్స్ట్ ఫైల్ నుండి డొమైన్‌ల జాబితాను లోడ్ చేస్తుంది, వాటిని (habr.com -> com.habr) విలోమం చేస్తుంది, విరిగిన పంక్తులు, నకిలీలు మరియు సబ్‌డొమైన్‌లను మినహాయిస్తుంది (అనగా జాబితాలో habr.com మరియు www.habr.com ఉంటే, ఇది మొదటిది మాత్రమే లోడ్ చేయబడుతుంది) మరియు ఈ జాబితా ద్వారా వేగంగా శోధించడం కోసం ఉపసర్గ చెట్టును నిర్మిస్తుంది
  • DNSTap సర్వర్‌గా పని చేస్తూ, ఇది DNS సర్వర్ నుండి కనెక్షన్ కోసం వేచి ఉంది. సూత్రప్రాయంగా, ఇది UNIX మరియు TCP సాకెట్‌లకు మద్దతు ఇస్తుంది, కానీ నాకు తెలిసిన DNS సర్వర్‌లు UNIX సాకెట్‌లను మాత్రమే ఉపయోగించగలవు
  • ఇన్‌కమింగ్ DNSTap ప్యాకెట్లు మొదట ప్రోటోబఫ్ స్ట్రక్చర్‌గా డీరియలైజ్ చేయబడతాయి, ఆపై ప్రోటోబఫ్ ఫీల్డ్‌లలో ఒకదానిలో ఉన్న బైనరీ DNS సందేశం DNS RR రికార్డుల స్థాయికి అన్వయించబడుతుంది.
  • అభ్యర్థించిన హోస్ట్ (లేదా దాని పేరెంట్ డొమైన్) లోడ్ చేయబడిన జాబితాలో ఉందో లేదో తనిఖీ చేయబడుతుంది, లేకపోతే, ప్రతిస్పందన విస్మరించబడుతుంది
  • ప్రతిస్పందన నుండి A/AAAA/CNAME RRలు మాత్రమే ఎంపిక చేయబడ్డాయి మరియు సంబంధిత IPv4/IPv6 చిరునామాలు వాటి నుండి సంగ్రహించబడతాయి
  • IP చిరునామాలు కాన్ఫిగర్ చేయదగిన TTLతో కాష్ చేయబడతాయి మరియు కాన్ఫిగర్ చేయబడిన BGP పీర్‌లందరికీ ప్రచారం చేయబడతాయి
  • ఇప్పటికే కాష్ చేయబడిన IPని సూచించే ప్రతిస్పందనను స్వీకరించినప్పుడు, దాని TTL నవీకరించబడుతుంది
  • TTL గడువు ముగిసిన తర్వాత, కాష్ నుండి మరియు BGP ప్రకటనల నుండి ఎంట్రీ తీసివేయబడుతుంది

అదనపు కార్యాచరణ:

  • SIGHUP ద్వారా డొమైన్‌ల జాబితాను మళ్లీ చదవడం
  • కాష్‌ని ఇతర సందర్భాల్లో సింక్‌లో ఉంచడం dnstap-bgp HTTP/JSON ద్వారా
  • పునఃప్రారంభించిన తర్వాత దాని కంటెంట్‌లను పునరుద్ధరించడానికి డిస్క్‌లోని కాష్‌ను (బోల్ట్‌డిబి డేటాబేస్‌లో) నకిలీ చేయండి
  • వేరే నెట్‌వర్క్ నేమ్‌స్పేస్‌కి మారడానికి మద్దతు (ఇది ఎందుకు అవసరమో క్రింద వివరించబడుతుంది)
  • IPv6 మద్దతు

ఆంక్షలు:

  • IDN డొమైన్‌లకు ఇంకా మద్దతు లేదు
  • కొన్ని BGP సెట్టింగ్‌లు

నేను సేకరించాను RPM మరియు DEB సులభంగా సంస్థాపన కోసం ప్యాకేజీలు. systemdతో సాపేక్షంగా ఇటీవలి అన్ని OSలలో పని చేయాలి. వారికి ఎలాంటి డిపెండెన్సీలు లేవు.

పథకం

కాబట్టి, అన్ని భాగాలను కలపడం ప్రారంభిద్దాం. ఫలితంగా, మనం ఈ నెట్‌వర్క్ టోపోలాజీ వంటి వాటిని పొందాలి:
DNSTap మరియు BGPతో ILV నిరోధించడాన్ని బైపాస్ చేయండి

పని యొక్క తర్కం, రేఖాచిత్రం నుండి స్పష్టంగా ఉందని నేను అనుకుంటున్నాను:

  • క్లయింట్ మా సర్వర్‌ని DNSగా కాన్ఫిగర్ చేసారు మరియు DNS ప్రశ్నలు తప్పనిసరిగా VPN ద్వారా కూడా వెళ్లాలి. ఇది అవసరం కాబట్టి ప్రొవైడర్ నిరోధించడానికి DNS అంతరాయాన్ని ఉపయోగించలేరు.
  • సైట్‌ను తెరిచేటప్పుడు, క్లయింట్ “xxx.org యొక్క IPలు ఏమిటి” వంటి DNS ప్రశ్నను పంపుతుంది.
  • అన్బౌండ్ xxx.orgని పరిష్కరిస్తుంది (లేదా కాష్ నుండి తీసుకుంటుంది) మరియు క్లయింట్‌కు ప్రతిస్పందనను పంపుతుంది “xxx.org అటువంటి మరియు అలాంటి IPని కలిగి ఉంది”, DNSTap ద్వారా సమాంతరంగా దానిని నకిలీ చేస్తుంది
  • dnstap-bgp లో ఈ చిరునామాలను ప్రకటిస్తుంది బర్డ్ డొమైన్ బ్లాక్ చేయబడిన జాబితాలో ఉంటే BGP ద్వారా
  • బర్డ్ తో ఈ IPలకు మార్గాన్ని ప్రచారం చేస్తుంది next-hop self క్లయింట్ రూటర్
  • క్లయింట్ నుండి ఈ IPలకు వచ్చే తదుపరి ప్యాకెట్‌లు సొరంగం గుండా వెళతాయి

సర్వర్‌లో, బ్లాక్ చేయబడిన సైట్‌లకు మార్గాల కోసం, నేను BIRD లోపల ఒక ప్రత్యేక పట్టికను ఉపయోగిస్తాను మరియు అది ఏ విధంగానూ OSతో కలుస్తుంది.

ఈ పథకానికి ఒక లోపం ఉంది: క్లయింట్ నుండి మొదటి SYN ప్యాకెట్, చాలా మటుకు, దేశీయ ప్రొవైడర్ ద్వారా వదిలివేయడానికి సమయం ఉంటుంది. మార్గం వెంటనే ప్రకటించబడలేదు. మరియు ప్రొవైడర్ ఎలా నిరోధించడాన్ని బట్టి ఇక్కడ ఎంపికలు సాధ్యమవుతాయి. అతను కేవలం ట్రాఫిక్‌ను తగ్గిస్తే, సమస్య లేదు. మరియు అతను దానిని కొంత DPIకి దారి మళ్లిస్తే, అప్పుడు (సిద్ధాంతపరంగా) ప్రత్యేక ప్రభావాలు సాధ్యమే.

క్లయింట్‌లు DNS TTL అద్భుతాలను గౌరవించకపోవడం కూడా సాధ్యమే, దీని వలన క్లయింట్ అన్‌బౌండ్ అడగడానికి బదులుగా దాని కుళ్ళిన కాష్ నుండి కొన్ని పాత ఎంట్రీలను ఉపయోగించేలా చేయవచ్చు.

ఆచరణలో, మొదటిది లేదా రెండవది నాకు సమస్యలను కలిగించలేదు, కానీ మీ మైలేజ్ మారవచ్చు.

సర్వర్ ట్యూనింగ్

రోలింగ్ సౌలభ్యం కోసం, నేను వ్రాసాను అన్సిబుల్ పాత్ర. ఇది Linux (డెబ్-ఆధారిత పంపిణీల కోసం రూపొందించబడింది) ఆధారంగా సర్వర్లు మరియు క్లయింట్‌లను కాన్ఫిగర్ చేయగలదు. అన్ని సెట్టింగులు చాలా స్పష్టంగా ఉన్నాయి మరియు సెట్ చేయబడ్డాయి inventory.yml. ఈ పాత్ర నా పెద్ద ప్లేబుక్ నుండి కత్తిరించబడింది, కాబట్టి ఇందులో లోపాలు ఉండవచ్చు - పుల్ అభ్యర్థనలు స్వాగతం 🙂

ప్రధాన భాగాల ద్వారా వెళ్దాం.

BGP

ఒకే హోస్ట్‌లో రెండు BGP డెమోన్‌లను అమలు చేయడంలో ప్రాథమిక సమస్య ఉంది: BIRD లోకల్ హోస్ట్ (లేదా ఏదైనా స్థానిక ఇంటర్‌ఫేస్)తో BGP పీరింగ్‌ని సెటప్ చేయాలనుకోదు. అన్ని వద్ద పదం నుండి. మెయిలింగ్-జాబితాలను గూగ్లింగ్ చేయడం మరియు చదవడం సహాయం చేయలేదు, ఇది డిజైన్ ద్వారా జరిగిందని వారు పేర్కొన్నారు. బహుశా ఏదో ఒక మార్గం ఉంది, కానీ నేను దానిని కనుగొనలేదు.

మీరు మరొక BGP డెమోన్‌ని ప్రయత్నించవచ్చు, కానీ నేను BIRDని ఇష్టపడుతున్నాను మరియు ఇది నా ద్వారా ప్రతిచోటా ఉపయోగించబడుతుంది, నేను ఎంటిటీలను ఉత్పత్తి చేయకూడదనుకుంటున్నాను.

అందువల్ల, నేను నెట్‌వర్క్ నేమ్‌స్పేస్ లోపల dnstap-bgp దాచాను, ఇది వెత్ ఇంటర్‌ఫేస్ ద్వారా రూట్‌కి కనెక్ట్ చేయబడింది: ఇది పైపు లాంటిది, దీని చివరలు వేర్వేరు నేమ్‌స్పేస్‌లలో ఉంటాయి. ఈ ప్రతి చివరన, మేము హోస్ట్‌ను దాటి వెళ్లని ప్రైవేట్ p2p IP చిరునామాలను వేలాడదీస్తాము, కాబట్టి అవి ఏదైనా కావచ్చు. లోపల ప్రాసెస్‌లను యాక్సెస్ చేయడానికి ఇదే మెకానిజం అందరికీ నచ్చింది డాకర్ మరియు ఇతర కంటైనర్లు.

దీని కోసం ఇది వ్రాయబడింది స్క్రిప్ట్ మరియు మరొక నేమ్‌స్పేస్‌కు జుట్టుతో మిమ్మల్ని లాగడం కోసం ఇప్పటికే పైన వివరించిన కార్యాచరణ dnstap-bgpకి జోడించబడింది. దీని కారణంగా, ఇది తప్పనిసరిగా రూట్‌గా అమలు చేయబడాలి లేదా 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

డిఫాల్ట్‌గా, ఉబుంటులో, అన్‌బౌండ్ బైనరీ 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. ది జోడించవద్దు и సంగ్రహించవద్దు మీరు IPలు మరియు నెట్‌వర్క్‌లను దాటవేయమని లేదా సంగ్రహించవద్దని చెప్పవచ్చు. నాకు అది అవసరం. నా VPS సబ్‌నెట్ బ్లాక్‌లిస్ట్‌లో ఉంది 🙂

తమాషా ఏమిటంటే RosKomSvoboda API డిఫాల్ట్ పైథాన్ వినియోగదారు ఏజెంట్‌తో అభ్యర్థనలను బ్లాక్ చేస్తుంది. స్క్రిప్ట్-కిడ్డీ అది పొందినట్లు కనిపిస్తోంది. అందువల్ల, మేము దానిని ఓగ్నెలిస్‌గా మారుస్తాము.

ఇప్పటివరకు, ఇది 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

అవి పెద్దగా ఆలోచించకుండా వ్రాయబడ్డాయి, కాబట్టి మీరు మెరుగుపరచగల ఏదైనా కనిపిస్తే - దాని కోసం వెళ్ళండి.

క్లయింట్ సెటప్

ఇక్కడ నేను 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

అంతా, సర్వర్ యొక్క టన్నెల్ IP చిరునామాను DNSగా పంపిణీ చేయడానికి రౌటర్‌లో DHCPని కాన్ఫిగర్ చేయడానికి ఇది మిగిలి ఉంది మరియు పథకం సిద్ధంగా ఉంది.

లోపాలను

డొమైన్‌ల జాబితాను రూపొందించడానికి మరియు ప్రాసెస్ చేయడానికి ప్రస్తుత అల్గారిథమ్‌తో, ఇది ఇతర విషయాలతోపాటు, youtube.com మరియు దాని CDNలు.

మరియు ఇది అన్ని వీడియోలు VPN ద్వారా వెళ్తాయని వాస్తవం దారితీస్తుంది, ఇది మొత్తం ఛానెల్‌ను అడ్డుకుంటుంది. ప్రస్తుతానికి RKNని నిరోధించే ప్రసిద్ధ డొమైన్‌ల-మినహాయింపుల జాబితాను కంపైల్ చేయడం విలువైనదే కావచ్చు, ధైర్యం సన్నగా ఉంటుంది. మరియు అన్వయించేటప్పుడు వాటిని దాటవేయండి.

తీర్మానం

వివరించిన పద్ధతి, ప్రొవైడర్లు ప్రస్తుతం అమలు చేసే దాదాపు ఏదైనా నిరోధించడాన్ని దాటవేయడానికి మిమ్మల్ని అనుమతిస్తుంది.

సూత్రం లో, dnstap-bgp డొమైన్ పేరు ఆధారంగా కొంత స్థాయి ట్రాఫిక్ నియంత్రణ అవసరమయ్యే ఇతర ప్రయోజనాల కోసం ఉపయోగించవచ్చు. మన కాలంలో, వెయ్యి సైట్‌లు ఒకే IP చిరునామాలో (ఉదాహరణకు కొన్ని క్లౌడ్‌ఫ్లేర్‌ల వెనుక) వేలాడగలవని గుర్తుంచుకోండి, కాబట్టి ఈ పద్ధతి చాలా తక్కువ ఖచ్చితత్వాన్ని కలిగి ఉంటుంది.

కానీ తాళాలను దాటవేయడం యొక్క అవసరాలకు, ఇది చాలా సరిపోతుంది.

చేర్పులు, సవరణలు, అభ్యర్థనలను లాగండి - స్వాగతం!

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి