
我們中的一些人出於某種原因不會在沒有VPN 的情況下使用互聯網:有人需要專用IP,購買具有兩個IP 的VPS 比從提供商那裡購買地址更容易、更便宜,有人想要訪問所有網站,不僅是俄羅斯聯邦境內允許的,其他國家也需要 IPv6,但提供者不提供...
大多數情況下,VPN 連線是在某個時刻使用的裝置本身上建立的,如果您只有一台電腦和一部手機並且很少同時使用它們,那麼這是有意義的。 如果您的家庭網路中有很多設備,或者例如有些設備無法設定VPN,那麼直接在家庭路由器上建立隧道會更方便,而不必考慮單獨設定每個設備。
如果您曾經安裝過 OpenVPN 安裝路由器時,您可能對其速度感到驚訝。即使是價格低廉的路由器,其SoC也能輕鬆處理接近千兆的流量,這得益於專用的路由和NAT功能被分配到單獨的晶片上。這些路由器的主處理器效能較弱,因為它們幾乎不承擔任何負載。這種折衷方案既保證了路由器的高速效能,也大幅降低了成品的價格——配備強大處理器的路由器價格要貴好幾倍,如今它們的定位不僅包括網路共享設備,還包括NAS、BT下載器和家庭多媒體系統。
我的路由器TP-Link TL-WDR4300不能算是新款——這款型號是2012年中期推出的,配備560MHz的處理器和MIPS32 74Kc架構,其效能僅足以處理20-23Mbps的加密流量。 OpenVPN以現代家庭網路速度標準來看,這速度非常慢。
我們如何提高加密隧道的速度? 我的路由器功能齊全,支援 3x3 MIMO,整體運作良好,我不想更改它。
既然現在習慣製作10兆的互聯網頁面,用node.js編寫桌面應用程式並將其打包成100兆的文件,增加計算能力而不是優化,我們會做一些可怕的事情——我們將VPN連接轉移到一台高效的單板「電腦」Orange Pi One,我們將其安裝在路由器機箱中,而不佔用現有網路和USB 端口,只需9.99 美元*!
* + 送貨、+ 稅金、+ 啤酒、+ MicroSD。
OpenVPN
路由器的處理器並非完全弱——它可以使用 AES-128-CBC-SHA1 演算法以 50 Mbps 的速度對資料進行加密和雜湊處理,這明顯比它的實際運行速度要快。 OpenVPN現代的 CHACHA20 流密碼演算法搭配 POLY1305 雜湊演算法,傳輸速度可達每秒 130 兆位元!那麼,為什麼 VPN 隧道速度如此緩慢呢?這完全是因為用戶空間和核心空間之間的上下文切換所造成的: OpenVPN 它在用戶上下文中加密流量並與外部世界通信,而實際的路由操作則在核心上下文中進行。作業系統必須針對每個接收或發送的資料包不斷地來回切換,這種操作速度很慢。所有透過 TUN/TAP 驅動程式運行的 VPN 應用程式都存在這個問題,速度慢並非最佳化不足所致。 OpenVPN (當然,有些方面還有待改進。)在我的筆記型電腦上,沒有一款用戶空間 VPN 用戶端在禁用加密的情況下能達到千兆速度,更不用說在處理器性能較弱的系統上了。
橙皮一號
目前迅龍推出的 Orange Pi One 單板開發板性價比最高。只需 9.99 美元*,即可獲得一顆運作穩定、主頻為 1008 MHz 的四核心 ARM Cortex-A7 處理器,效能明顯優於同價位的 Raspberry Pi Zero 和 Next Thing CHIP。然而,它的優點也僅限於此。迅龍對開發板的軟體支援毫不重視,在 Orange Pi One 發布之初,甚至連板級設定檔都沒有提供,更別提現成的系統鏡像了。 SoC 製造商全志也並未對產品提供太多支持,他們只專注於最基本的作業系統功能。 Android 4.4.4,這意味著我們被迫使用核心版本 3.4。 Android補丁。幸運的是,有些愛好者會建立發行版、修改內核,並編寫程式碼來支援主線內核中的各種開發板——換句話說,他們實際上承擔了製造商的工作,使這些垃圾產品能夠勉強運行。就我而言,我選擇了 Armbian 發行版;它更新頻繁且便捷(新核心直接透過軟體套件管理器安裝,而不是像 Allwinner 那樣需要將檔案複製到特定分割區),而且它支援大多數外設,不像其他一些發行版那樣。
路由器
為了不給路由器的弱處理器載入加密並加速我們的VPN連接,我們可以透過某種方式將其連接到路由器,從而將這項任務轉移到更強大的Orange Pi處理器的肩上。 我想到了透過乙太網路或 USB 連接 - 這兩種設備都支援這兩種標準,但我不想佔用現有連接埠。 幸運的是,還有一條出路。
路由器中使用的GL850G USB集線器晶片支援4個USB端口,其中兩個是不有線的。 我猜想,目前還不清楚製造商為什麼不將它們拆焊,以防止用戶同時連接 4 個高電流消耗的設備(例如硬碟)。 路由器的標準電源並不是為這樣的負載而設計的。 無論如何,這對我們有利。

