Пре­жде чем на­чи­нать свое по­вест­во­ва­ние, ма­лень­кое со­об­ще­ние для всех, кто про­чи­тал то­пик по­ста и за­ка­чал убе­лен­ной се­ди­ной\лы­си­ной го­ло­вой с не­при­кры­тым уко­ром: да, я знаю о су­ще­ство­ва­нии BIND и да, я знаю про MySQL BIND SDB, или да­же про MyDNS то­же слы­шал, и на­строить ке­ши­ру­ю­щий child нейм­сер­вер умею. Увы, ре­а­ли­за­ция та­кой ком­би­на­ции не ви­де­лась мне це­ле­со­об­раз­ной по ря­ду при­чин о ко­то­рых я не бу­ду тут пи­сать. В лю­бом слу­чае, мне нуж­но бы­ло сде­лать DNS с фильтра­ци­ей опре­де­лен­ных до­мен­ных имен с хра­не­ни­ем списка этих имен на цен­траль­ном сер­ве­ре в MySQL ба­зе дан­ных. Нуж­но бы­ло сде­лать его не на­много медлен­ней род­но­го ва­ри­ан­та, что бы­ло впол­не не­три­виаль­ной за­да­чей. Ду­маю, что для на­ча­ла мне сто­ит объ­яс­нить, за­чем это все за­ду­мы­ва­лось. Как упо­ми­на­лось в про­шлом по­сте, я ра­бо­таю в компа­нии основ­ным направ­ле­ние де­я­тель­но­сти ко­то­рой яв­ляет­ся предо­став­ле­ние сер­ви­са за­щи­щен­но­го VPN тун­не­ля для об­хо­да кор­по­ра­тив­ных фа­ер­во­лов, шиф­ро­ва­ния тра­фи­ка, за­щи­ты от man-in-the-middle и про­чих мерз­ких сниф­фе­ров, по­лу­че­ния сво­е­го лич­но­го ре­аль­но­го IP где-то в стра­нах эк­ва­то­ри­аль­ной Аме­ри­ки, ну и для за­щи­ты от ви­ру­сов с по­мо­щью ре­ше­ний от тов. Каспер­ско­го. В ка­че­стве сер­вер­ных пло­ща­док ис­поль­зу­ют­ся раз­но­об­разные virtual dedicated и root dedicated от разных про­вайде­ров по все­му ми­ру. И вот тут воз­ни­кает основ­ная пробле­ма, ко­то­рая за­гу­би­ла большинство подоб­ных сер­ви­сов - тор­рен­ты. Да, в большинстве TOS-ов большинства хо­сте­ров яс­но про­пи­са­но, что если с ва­ше­го сер­ве­ра бу­дет за­ме­че­на подо­зри­тель­ная ак­тив­ность по за­груз­ке из ин­тер­не­та не­ле­галь­но­го контен­та, то вы ав­то­ма­ти­че­ски ли­ша­е­тесь предо­став­ляе­мой услу­ги без ка­кой-ли­бо на­де­жды на ма­те­ри­аль­ное воз­ме­ще­ние. Зву­чит до­ста­точ­но пе­чаль­но, учи­ты­вая предопла­ту на це­лый год. В ито­ге, ча­сто по­лу­ча­ешь подоб­ные пись­ма, рас­сы­ла­е­мые по­лу­ав­то­ма­ти­че­ски­ми си­сте­ма­ми пра­во­за­щит­ных ище­ек, что не до­бав­ляет хо­ро­ше­го на­строе­ния в твой и так не осо­бо ве­се­лый ра­бо­чий день. Ка­ким об­разом они от­сле­жи­ва­ют по­пыт­ку ска­чи­ва­ния тор­рен­та? Fake Seed к при­ме­ру? Или про­сто фильтру­ют запро­сы к тор­рент тре­ке­рам? Я без по­ня­тия, но вот если пра­виль­ным об­разом не сре­а­ги­ро­вать на подоб­ное пись­мо, убе­див хо­стера, что этот му­дак, ка­ча­ю­щий Спан­ж­бо­ба, фи­зи­че­ски устра­нен, а вся его се­мья сте­ри­ли­зо­ва­на - мож­но по­лу­чить се­рьезные пробле­мы. Вплоть да­же до су­деб­но­го раз­би­ра­тель­ства, все мы но­во­сти чи­та­ем. Это пробле­ма, те­перь по­го­во­рим о ре­ше­нии. Лю­бой си­стем­ный адми­ни­стра­тор ска­жет вам, что не су­ще­ству­ет оп­ти­маль­но­го ре­ше­ния пере­кры­тия кис­ло­ро­да p2p тра­фи­ку. Да, мож­но огра­ни­чи­вать ко­ли­че­ство udp сес­сий од­но­го хо­ста (что до­ста­точ­но глу­пое ре­ше­ние, учи­ты­вая са­му при­ро­ду про­то­ко­ла с неяв­ным за­кры­ти­ем со­еди­не­ния), мож­но во­об­ще за­крыть udp (что еще глу­пее, од­ним ма­хом ли­ша­ем поль­зо­ва­те­ля вся­ких скай­пов\си­пов, а тор­рент кли­ен­ты мо­гут спо­кой­но и че­рез TCP ра­бо­тать), мож­но ис­поль­зо­вать вся­кие мо­ду­ли фильтра­ции уров­ня iptables вро­де ipp2p, OpenDPI, l7-filter (на сайте пи­шут про вы­со­кий perfomance, но у ме­ня la вска­ки­вал до 1 при 10 со­еди­не­ни­ях и ино­гда всплы­ва­ли defunct зом­би) или во­об­ще пус­кать весь тра­фик OpenVPN  в лоб че­рез фильтру­ю­щий прок­си сер­вер (мною бы­ло опро­бо­ва­но все из списка, увы, все ре­ше­ния крайне тре­бо­ва­тель­ны к си­стем­ным ре­сур­са­ми из-за необ­хо­ди­мо­сти про­че­сы­ва­ния ре­гу­ляр­ка­ми большо­го по­то­ка дан­ных и по этой при­чи­не не подо­шли, не все сер­ве­ра в се­ти мог­ли поз­во­лить се­бе та­кую рос­кошь). Есть еще ре­ше­ния для ду­ра­ков: за­кры­тие ти­пич­ных пор­тов, что не ра­бо­та­ет в усло­ви­ях совре­мен­ных кли­ен­тов и тот ва­ри­ант, ко­то­рый вы­брал я - DNS бло­ки­ров­ка глав­ных тор­рент тре­ке­ров. За­щи­та ужас­ная, ни­что не ме­ша­ет кли­ен­ту по­сле под­клю­че­ния вы­ста­вить вме­сто при­сва­и­ва­е­мо­го нейм­сер­ве­ра ка­кой-то дру­гой, дан­ное ре­ше­ние к то­му же не по­мо­га­ет, если поль­зо­ва­тель на­чал ска­чи­ва­ние тор­рен­та до под­клю­че­ния к на­ше­му VPN-у (хо­тя моя прак­ти­ка по­ка­зы­ва­ет, что в та­ких слу­ча­ях пра­во­за­щит­ные ищей­ки мол­чат, что еще раз слу­жит под­твер­жде­ни­ем конспи­ро­ло­ги­че­ской тео­рии, что софт ко­пи­райте­ров про­сто от­сле­жи­ва­ет announce запро­сы к тре­ке­рам), и ко­неч­но же дан­ный ва­ри­ант не спа­са­ет от DHT, ко­то­ро­му во­об­ще ни­че­го не нуж­но: ни тре­ке­ры, ни дн­сы. Но ра­бо­та­ет же, ко­ли­че­ство пи­сем от пра­во­обла­да­телей со­кра­ти­лось до 1-2х за 3 ме­ся­ца, воз­вра­ща­ем NXDOMAIN для всех до­мен­ных имен в бле­кли­сте и жи­вем при­пе­ва­ючи. Кста­ти, если кто име­ет идеи, как по­бо­роть bittorrent в се­ти - скинь­те мне хоть па­ру строк на mail@smirnoff.sumy.ua, чтоб я при­мер­но знал, ку­да ко­пать. С ме­ня благо­дар­но­сти в при­ем­ном для вас эк­ви­ва­лен­те.

