Паскараем OpenVPN за $9.99* ці ўбудоўваем Orange Pi One у роўтэр

Паскараем OpenVPN за $9.99* ці ўбудоўваем Orange Pi One у роўтэр

Некаторыя з нас не карыстаюцца інтэрнэтам без VPN па тых ці іншых прычынах: камусьці патрэбен выдзелены IP, і прасцей і танней купіць VPS з двума IP, чым купляць адрас у правайдэра, хтосьці жадае атрымліваць доступ да ўсіх вэб-сайтаў, а не толькі дазволеным на тэрыторыі РФ, трэцім патрэбен IPv6, а правайдэр яго не падае…
Часцей за ўсё VPN-злучэнне ўсталёўваюць на самай прыладзе, якое выкарыстоўваецца ў пэўны момант, што цалкам апраўдана, калі ў вас толькі адзін кампутар і адзін тэлефон, і вы іх рэдка карыстаецеся адначасова. Калі ж у вашай хатняй сетцы мноства прылад, ці, напрыклад, ёсць такія, на якіх VPN наладзіць нельга, было б зручней паднімаць тунэль прама на хатнім роўтары, каб не задумвацца аб наладзе кожнай прылады па асобнасці.

Калі вы хоць раз усталёўвалі OpenVPN на свой маршрутызатар, вы, верагодна, былі непрыемна здзіўлены хуткасцю яго працы. SoC'і нават танных роўтэраў без асаблівых праблем прапускаюць праз сябе калягігабітны трафік, за кошт вынасу функцый маршрутызацыі і NAT на асобны чып, прызначаны выключна для выканання гэтай задачы, а асноўныя працэсары такіх роўтэраў даволі слабыя, т.я. нагрузкі на іх практычна ніякай няма. Такі кампраміс дазваляе дасягнуць высокай хуткасці працы роўтара і прыкметна зменшыць кошт гатовай прылады — маршрутызатары з магутнымі працэсарамі каштуюць у некалькі разоў даражэй, і пазіцыянуюцца ўжо не толькі як скрынка для раздачы інтэрнэту, але і ў якасці NAS, торэнтакачалка і хатняй мультымедыя-сістэмы.

Мой роўтар, TP-Link TL-WDR4300, нельга назваць новым – мадэль з'явілася ў сярэдзіне 2012 года, і валодае 560 Мгц-працэсарам архітэктуры MIPS32 74Kc, магутнасці якога хапае толькі на 20-23 Мб / с шыфраванага трафіку праз OpenVPN, што па хуткасці сучаснага хатняга інтэрнэту зусім няшмат.
Як бы нам павысіць хуткасць шыфраванага тунэля? Мой роўтар даволі функцыянальны, падтрымлівае 3×3 MIMO, ды і наогул, добра працуе, не хацелася б яго мяняць.
Бо цяпер прынята рабіць 10-мегабайтныя інтэрнэт-старонкі, пісаць дэсктопныя прыкладанні на node.js і пакаваць іх у 100-мегабайтны файл, нарошчваць вылічальныя магутнасці замест аптымізацыі, мы здзейснім нешта жудаснае — перакладзем VPN-падлучэнне на прадукцыйны аднаплатны «кампутар» Pi One, які ўсталюем у корпус роўтара, не займаючы існыя сеткавыя і USB-парты, усяго за $9.99*!
* + дастаўка, + падаткі, + на піва, + MicroSD.

OpenVPN

Нельга назваць працэсар роўтара зусім ужо слабым – ён здольны шыфраваць і хэшаваць дадзеныя алгарытмам AES-128-CBC-SHA1 з хуткасцю 50 Мб / с, што прыкметна хутчэй таго, як працуе OpenVPN, а сучасны струменевы шыфр CHACHA20 з хешам POLY1305 і мегабіт у секунду! Чаму ж хуткасць VPN-тунэля такая невысокая? Уся справа ў пераключэнні кантэксту паміж прасторай карыстальніка і прасторай ядра: OpenVPN шыфруе трафік і мае зносіны з навакольным светам у кантэксце карыстальніка, а ў кантэксце ядра адбываецца сама маршрутызацыя. Аперацыйнай сістэме даводзіцца ўвесь час перамыкацца то туды, то сюды, на кожны прыняты ці перададзены пакет, а гэтая аперацыя няхуткая. Дадзеная праблема ўласцівая ўсім VPN-прыкладанням, якія працуюць праз TUN/TAP-драйвер, і нельга сказаць, што праблема нізкай хуткасці выклікана дрэннай аптымізацыяй OpenVPN (хоць, вядома, там ёсць месцы, якія трэба б перарабіць). Ніводны userspace VPN-кліент не выдае нават гігабіта з адключаным шыфраваннем на маім наўтбуку, што ўжо казаць пра сістэмы са слабым працэсарам.

Аранжавы Пі Адзін

