Ускоряваме 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 свързването на производителния едноплатен компютър Orange Pi One, който ще инсталираме в кутията на рутера, без да заемат съществуващите мрежови и USB портове, само за $9.99*!
* + доставка, + такси, + за бира, + MicroSD.

OpenVPN

Не може да се нарече процесорът на рутера съвсем слаб — той е в състояние да шифрова и хешира данни с алгоритъма AES-128-CBC-SHA1 със скорост 50 Мб/с, което е значително по-бързо от начина, по който работи OpenVPN, а съвременният потоков шифър CHACHA20 с хеш POLY1305 развива цели 130 мегабита в секунда! Защо тогава скоростта на VPN тунела е толкова ниска? Всичко е свързано с превключването на контекста между пространството на потребителя и пространството на ядрото: OpenVPN шифрова трафика и комуникира със света в контекста на потребителя, а в контекста на ядрото се извършва самата маршрутизация. Операционната система постоянно трябва да превключва тук-там, за всеки получен или предаден пакет, а тази операция не е бърза. Този проблем е характерен за всички VPN приложения, работещи чрез TUN/TAP драйвери, и не може да се каже, че проблемът с ниската скорост е причинен от лошата оптимизация на OpenVPN (въпреки че, разбира се, там има места, които трябва да се преработят). Нито един клиент на VPN в потребителското пространство не предоставя дори гигабит с деактивирано шифроване на моя лаптоп, какво да говорим за системи с по-слаб процесор.

Orange Pi One

Одноплатник Orange Pi One от компанията Xunlong е най-изгодното предложение за съотношение производителност/цена в момента. За $9.99* получавате солиден четириядерен процесор ARM Cortex-A7, работещ стабилно на честота 1008 MHz, и очевидно по-продуктивен от съседите Raspberry Pi Zero и Next Thing C.H.I.P. в ценовата категория. На този етап плюсовете свършват. Компанията Xunlong не отделя никакво внимание на софтуера на своите платки и при старта на One в продажба не предоставя дори файл с конфигурация на платката, да не говорим за готови образи. Производителят на SoC Allwinner също не е особено внимателен към поддръжката на своя продукт. Интересува ги само минималната функционалност в ОС Android 4.4.4, което значи, че сме принудени да използваме ядрото версия 3.4 с Android патчове. За щастие, има ентусиасти, които съставят дистрибуции, коригират ядрото, пишат код за поддръжка на платките в основното ядро, т.е. всъщност извършват работата на производителя, за да накарат това устройство да работи приемливо. За собствените си нужди избрах дистрибуция Armbian, която често и удобно се обновява (нови ядра се инсталират директно през пакетния мениджър, а не чрез копиране на файлове в специален дял, както обикновено става с Allwinner) и поддържа повечето периферии, за разлика от останалите.

Рутер

За да не натоварваме слабото процесорно ядро на рутера с криптиране и да ускорим VPN връзката ни, можем да прехвърлим тази задача на по-производителен процесор Orange Pi, свързвайки го с рутера по някакъв начин. На ум идва свързването или по Ethernet, или по USB — и двата стандарта се поддържат от двете устройства, но не искахме да използваме вече съществуващите портове. За щастие, има решение.

Чипът на USB хъба GL850G, който се използва в рутера, поддържа работата на 4 USB порта, два от които не са запоени. Не е ясно защо производителят не ги е запоил, предполагам, за да не даде възможност на потребителите да свържат четири устройства с висока консумация на ток (например външни дискове), тъй като стандартният блок на рутера не е проектиран за такава натовареност. Във всеки случай, това е в наша полза.
Ускоряваме 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:

  • Remote 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 Gadget 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;   
+static u8 is_udc_enable = 1;   
 
 #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 и да изберете необходимия гаджет:

Ускоряваме 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 устройство в бриджа на локалната защитна зона:

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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster