測試龍芯 LoongArch .NET之 使用 FastTunnel 做內網穿透遠端計算機

張善友發表於2021-07-28

龍芯3A5000 已經上市,與龍芯3A5000配套的三大編譯器GCC、LLVM、GoLang和三大虛擬機器Java、JavaScript、.NET均已完成開發,從老夥計哪裡搞來一臺3A5000 機器,安裝統信UOS。 使用體驗上看還可以,就是軟體生態急需建設,軟體生態的建設上自然有我dotnet 的一份力量。 龍芯團隊已經完成了LoongArch 的.NET Core 3.1版本的研發,目前還沒有正式對外發布,從龍芯兄弟們哪裡拿到了一份當前版本的SDK,開啟UOS的開發者模式,我們安裝好龍芯.NET SDK,  拿個複雜點的應用來驗證一下龍芯 LoongArch的.NET 的成色如何,迫切的需求就是機器的內網穿透,因此寫成這篇文章。

在文章開始之前,我們先來看下龍芯LoongArch的.NET SDK情況:

user@user-PC:~$ dotnet --info
.NET Core SDK (reflecting any global.json):
  Version:   3.1.111
  Commit:    a9538e031d

Runtime Environment:
  OS Name:     uos
  OS Version:  20
  OS Platform: Linux
  RID:         linux-loongarch64
  Base Path:   /home/user/workshop/dotnet/sdk/3.1.111/

Host (useful for support):
   Version: 3.1.11
   Commit:  f5eceb8105

.NET Core SDKs installed:
   3.1.111 [/home/user/workshop/dotnet/sdk]

.NET Core runtimes installed:
   Microsoft.AspNetCore.App 3.1.11 [/home/user/workshop/dotnet/shared/Microsoft.A                                                                                                                                                             spNetCore.App]
   Microsoft.NETCore.App 3.1.11 [/home/user/workshop/dotnet/shared/Microsoft.NETC                                                                                                                                                             ore.App]

To install additional .NET Core runtimes or SDKs:
   http://www.loongnix.org/

Loongson's .NET version:
   3.1.11-internal-rc001

RID是 linux-loongarch64,版本是3.1.11-internal-rc001。

使用.NET 開發的 開源埠對映工具有好幾個:

https://github.com/yangan666/SuperNAT

https://github.com/FastTunnel/FastTunnel

https://github.com/hemaju/Wireboy.Socket.P2PSocket

https://github.com/xljiulang/HttpMouse 

他們的最新版本都是5.0了,我們在龍芯3A5000 上面要部署的是Linux 客戶端。上面這幾個工具都可以滿足要求,這裡我選擇了FastTunnel 來做測試,本文的演示需要三臺計算機裝置,其中一臺是伺服器,伺服器擁有公網 ip 地址,使用的是騰訊雲伺服器,其中一臺為龍芯3A5000 的開發機,將這臺電腦的服務通過FastTunnel 對外發布。 另外測試的電腦可以是任何支援SSH的終端。

首先在騰訊雲伺服器上從 https://github.com/FastTunnel/FastTunnel/releases 下載解壓縮 FastTunnel.Server 即可,在伺服器端做一點配置,開啟伺服器端的 appsettings.json 檔案,這就是伺服器端的配置檔案

{
   "Logging": {
     "LogLevel": {
       // Trace Debug Information Warning Error
       "Default": "Trace",
       "Microsoft": "Warning",
       "Microsoft.Hosting.Lifetime": "Information"
     }
   },
   "AllowedHosts": "*",
   "ServerSettings": {
     // 監聽地址
     "BindAddr": "0.0.0.0",
     // 監聽埠
     "BindPort": 8092,  // 這是用來給 FastTunnel 連線的埠

    // 繫結域名
     "WebDomain": "fasttunnel.csharpkit.com",

    // Http監聽埠, 訪問自定義域名站點時url為 http://{SubDomain}.{WebDomain}:{WebProxyPort}/
     "WebProxyPort": 1270,

    // 可選,ngixn反向代理後可省略域名後的埠號進行訪問
     "WebHasNginxProxy": false,

    // 可選,訪問白名單,不在白名單的ip拒絕,為空時所有人有許可權訪問
     "WebAllowAccessIps": [],

    // 可選,是否開啟SSH,禁用後不處理SSH型別埠轉發.預設false。
     "SSHEnabled": true
   }
}

以上是我的配置,我更改的部分就是 BindAddr 和 BindPort 兩個值,還有自定義域名。此時我的騰訊雲伺服器將開放 8092 埠作為給 FastTunnel 客戶端連線的埠。按照 FastTunnel 的設計,可以在客戶端要求伺服器端開放任意的其他埠給某個客戶端使用

配置完成之後,dotnet FastTunnel.Server.dll 即可執行,如看到大概以下的內容就是執行成功

[root@VM_0_17_centos FastTunnel]# dotnet FastTunnel.Server.dll
2021-07-28 09:24:09,039 |WARN| Unable to bind to http://localhost:5000 on the IPv6 loopback interface: 'Cannot assign requested address'.
2021-07-28 09:24:09,122 |INFO| Now listening on: http://localhost:5000
2021-07-28 09:24:09,125 |INFO| ===== FastTunnel Server Starting =====
2021-07-28 09:24:09,128 |INFO| 監聽客戶端 -> 0.0.0.0:10092
2021-07-28 09:24:09,130 |INFO| 監聽客戶端 -> 0.0.0.0:1270
2021-07-28 09:24:09,251 |INFO| Application started. Press Ctrl+C to shut down.
2021-07-28 09:24:09,252 |INFO| Hosting environment: Production
2021-07-28 09:24:09,252 |INFO| Content root path: /usr/local/FastTunnel