Аднаплатнік Orange Pi One ад кампаніі Xunlong - самая выгадная прапанова па суадносінах прадукцыйнасць / кошт на дадзены момант. За $9.99* вы атрымліваеце дыхтоўны чатырох'ядравы працэсар ARM Cortex-A7, (стабільна) які працуе на частаце 1008 Мгц, і відавочна прадукцыйней суседзяў Raspberry Pi Zero і Next Thing CHIP па коштавай катэгорыі. На гэтым плюсы заканчваюцца. Кампанія Xunlong надае софту сваіх поплаткаў роўна нуль увагі, і на момант запуску One у продаж не падавала нават файл канфігурацыі поплатка, не кажучы ўжо пра гатовыя выявы. Allwinner – вытворца SoC – таксама не асабліва трапятліва ставіцца да падтрымкі свайго прадукта. Іх цікавіць толькі мінімальная працаздольнасць у АС Android 4.4.4, а значыць, мы змушаныя выкарыстоўваць ядро ​​версіі 3.4 з Android-патчамі. На шчасце, ёсць энтузіясты, якія збіраюць дыстрыбутывы, кіруюць ядро, пішуць код для падтрымкі поплаткаў у mainline-ядры, г.зн. фактычна робяць працу за вытворцу, прымушаючы гэта лайно прымальна працаваць. Для сваіх мэт я абраў дыстрыбутыў Armbian, ён часта і зручна абнаўляецца (новыя ядры ўсталёўваюцца прама праз пакетны мэнэджар, а не капіяваннем файлаў на адмысловую частку, як гэта звычайна бывае ў Allwinner), ды і падтрымлівае большасць перыферыі, у адрозненне ад астатніх.

Маршрутызатар

Для таго, каб не загружаць слабы працэсар роўтара шыфраваннем і паскорыць наша VPN-злучэнне, мы можам перакласці гэтую задачу на плечы больш прадукцыйнага працэсара Orange Pi, падлучыўшы яго да роўтара якой-небудзь выявай. На розум прыходзіць падлучэнне альбо па Ethernet, альбо па USB – абодва гэтых стандарту падтрымліваюцца абодвума прыладамі, але не хацелася займаць ужо існуючыя парты. На шчасце, выйсце ёсць.

Мікрасхема USB-хаба GL850G, якая выкарыстоўваецца ў роўтары, падтрымлівае працу 4 USB-партоў, два з якіх не разлітаваныя. Няясна, чаму вытворца не стаў іх распайваць, мяркую, каб не даць магчымасць карыстачам падлучыць адразу 4 прылады з высокім спажываннем току (напрыклад, цвёрдых кружэлак), т.к. штатны блок харчавання роўтара не разлічаны на такую ​​нагрузку. У любым выпадку, гэта нам на руку.
Паскараем OpenVPN за $9.99* ці ўбудоўваем Orange Pi One у роўтэр
Для таго, каб атрымаць яшчэ адзін USB-порт, дастаткова дапаяць два правады да 8(D-) і 9(D+) або 11(D-) і 12(D+) пін.

Паскараем OpenVPN за $9.99* ці ўбудоўваем Orange Pi One у роўтэр

Аднак недастаткова проста так падлучыць два USB-прылады і спадзявацца, што ўсё запрацуе само сабой, як гэта б адбылося з Ethernet. Па-першае, нам трэба прымусіць аднаго з іх працаваць у рэжыме USB Client, а не USB Host, па-другое, нам трэба вызначыцца з тым, як прылады будуць вызначаць адно аднаго. Існуе мноства драйвераў так званых USB Gadgets (па назве падсістэмы Linux-ядра), якія дазваляюць эмуляваць розныя тыпы USB-прылад: сеткавы адаптар, аўдыёкарту, клавіятуру і мыш, флешку, фотаапарат, кансоль праз паслядоўны порт. Так як наша прылада будзе працаваць з сеткай, нам лепш за ўсё падыдзе эмуляцыя Ethernet-адаптара.

Існуе тры стандарты Ethernet-over-USB:

  • Аддалены NDIS (RNDIS). Састарэлы стандарт ад Microsoft, выкарыстоўваўся пераважна ў часы Windows XP.
  • Ethernet Control Model (ECM). Просты стандарт, які інкапсулюе Ethernet-фрэймы ў USB-пакеты. Выдатна падыходзіць для правадных мадэмаў з USB-падлучэннем, дзе зручна перадаваць кадры без апрацоўкі, але з-за сваёй прастаты і абмежаванняў USB-шыны працуе не занадта хутка.
  • Ethernet Emulation Model (EEM). Больш разумны пратакол, які ўлічвае абмежаванні USB і аптымальна агрэгуе некалькі фрэймаў у адзін, падвышаючы такім чынам прапускную здольнасць.
  • Network Control Model (NCM). Самы новы пратакол. Валодае перавагамі EEM і яшчэ больш аптымізуе працу з шынай.

