內網穿透的另一個選擇 – Rathole

前言

在很久以前的文章,我曾經介紹了 利用 FRP 來實現內網穿透 。但時隔多年再次想使用他時,卻發現他的最新版本卻早已變得非常複雜,不是我當初的那個簡單設定即可使用的軟體。因此我就在尋找他的替代品,而意外找到這款使用 Rust 編寫的 Rathole 。雖然他的最新 Releases 已經停留在 3 年前了,但使用了一下也是有當初 FRP 的味道,所以還是寫了一篇記錄一下。

根據官方自己的說法,由於 Rathole 使用 Rust 編寫,因此性能相較 FRP 提升了不少,但這個部份我自己就沒有實測了,留給大家自己試試看。

設定方法

在本篇文章中,操作皆在 Linux 上執行。與 FRP 相同,程式部分不分伺服器版及客戶端版,所以請前往 Rathole 的 Releases 頁 下載,筆者最新的穩定版本為 v0.5.0

wget https://github.com/rathole-org/rathole/releases/download/v0.5.0/rathole-x86_64-unknown-linux-gnu.zip

比較特別的是他是使用 zip 打包的,而不是 tar 之類的,所以解壓縮的時候要注意一下你有沒有相關套件。

unzip rathole-x86_64-unknown-linux-gnu.zip

然後我是比較習慣把檔案移到 /etc/ 底下,這個就見仁見智的,你愛怎麼放就怎麼放。

mkdir -p /etc/rathole ; mv rathole /etc/rathole/

接著不管伺服器端的設定或是客戶端的設定,我都會在 /etc/rathole/ 底下寫。

伺服器端

伺服器端的部分,我們需要一個 server.toml,範例如下:

[server]
bind_addr = "[::]:7000"

[server.services.client1]
token = "YOUR_TOKEN_HERE"
bind_addr = "[::]:7001"

由於我是 IPv6 愛好者,所以 bind_addr 的部分我都一律使用 [::] 表示了,避免沒有監聽到 IPv6。

上面的部分主要是 server 端要監聽的 port,也是客戶端連入的 port。

下方 [server.services.client1] 則是客戶端,其中 client1 則是他的名字。所以如果你需要很多客戶端,則可以複製這個段落,就可以服務很多客戶端了。

token 就像是密鑰,這邊你可以自己定義,客戶端也必須持有相同密鑰才可以順利建立連線,你也可以為每個客戶端定義不同的 token

最後客戶端的 bind_addr 則是定義成要轉換為本機的哪個 port,供人連線。

客戶端

客戶端的部分,我們則需要一個 client.toml,範例如下:

[client]
remote_addr = "[SERVER_IP_ADDR]:7000"
 
[client.services.client1]
token = "YOUR_TOKEN_HERE"
local_addr = "[::1]:443"

remote_addr 的部分,請記得改成伺服器端的 IP 位址。

接著下方 client 的段落,名稱跟 token 的部分必須配置的與伺服器端相同,驗證才會成功。

最後 local_addr 則是你希望 Rathole 監聽本機的哪個服務 port。

開始使用

你可以使用以下指令來開始使用,記得伺服器端跟客戶端都要一起啟動哦。

# 伺服器端
/etc/rathole/rathole /etc/rathole/server.toml

# 客戶端
/etc/rathole/rathole /etc/rathole/client.toml

接著,你就可以在伺服器端定義的 port,使用到客戶端的服務囉!

如果你想讓服務常駐,你可以參考 在 Linux 下將特定程式包成服務,讓他在背景運作。