接下來是來配置客戶端部分,在Windows 10上從FastTunnel原始碼編譯一個通用的Linux客戶端,拷貝到龍芯3A5000電腦,開啟的 FastTunnel 客戶端的 appsettings.json 檔案,因為我們只是為了配置SSH 內網穿透而已,因此只需要修改伺服器端公網 ip 和伺服器端通訊埠,和 SSH 的內容。如下面程式碼,需要更改部分我標記出來

{
   "Logging": {
     "LogLevel": {
       "Default": "Debug",
       "Microsoft": "Warning",
       "Microsoft.Hosting.Lifetime": "Information"
     }
   },
   "ClientSettings": {
     "Common": {
       // 服務端公網ip, 對應服務端配置檔案的 BindAddr,支援域名
       "ServerAddr": "123.207.20.135",

      // 服務端通訊埠,對應服務端配置檔案的 BindPort
       "ServerPort": 8092
     },
     "Webs": [
       {
         // 本地站點所在內網的ip
         "LocalIp": "127.0.0.1",

        // 站點監聽的埠號
         "LocalPort": 80,

        // 子域名, 訪問本站點時的url為 http://{SubDomain}.{Domain}:{ProxyPort_HTTP}/
         "SubDomain": "test", // test.test.cc

        // 個人域名(需要解析域名A記錄至服務的ip地址)
         "WWW": [ "www.abc.com","test111.test.cc" ]
       }
     ],

    /**
      * ssh穿透,ssh訪問內網主機
      * 訪問方式 #ssh -oPort=12701 {root}@{ServerAddr}
      * ServerAddr 填入服務端ip,root對應內網使用者名稱
      */
     "SSH": [
       {
         "LocalIp": "127.0.0.1",
         "LocalPort": 22,
         "RemotePort": 8073
       },
       {
         "LocalIp": "127.0.0.1",
         "LocalPort": 3389, // windows遠端桌面埠為3389
         "RemotePort": 1274
       }
     ]
   }
}

先修改服務端的 ip 地址,我的騰訊雲的 ip 地址是 123.207.20.135 請將此值替換為你自己的伺服器的 ip 地址。接著我在上面伺服器端的配置裡面寫了 FastTunnel 開放的埠是 8092 因此需要在客戶端設定和伺服器端相同的值。從這裡可以看到,伺服器端設定的埠不是說給對外開放的,而只是給 FastTunnel 客戶端用來連線使用的而已。接著為了設定客戶端的SSH功能,還需要額外配置將本機的SSH服務埠開放。

接下來是在客戶端配置連線到伺服器端的哪個埠,也就是說伺服器端對外開放的埠是由客戶端決定的。如上面程式碼我設定了使用 8073 埠,以上配置的實現就是將 ServerAddr:RemotePort 對映到 LocalIp:LocalPort 地址,如上面配置是將 123.207.20.135:8073對映到相對本機的 127.0.0.1:22 埠

執行命令dotnet FastTunnel.Client.dll 然後即可將龍芯3A5000的SSH 開放出去了

user@user-PC:~/workshop/FastTunnel$ dotnet FastTunnel.Client.dll
2021/07/28 09:45:42.655|DEBUG|===== FastTunnel Client Start =====
2021/07/28 09:45:43.601|DEBUG|通訊已建立
2021/07/28 09:45:43.813|DEBUG|recive from server:{"MessageType":5,"Content":{"Ms g":"\n=====隧道已建立成功,可通過以下方式訪問內網服務=====\n\n穿透協議 | 對映關係(公網=>內網)\n  HTTP   | http://test.fasttunnel.csharpkit.com:1270 => 127.0.                                                                                                                                                             0.1:80\n  HTTP   | http://www.abc.com:1270 => 127.0.0.1:80\n  HTTP   | http://te                                                                                                                                                             st111.test.cc:1270 => 127.0.0.1:80\n  TCP    | fasttunnel.csharpkit.com:8073 =>                                                                                                                                                              127.0.0.1:22\n  TCP    | fasttunnel.csharpkit.com:1274 => 127.0.0.1:3389\n\n====                                                                                                                                                             ================================================","MsgType":0}}

2021/07/28 09:45:43.945|INFO|From Server:
=====隧道已建立成功,可通過以下方式訪問內網服務=====

穿透協議 | 對映關係(公網=>內網)
   HTTP   | http://test.fasttunnel.csharpkit.com:1270 => 127.0.0.1:80
   HTTP   | http://www.abc.com:1270 => 127.0.0.1:80
   HTTP   | http://test111.test.cc:1270 => 127.0.0.1:80
   TCP    | fasttunnel.csharpkit.com:8073 => 127.0.0.1:22
   TCP    | fasttunnel.csharpkit.com:1274 => 127.0.0.1:3389

d47b1a45cbbbf96dea98b7fba77d0df

相關文章