Воз­вра­ща­ем­ся к те­ме ре­а­ли­за­ции. Пре­жде всего, от­ве­чаю на во­прос: за­чем мне нуж­но много нейм­сер­ве­ров, а не один цен­траль­ный без всех этих за­мо­ро­чек с MySQL и т.д. В ка­че­стве master мы бу­дем ис­поль­зо­вать Google Public DNS, на нем был за­ме­чен load balancing для не­ко­то­рых круп­ных сайтов, на запрос по то­му же юту­бу с разных гео­гра­фи­че­ских то­чек отда­ва­лись разные A-за­пи­си. К то­му же, про­во­дить NS query с гон­конг­ско­го сер­ве­ра че­рез тун­нель на цен­траль­ный сер­вер где-то в Люк­сем­бур­ге или США - очень медлен­но, поэто­му на­ши DNS-ы бу­дут от­ве­чать по то­му же ад­ре­су, что и шлюз. Язы­ком ре­а­ли­за­ции стал Perl. По­че­му? Да про­сто в нем есть все необ­хо­ди­мые нам компо­нен­ты. Исполь­зо­вать мы бу­дем Net::DNS для ре­зол­ве­ра и Net::DNS::Nameserver для сер­ве­ра. Ра­зу­ме­ет­ся, без ке­ши­ро­ва­ния ни­ку­да. В ка­че­стве ре­ше­ния я со­ве­тую смот­реть в сто­ро­ну Cache::Bounded, ко­то­рое яв­ляет­ся по су­ти оберт­кой во­круг Cache::MemoryCache с оп­ти­миза­ци­ей и об­ну­ле­ни­ем ке­ша по до­сти­же­нию опре­де­лен­но­го раз­ме­ра, что спа­сет нас от пере­пол­не­ния па­мя­ти. В ре­зульта­те по­лу­чи­лось что-то вро­де та­ко­го ко­да. Сра­зу за­ме­чу, что 3 цик­ла for при чте­нии от­ве­та из ке­ша - не­объ­яс­ни­мая мною ми­сти­ка. Ка­за­лось бы с по­мо­щью тех же эле­мен­тов ис­ход­но­го мас­си­ва пу­тем пере­бо­ра фор­ми­ру­ем но­вый, а вот про­стое при­сва­и­ва­ние - не ра­бо­та­ет. И хоть ты трес­ни. По ско­ро­сти впол­не нор­маль­но, пер­вый запрос ко­неч­но от­ни­ма­ет опре­де­лен­ное вре­мя, но в даль­ней­шем из ке­ша в па­мя­ти все чи­та­ет­ся очень бы­стро. В ка­че­стве бо­ну­са, дер­жи­те спи­сок из 1800 са­мых круп­ных тор­рент тре­ке­ров для бло­ки­ров­ки.

Как по мне, сер­ви­сы vpn тун­не­лей долж­ны слу­жить ис­клю­чи­тель­но 2м це­лям: ска­чи­ва­ние тор­рен­тов в стра­нах, где за это на­хо­дят и бьют по ру­кам; и про­смотр ка­то­ли­че­ски­ми свя­щен­ни­ка­ми дет­ской пор­но­гра­фии там, где это то­же не осо­бо при­вет­ству­ет­ся. Пер­вых слу­ча­ев ста­но­вит­ся все больше, а по­след­них - все мень­ше. Мы же на­шим TOS-ом запре­ща­ем основ­ные при­о­ри­тет­ные направ­ле­ния. А все осталь­ные ис­то­рии с  за­щи­той ва­шей ин­фор­ма­ции, все это сказки для де­тей. Мы то с ва­ми зна­ем, что от па­яль­ни­ка еще ни один фа­ер­волл или ка­нал с шиф­ро­ва­ни­ем не спа­сал.