為了獲得另一個 USB 端口,您只需將兩條電線焊接到引腳 8(D-) 和 9(D+) 或 11(D-) 和 12(D+) 上。

然而,僅僅連接兩個 USB 設備並期望一切自動運行是不夠的,就像乙太網路連接一樣。首先,我們需要強制其中一個裝置以 USB 用戶端模式而非 USB 主機模式運作;其次,我們需要確定裝置如何相互識別。有許多驅動程式可用於所謂的 USB 小工具(以其子系統命名)。 Linux(核心)可以模擬各種類型的 USB 裝置:網路適配器、音效卡、鍵盤和滑鼠、隨身碟、相機和串口控制台。由於我們的設備將聯網,因此模擬乙太網路適配器是最佳選擇。
USB 乙太網路標準共有三種:
- 遠程 NDIS (RNDIS)微軟的一項過時標準,主要用於… Windows XP。
- 乙太網路控制模型 (ECM)。 將乙太網路封包封裝在 USB 封包中的簡單標準。 非常適合具有 USB 連接的有線調製解調器,可以方便地傳輸幀而不進行處理,但由於其簡單性和 USB 總線的限制,速度不是很快。
- 乙太網路模擬模型 (EEM)。 一種更聰明的協議,考慮了 USB 限制並以最佳方式將多個幀聚合為一個,從而提高吞吐量。
- Network Control Model (NCM)。 最新協議。 具備EEM的優勢,進一步優化公車體驗。
和以往一樣,要讓這些協定在我們的開發板上正常運行,將會面臨一些挑戰。因為全志只對……有興趣。 Android內核的某些部分,僅正常工作 Android Gadget 是實作與 adb 通訊、透過 MTP 協定導出裝置以及模擬快閃磁碟機的程式碼。 Android裝置.他自己 Android 該設備也支援RNDIS協議,但在全志核心中存在問題。如果您嘗試使用任何其他USB裝置編譯內核,無論您做什麼,該裝置都不會出現在系統中。
要解決這個問題,理想情況下,需要找到開發人員修改的程式碼中初始化 USB 控制器的位置。 Android-android.c 小工具,但也有一個變通方法可以至少讓透過 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 裝置。 Linux.
現在您應該使用此補丁和必要的小工具重建核心。 我選擇EEM是因為... 根據測試結果,它比 NCM 的生產效率更高。
Armbian 團隊提供 對於發行版中所有支援的板。 只需下載它,將我們的補丁放入即可 userpatches/kernel/sun8i-default/otg.patch,稍微編輯一下 compile.sh 並選擇所需的小工具:

核心將被編譯成 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
要將所有流量路由到 VPN 隧道,您需要在路由器端向板的 IP 位址新增 SNAT 規則,或透過 dnsmasq 將板的位址作為網關位址進行分發。 後者是透過添加以下行來完成的 /etc/dnsmasq.conf:
dhcp-option = tag:lan, option:router, 192.168.1.100哪裡 192.168.1.100 — 您的主機板的 IP 位址。 不要忘記在主機板本身的網路設定中輸入路由器位址!
三聚氰胺海綿用於將電路板觸點與路由器觸點隔離。 結果是這樣的:

結論
透過 USB 連接網路的速度出乎意料地快:100-120 Mbps,比我預期的要慢。 OpenVPN 它能處理大約 70 Mbps 的加密流量,雖然不多,但足以滿足我的需求。路由器蓋不能完全蓋緊,會留一條小縫隙。如果專注於美觀,可以將乙太網路和 USB Host 介面從主機板上拆焊下來,這樣就能讓蓋子完全蓋上,並且還有一些空間。
最好不要從事此類色情內容併購買 .
來源: www.habr.com