Каб прымусіць працаваць любы з гэтых пратаколаў на нашай плаце, як заўсёды, давядзецца сустрэцца з некаторымі цяжкасцямі. З-за таго, што Allwinner цікавяць толькі Android-часткі ядра, нармальна працуе толькі Android Gadget – той код, які рэалізуе сувязь з adb, экспарт прылады па пратаколе MTP і эмуляцыю флэшкі на Android-прыладах. Сам Android Gadget падтрымлівае і пратакол RNDIS, але ў ядры Allwinner ён зламаны. Калі вы паспрабуеце скампіляваць ядро ​​з любым іншым USB Gadget, прылада проста не з'явіцца ў сістэме, што б вы ні рабілі.
Для вырашэння праблемы, па-добраму, неабходна знайсці месца ініцыялізацыі USB-кантролера ў мадыфікаваным распрацоўшчыкамі кодзе Android-гаджэта android.c, але існуе і абыходны манеўр, каб прымусіць працаваць, як мінімум, эмуляцыю Ethernet праз USB:

--- sun8i/drivers/usb/sunxi_usb/udc/sunxi_udc.c 2016-04-16 15:01:40.427088792 +0300
+++ sun8i/drivers/usb/sunxi_usb/udc/sunxi_udc.c 2016-04-16 15:01:45.339088792 +0300
@@ -57,7 +57,7 @@
 static sunxi_udc_io_t g_sunxi_udc_io;
 static u32 usb_connect = 0;
 static u32 is_controller_alive = 0;
-static u8 is_udc_enable = 0;   /* is udc enable by gadget? */
+static u8 is_udc_enable = 1;   /* is udc enable by gadget? */
 
 #ifdef CONFIG_USB_SUNXI_USB0_OTG
 static struct platform_device *g_udc_pdev = NULL;

Гэты патч сілком уключае рэжым USB-кліента, што дазваляе выкарыстоўваць звычайныя USB Gadgets з Linux.
Цяпер варта перасабраць ядро ​​з гэтым патчам і неабходным гаджэтам. Я абраў EEM, т.я. па выніках тэстаў ён аказаўся прадукцыйней NCM.
Каманда Armbian дае вельмі простую і зручную зборачную сістэму для ўсіх падтрымліваемых поплаткаў у дыстрыбутыве. Дастаткова спампаваць яе, пакласці наш патч у userpatches/kernel/sun8i-default/otg.patch, крыху адрэдагаваць compile.sh і абраць неабходны gadget:

Паскараем OpenVPN за $9.99* ці ўбудоўваем Orange Pi One у роўтэр

Ядро збярэцца ў deb-пакет, які не складзе працы ўсталяваць на поплатак праз dpkg.
Застаецца толькі падключыць плату па USB і наладзіць наш новы сеткавы адаптар на атрыманне адраса праз DHCP. Для гэтага неабходна дадаць прыкладна наступнае ў /etc/network/interfaces:

auto usb0
        iface usb0 inet dhcp
        hwaddress ether c2:46:98:49:3e:9d
        pre-up /bin/sh -c 'echo 2 > /sys/bus/platform/devices/sunxi_usb_udc/otg_role'

MAC-адрас лепш задаць уручную, т.я. ён будзе выпадковым пры кожнай перазагрузцы прылады, што няёмка і клапотна.
Падлучальны MicroUSB-кабель да OTG-раздыму, падлучальны сілкаванне з роўтара (яго можна падаваць на 2 і 3 піны грабянцы, а не толькі на раздым сілкавання).

Засталося наладзіць роўтар. Дастаткова ўсталяваць пакет з EEM-драйверам і дадаць наша новае сеткавае USB-прылада ў брыдж лакальнай firewall-зоны:

opkg install kmod-usb-net-cdc-eem

Паскараем OpenVPN за $9.99* ці ўбудоўваем Orange Pi One у роўтэр
Каб маршрутызаваць увесь трафік у VPN-тунэль, трэба альбо дадаць SNAT-правіла на IP-адрас платы на баку роўтара, альбо раздаваць у якасці адраса шлюза адрас платы праз dnsmasq. Апошняе робіцца даданнем наступнага радка ў /etc/dnsmasq.conf:

dhcp-option = tag:lan, option:router, 192.168.1.100

дзе 192.168.1.100 - IP-адрас вашай платы. Не забудзьцеся прапісаць адрас машрутызатара ў настройках сеткі на самой плаце!

Для ізаляцыі кантактаў платы ад кантактаў роўтара выкарыстоўвалася меламінавых губка. Атрымалася неяк так:
Паскараем OpenVPN за $9.99* ці ўбудоўваем Orange Pi One у роўтэр

Заключэнне

Працуе сетку праз USB на здзіўленне хутка: 100-120 Мб/с, я чакаў меншага. OpenVPN прапускае праз сябе каля 70 Мб/з шыфраванага трафіку, што таксама не вельмі шмат, але для маіх патрэб хапае. Вечка маршрутызатара зачыняецца няшчыльна, пакідаючы невялікі зазор. Эстэты могуць вылітаваць Ethernet і USB Host-раздымы ў платы, што дазволіць вечку зачыніцца цалкам, і яшчэ месца застанецца.
А лепш не займацца такой парнаграфіяй і купіць Turris Omnia.

Крыніца: habr.com

Дадаць каментар