一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

新型內(nèi)網(wǎng)穿透的基本原理

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 作者:馬哥Linux運(yùn)維 ? 2022-10-26 10:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、內(nèi)網(wǎng)穿透簡(jiǎn)述

由于國(guó)內(nèi)網(wǎng)絡(luò)環(huán)境問(wèn)題, 普遍家庭用戶(hù)寬帶都沒(méi)有分配到公網(wǎng) IP(我有固定公網(wǎng) IP, 嘿嘿); 這時(shí)候一般我們需要從外部訪問(wèn)家庭網(wǎng)絡(luò)時(shí)就需要通過(guò)一些魔法手段, 比如 VPN、遠(yuǎn)程軟件(向日葵…)等; 但是這些工具都有一個(gè)普遍存在的問(wèn)題: 慢+卡!

1.1、傳統(tǒng)星型拓?fù)?/p>

究其根本因素在于, 在傳統(tǒng)架構(gòu)中如果兩個(gè)位于多層 NAT(簡(jiǎn)單理解為多個(gè)路由器)之后的設(shè)備, 只能通過(guò)一些中央(VPN/遠(yuǎn)程軟件)中轉(zhuǎn)服務(wù)器進(jìn)行鏈接, 這時(shí)網(wǎng)絡(luò)連接速度取決于中央服務(wù)器帶寬和速度; 這種網(wǎng)絡(luò)架構(gòu)我這里簡(jiǎn)稱(chēng)為: 星型拓?fù)?/p>

94273ae0-5477-11ed-a3b6-dac502259ad0.png

從這張圖上可以看出, 你的 “工作筆記本” 和 “家庭 NAS” 之間通訊的最大傳輸速度為 Up/Down: 512K/s; 因?yàn)榱髁拷?jīng)過(guò)了中央服務(wù)器中轉(zhuǎn), 由于網(wǎng)絡(luò)木桶效應(yīng)存在, 即使你兩側(cè)的網(wǎng)絡(luò)速度再高也沒(méi)用, 整體的速度取決于這個(gè)鏈路中最低的一個(gè)設(shè)備網(wǎng)速而不是你兩端的設(shè)備.

在這種拓?fù)湎? 想提高速度只有一個(gè)辦法: 加錢(qián)! 在不使用 “鈔能力” 的情況下, 普遍免費(fèi)的軟件提供商不可能給予過(guò)多的資源來(lái)讓用戶(hù)白嫖, 而自己弄大帶寬的中央服務(wù)器成本又過(guò)高.

1.2、NAT 穿透與網(wǎng)狀拓?fù)?/p>

本部分只做簡(jiǎn)述, 具體里面有大量細(xì)節(jié)和規(guī)則可能描述不準(zhǔn)確, 細(xì)節(jié)部分推薦閱讀 How NAT traversal works.

既然傳統(tǒng)的星型拓?fù)溆羞@么多問(wèn)題, 那么有沒(méi)有其他騷操作可以解決呢? 答案是有的, 簡(jiǎn)單來(lái)說(shuō)就是利用 NAT 穿透原理. NAT 穿透簡(jiǎn)單理解如下: 在 A 設(shè)備主動(dòng)向 B 設(shè)備發(fā)送流量后, 整個(gè)鏈路上的防火墻會(huì)短時(shí)間打開(kāi)一個(gè)映射規(guī)則, 該規(guī)則允許 B 設(shè)備短暫的從這個(gè)路徑上反向向 A 設(shè)備發(fā)送流量. 更通俗的講大概就是所謂的: “順著網(wǎng)線來(lái)打你”

943f826c-5477-11ed-a3b6-dac502259ad0.png

搞清了這個(gè)規(guī)則以后, 我們就可以弄一臺(tái) “低配” 的中央服務(wù)器, 讓中央服務(wù)器來(lái)幫助我們協(xié)商兩邊的設(shè)備誰(shuí)先訪問(wèn)誰(shuí)(或者說(shuō)是訪問(wèn)規(guī)則); 兩個(gè)設(shè)備一起無(wú)腦訪問(wèn)對(duì)方, 然后觸發(fā)防火墻的 NAT 穿透規(guī)則(防火墻打開(kāi)), 此后兩個(gè)設(shè)備就可以不通過(guò)中央服務(wù)器源源不斷的通訊了. 在這種架構(gòu)下我們的設(shè)備其實(shí)就組成了一個(gè)非標(biāo)準(zhǔn)的網(wǎng)狀拓?fù)?

94d3d926-5477-11ed-a3b6-dac502259ad0.png

在這種拓?fù)湎? 兩個(gè)設(shè)備之間的通訊速度已經(jīng)不在取決于中央服務(wù)器, 而是直接取決于兩端設(shè)備的帶寬, 也就是說(shuō)達(dá)到了設(shè)備網(wǎng)絡(luò)帶寬峰值. 當(dāng)然 NAT 穿透也不是百分百能夠成功的, 在復(fù)雜網(wǎng)絡(luò)情況下有些防火墻不會(huì)按照預(yù)期工作或者說(shuō)有更嚴(yán)格的限制; 比如 IP、端口、協(xié)議限制等等, 所以為了保證可靠性可以讓中央服務(wù)器中轉(zhuǎn)做后備方案, 即盡量嘗試 NAT 穿透, 如果不行走中央服務(wù)器中繼.

二、Tailscale 簡(jiǎn)介

第一部分是為了方便讀者理解一些新型內(nèi)網(wǎng)穿透的大致基本原理, 現(xiàn)在回到本文重點(diǎn): Tailscale

Tailscale 就是一種利用 NAT 穿透(aka: P2P 穿透)技術(shù)的 VPN 工具. Tailscale 客戶(hù)端等是開(kāi)源的, 不過(guò)遺憾的是中央控制服務(wù)器目前并不開(kāi)源; Tailscale 目前也提供免費(fèi)的額度給用戶(hù)使用, 在 NAT 穿透成功的情況下也能保證滿速運(yùn)行.

不過(guò)一旦無(wú)法 NAT 穿透需要做中轉(zhuǎn)時(shí), Tailscale 官方的服務(wù)器由于眾所周知的原因在國(guó)內(nèi)訪問(wèn)速度很拉胯; 不過(guò)萬(wàn)幸的是開(kāi)源社區(qū)大佬們搓了一個(gè)開(kāi)源版本的中央控制服務(wù)器(Headscale), 也就是說(shuō): 我們可以自己搭建中央服務(wù)器啦, 完全 “自主可控” 啦.

三、搭建 Headscale 服務(wù)端

以下命令假設(shè)安裝系統(tǒng)為 Ubuntu 22.04, 其他系統(tǒng)請(qǐng)自行調(diào)整.

3.1、宿主機(jī)安裝

Headscale 是采用 Go 語(yǔ)言編寫(xiě)的, 所以只有一個(gè)二進(jìn)制文件, 在 Github Releases 頁(yè)面下載最新版本即可:

#下載
wgethttps://github.com/juanfont/headscale/releases/download/v0.16.4/headscale_0.16.4_linux_amd64-O/usr/local/bin/headscale

#增加可執(zhí)行權(quán)限
chmod+x/usr/local/bin/headscale

下載完成后為了安全性我們需要?jiǎng)?chuàng)建單獨(dú)的用戶(hù)和目錄用于 Headscale 運(yùn)行

#配置目錄
mkdir-p/etc/headscale

#創(chuàng)建用戶(hù)
useradd
--create-home
--home-dir/var/lib/headscale/
--system
--user-group
--shell/usr/sbin/nologin
headscale

為了保證 Headscale 能持久運(yùn)行, 我們需要?jiǎng)?chuàng)建 SystemD 配置文件

#/lib/systemd/system/headscale.service
[Unit]
Description=headscalecontroller
After=syslog.target
After=network.target

[Service]
Type=simple
User=headscale
Group=headscale
ExecStart=/usr/local/bin/headscaleserve
Restart=always
RestartSec=5

#Optionalsecurityenhancements
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/headscale/var/run/headscale
AmbientCapabilities=CAP_NET_BIND_SERVICE
RuntimeDirectory=headscale

[Install]
WantedBy=multi-user.target

3.2、配置 Headscale

安裝完成以后我們需要在 /etc/headscale/config.yaml 中配置 Headscale 的啟動(dòng)配置, 以下為配置樣例以及解釋(僅列出重要配置):

---
#Headscale服務(wù)器的訪問(wèn)地址
#
#這個(gè)地址是告訴客戶(hù)端需要訪問(wèn)的地址,即使你需要在跑在
#負(fù)載均衡器之后這個(gè)地址也必須寫(xiě)成負(fù)載均衡器的訪問(wèn)地址
server_url:https://your.domain.com

#Headscale實(shí)際監(jiān)聽(tīng)的地址
listen_addr:0.0.0.0:8080

#監(jiān)控地址
metrics_listen_addr:127.0.0.1:9090

#grpc監(jiān)聽(tīng)地址
grpc_listen_addr:0.0.0.0:50443

#是否允許不安全的grpc連接(非TLS)
grpc_allow_insecure:false

#客戶(hù)端分配的內(nèi)網(wǎng)網(wǎng)段
ip_prefixes:
-fd7aa1e0::/48
-100.64.0.0/10

#中繼服務(wù)器相關(guān)配置
derp:
server:
#關(guān)閉內(nèi)嵌的derper中繼服務(wù)(可能不安全,還沒(méi)去看代碼)
enabled:false

#下發(fā)給客戶(hù)端的中繼服務(wù)器列表(默認(rèn)走官方的中繼節(jié)點(diǎn))
urls:
-https://controlplane.tailscale.com/derpmap/default

#可以在本地通過(guò)yaml配置定義自己的中繼接待你
paths:[]

#SQLiteconfig
db_type:sqlite3
db_path:/var/lib/headscale/db.sqlite

#使用自動(dòng)簽發(fā)證書(shū)是的域名
tls_letsencrypt_hostname:""

#使用自定義證書(shū)時(shí)的證書(shū)路徑
tls_cert_path:""
tls_key_path:""

#是否讓客戶(hù)端使用隨機(jī)端口,默認(rèn)使用41641/UDP
randomize_client_port:false

3.3、證書(shū)及反向代理

可能很多人和我一樣, 希望使用 ACME 自動(dòng)證書(shū), 又不想占用 80/443 端口, 又想通過(guò)負(fù)載均衡器負(fù)載, 配置又看的一頭霧水; 所以這里詳細(xì)說(shuō)明一下 Headscale 證書(shū)相關(guān)配置和工作邏輯:

1、Headscale 的 ACME 只支持 HTTP/TLS 挑戰(zhàn), 所以使用后必定占用 80/443

2、當(dāng)配置了 tls_letsencrypt_hostname 時(shí)一定會(huì)進(jìn)行 ACME 申請(qǐng)

3、在不配置 tls_letsencrypt_hostname 時(shí)如果配置了 tls_cert_path 則使用自定義證書(shū)

4、兩者都不配置則不使用任何證書(shū), 服務(wù)端監(jiān)聽(tīng) HTTP 請(qǐng)求

5、三種情況下(ACME 證書(shū)、自定義證書(shū)、無(wú)證書(shū))主服務(wù)都只監(jiān)聽(tīng) listen_addr 地址, 與 server_url 沒(méi)半毛錢(qián)關(guān)系

6、只有在有證書(shū)(ACME 證書(shū)或自定義證書(shū))的情況下或者手動(dòng)開(kāi)啟了 grpc_allow_insecure 才會(huì)監(jiān)聽(tīng) grpc 遠(yuǎn)程調(diào)用服務(wù)

綜上所述, 如果你想通過(guò) Nginx、Caddy 反向代理 Headscale, 則你需要滿足以下配置:

1、刪除掉 tls_letsencrypt_hostname 或留空, 防止 ACME 啟動(dòng)

2、刪除掉 tls_cert_path 或留空, 防止加載自定義證書(shū)

3、server_url 填寫(xiě) Nginx 或 Caddy 被訪問(wèn)的 HTTPS 地址

4、在你的 Nginx 或 Caddy 中反向代理填寫(xiě) listen_addr 的 HTTP 地址

Nginx 配置參考 官方 Wiki, Caddy 只需要一行 reverse_proxy headscale:8080 即可(地址自行替換).

至于 ACME 證書(shū)你可以通過(guò)使用 acme.sh 自動(dòng)配置 Nginx 或者使用 Caddy 自動(dòng)申請(qǐng)等方式, 這些已經(jīng)與 Headscale 無(wú)關(guān)了, 不在本文探討范圍內(nèi).

3.4、內(nèi)網(wǎng)地址分配

請(qǐng)盡量不要將 ip_prefixes 配置為默認(rèn)的 100.64.0.0/10 網(wǎng)段, 如果你有興趣查詢(xún)了該地址段, 那么你應(yīng)該明白它叫 CGNAT; 很不幸的是例如 Aliyun 底層的 apt 源等都在這個(gè)范圍內(nèi), 可能會(huì)有一些奇怪問(wèn)題.

3.5、啟動(dòng) Headscale

在處理完證書(shū)等配置后, 只需要愉快的啟動(dòng)一下即可:

#開(kāi)機(jī)自啟動(dòng)并立即啟動(dòng)
systemctlenableheadscale--now

再啰嗦一嘴, 如果你期望使用 Headscale ACME 自動(dòng)申請(qǐng)證書(shū), 你的關(guān)鍵配置應(yīng)該像這樣:

server_url:https://your.domain.com
listen_addr:0.0.0.0:443
tls_letsencrypt_hostname:"your.domain.com"
tls_cert_path:""
tls_key_path:""

如果你期望使用自定義證書(shū), 則你的關(guān)鍵配置應(yīng)該像這樣:

server_url:https://your.domain.com
listen_addr:0.0.0.0:443
tls_letsencrypt_hostname:""
tls_cert_path:"/path/to/cert"
tls_key_path:"/path/to/key"

如果你期望使用負(fù)載均衡器, 那么你的關(guān)鍵配置應(yīng)該像這樣:

server_url:https://your.domain.com
listen_addr:0.0.0.0:8080
tls_letsencrypt_hostname:""
tls_cert_path:""
tls_key_path:""

在使用負(fù)載均衡器配置時(shí), 啟動(dòng)后會(huì)有一行警告日志, 忽略即可:

2022-09-18T0736ZWRNListeningwithoutTLSbutServerURLdoesnotstartwithhttp://

3.6、Docker Compose 安裝

Compose 配置樣例文件如下:

#docker-compose.yaml
version:"3.9"

services:
headscale:
container_name:headscale
image:headscale/headscale:0.16.4
ports:
-"8080:8080"
cap_add:
-NET_ADMIN
-NET_RAW
-SYS_MODULE
sysctls:
-net.ipv4.ip_forward=1
-net.ipv6.conf.all.forwarding=1
restart:always
volumes:
-./conf:/etc/headscale
-data:/var/lib/headscale
command:["headscale","serve"]
volumes:
config:
data:

你需要在與 docker-compose.yaml 同級(jí)目錄下創(chuàng)建 conf 目錄用于存儲(chǔ)配置文件; 具體配置請(qǐng)參考上面的配置詳解等部分, 最后不要忘記你的 Compose 文件端口映射需要和配置文件保持一致.

四、客戶(hù)端安裝

對(duì)于客戶(hù)端來(lái)說(shuō), Tailscale 提供了多個(gè)平臺(tái)和發(fā)行版的預(yù)編譯安裝包, 并且部分客戶(hù)端直接支持設(shè)置自定義的中央控制服務(wù)器.

4.1、Linux 客戶(hù)端

Linux 用戶(hù)目前只需要使用以下命令安裝即可:

curl-fsSLhttps://tailscale.com/install.sh|sh

默認(rèn)該腳本會(huì)檢測(cè)相關(guān)的 Linux 系統(tǒng)發(fā)行版并使用對(duì)應(yīng)的包管理器安裝 Tailscale, 安裝完成后使用以下命令啟動(dòng):

tailscaleup--login-serverhttps://your.domain.com--advertise-routes=192.168.11.0/24--accept-routes=true--accept-dns=false

關(guān)于選項(xiàng)設(shè)置:

--login-server: 指定使用的中央服務(wù)器地址(必填)

--advertise-routes: 向中央服務(wù)器報(bào)告當(dāng)前客戶(hù)端處于哪個(gè)內(nèi)網(wǎng)網(wǎng)段下, 便于中央服務(wù)器讓同內(nèi)網(wǎng)設(shè)備直接內(nèi)網(wǎng)直連(可選的)或者將其他設(shè)備指定流量路由到當(dāng)前內(nèi)網(wǎng)(可選)

--accept-routes: 是否接受中央服務(wù)器下發(fā)的用于路由到其他客戶(hù)端內(nèi)網(wǎng)的路由規(guī)則(可選)

--accept-dns: 是否使用中央服務(wù)器下發(fā)的 DNS 相關(guān)配置(可選, 推薦關(guān)閉)

啟動(dòng)完成后, tailscale 將會(huì)卡住, 并打印一個(gè)你的服務(wù)器訪問(wèn)地址; 瀏覽器訪問(wèn)該地址后將會(huì)得到一條命令:

95093814-5477-11ed-a3b6-dac502259ad0.png958a1506-5477-11ed-a3b6-dac502259ad0.png

注意: 瀏覽器上顯示的命令需要在中央控制服務(wù)器執(zhí)行(Headscale), NAMESAPCE 位置應(yīng)該替換為一個(gè)具體的 Namespace, 可以使用以下命令創(chuàng)建 Namespace (名字隨意)并讓設(shè)備加入:

95db3d32-5477-11ed-a3b6-dac502259ad0.png

在 Headscale 服務(wù)器上執(zhí)行命令成功后客戶(hù)端命令行在稍等片刻便會(huì)執(zhí)行完成, 此時(shí)該客戶(hù)端已經(jīng)被加入 Headscale 網(wǎng)絡(luò)并分配了特定的內(nèi)網(wǎng) IP; 多個(gè)客戶(hù)端加入后在 NAT 穿透成功時(shí)就可以互相 ping 通, 如果出現(xiàn)問(wèn)題請(qǐng)閱讀后面的調(diào)試細(xì)節(jié), 只要能注冊(cè)成功就算是成功了一半, 暫時(shí)不要慌.

4.2、MacOS 客戶(hù)端

MacOS 客戶(hù)端安裝目前有兩種方式, 一種是使用標(biāo)準(zhǔn)的 AppStore 版本(好像還有一個(gè)可以直接下載的), 需要先設(shè)置服務(wù)器地址然后再啟動(dòng) App:

首先訪問(wèn)你的 Headscale 地址 https://your.domain.com/apple:

95ec41ae-5477-11ed-a3b6-dac502259ad0.png

復(fù)制倒數(shù)第二行命令到命令行執(zhí)行(可能需要 sudo 執(zhí)行), 然后去 AppStore 搜索 Hailscale 安裝并啟動(dòng); 啟動(dòng)后會(huì)自動(dòng)打開(kāi)瀏覽器頁(yè)面, 與 Linux 安裝類(lèi)似, 復(fù)制命令到 Headscale 服務(wù)器執(zhí)行即可(Namespace 創(chuàng)建一次就行).

第二種方式也是比較推薦的方式, 直接編譯客戶(hù)端源碼安裝, 體驗(yàn)與 Linux 版本一致:

#安裝go
brewinstallgo

#編譯命令行客戶(hù)端
goinstalltailscale.com/cmd/tailscale{,d}@main

#安裝為系統(tǒng)服務(wù)
sudotailscaledinstall-system-daemon

安裝完成后同樣通過(guò) tailscale up 命令啟動(dòng)并注冊(cè)即可, 具體請(qǐng)參考 Linux 客戶(hù)端安裝部分.

4.3、其他客戶(hù)端

關(guān)于 Windows 客戶(hù)端大致流程就是創(chuàng)建一個(gè)注冊(cè)表, 然后同樣安裝官方 App 啟動(dòng), 接著瀏覽器復(fù)制命令注冊(cè)即可. 至于移動(dòng)端本人沒(méi)有需求, 所以暫未研究. Windows 具體的安裝流程請(qǐng)?jiān)L問(wèn) https://your.domain.com/windows 地址查看(基本與 MacOS AppStore 版本安裝類(lèi)似).

五、中繼服務(wù)器搭建

在上面的 Headscale 搭建完成并添加客戶(hù)端后, 某些客戶(hù)端可能無(wú)法聯(lián)通; 這是由于網(wǎng)絡(luò)復(fù)雜情況下導(dǎo)致了 NAT 穿透失敗; 為此我們可以搭建一個(gè)中繼服務(wù)器來(lái)進(jìn)行傳統(tǒng)的星型拓?fù)?a target="_blank">通信.

5.1、搭建 DERP Server

首先需要注意的是, 在需要搭建 DERP Server 的服務(wù)器上, 請(qǐng)先安裝一個(gè) Tailscale 客戶(hù)端并注冊(cè)到 Headscale; 這樣做的目的是讓搭建的 DERP Server 開(kāi)啟客戶(hù)端認(rèn)證, 否則你的 DERP Server 可以被任何人白嫖.

目前 Tailscale 官方并未提供 DERP Server 的安裝包, 所以需要我們自行編譯安裝; 在編譯之前請(qǐng)確保安裝了最新版本的 Go 語(yǔ)言及其編譯環(huán)境.

#編譯DERPServer
goinstalltailscale.com/cmd/derper@main

#復(fù)制到系統(tǒng)可執(zhí)行目錄
mv${GOPATH}/bin/derper/usr/local/bin

#創(chuàng)建用戶(hù)和運(yùn)行目錄
useradd
--create-home
--home-dir/var/lib/derper/
--system
--user-group
--shell/usr/sbin/nologin
derper

接下來(lái)創(chuàng)建一個(gè) SystemD 配置:

#/lib/systemd/system/derper.service
[Unit]
Description=tailscalederperserver
After=syslog.target
After=network.target

[Service]
Type=simple
User=derper
Group=derper
ExecStart=/usr/local/bin/derper-c=/var/lib/derper/private.key-a=:8989-stun-port=3456-verify-clients
Restart=always
RestartSec=5

#Optionalsecurityenhancements
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/derper/var/run/derper
AmbientCapabilities=CAP_NET_BIND_SERVICE
RuntimeDirectory=derper

[Install]
WantedBy=multi-user.target

最后使用以下命令啟動(dòng) Derper Server 即可:

systemctlenablederper--now

注意: 默認(rèn)情況下 Derper Server 會(huì)監(jiān)聽(tīng)在 :443 上, 同時(shí)會(huì)觸發(fā)自動(dòng) ACME 申請(qǐng)證書(shū). 關(guān)于證書(shū)邏輯如下:

1、如果不指定 -a 參數(shù), 則默認(rèn)監(jiān)聽(tīng) :443

2、如果監(jiān)聽(tīng) :443 并且未指定 --certmode=manual 則會(huì)強(qiáng)制使用 --hostname 指定的域名進(jìn)行 ACME 申請(qǐng)證書(shū)

3、如果指定了 --certmode=manual 則會(huì)使用 --certmode 指定目錄下的證書(shū)開(kāi)啟 HTTPS

4、如果指定了 -a 為非 :443 端口, 且沒(méi)有指定 --certmode=manual 則只監(jiān)聽(tīng) HTTP

如果期望使用 ACME 自動(dòng)申請(qǐng)只需要不增加 -a 選項(xiàng)即可(占用 443 端口), 如果期望通過(guò)負(fù)載均衡器負(fù)載, 則需要將 -a 選項(xiàng)指定到非 443 端口, 然后配置 Nginx、Caddy 等 LB 軟件即可. 最后一點(diǎn) stun 監(jiān)聽(tīng)的是 UDP 端口, 請(qǐng)確保防火墻打開(kāi)此端口.

5.2、配置 Headscale

在創(chuàng)建完 Derper 中繼服務(wù)器后, 我們還需要配置 Headscale 來(lái)告訴所有客戶(hù)端在必要時(shí)可以使用此中繼節(jié)點(diǎn)進(jìn)行通信; 為了達(dá)到這個(gè)目的, 我們需要在 Headscale 服務(wù)器上創(chuàng)建以下配置:

#/etc/headscale/derper.yaml

regions:
901:
regionid:901
regioncode:private-derper
regionname:"MyPrivateDerperServer"
nodes:
-name:private-derper
regionid:901
#自行更改為自己的域名
hostname:derper.xxxxx.com
#Derper節(jié)點(diǎn)的IP
ipv4:123.123.123.123
#Derper設(shè)置的STUN端口
stunport:3456

在創(chuàng)建好基本的 Derper Server 節(jié)點(diǎn)信息配置后, 我們需要調(diào)整主配置來(lái)讓 Headscale 加載:

derp:
server:
#這里關(guān)閉Headscale默認(rèn)的DerperServer
enabled:false
#urls留空,保證不加載官方的默認(rèn)Derper
urls:[]
#這里填寫(xiě)Derper節(jié)點(diǎn)信息配置的絕對(duì)路徑
paths:
-/etc/headscale/derper.yaml

#Ifenabled,aworkerwillbesetuptoperiodically
#refreshthegivensourcesandupdatethederpmap
#willbesetup.
auto_update_enabled:true

#HowoftenshouldwecheckforDERPupdates?
update_frequency:24h

接下來(lái)重啟 Headscale 并重啟 client 上的 tailscale 即可看到中繼節(jié)點(diǎn):

~???tailscalenetcheck

Report:
*UDP:true
*IPv4:yes,124.111.111.111:58630
*IPv6:no,butOShassupport
*MappingVariesByDestIP:false
*HairPinning:false
*PortMapping:UPnP,NAT-PMP,PCP
*CaptivePortal:true
*NearestDERP:XXXXDerperServer
*DERPlatency:
-XXXX:10.1ms(XXXXDerperServer)

到此中繼節(jié)點(diǎn)搭建完成.

5.3、Docker Compose 安裝

目前官方似乎也沒(méi)有提供 Docker 鏡像, 我自己通過(guò) GitHub Action 編譯了一個(gè) Docker 鏡像, 以下是使用此鏡像的 Compose 文件樣例:

version:'3.9'
services:
derper:
image:mritd/derper
container_name:derper
restart:always
ports:
-"8080:8080/tcp"
-"3456:3456/udp"
environment:
TZ:Asia/Shanghai
volumes:
-/etc/timezone:/etc/timezone
-/var/run/tailscale:/var/run/tailscale
-data:/var/lib/derper
volumes:
data:

該鏡像默認(rèn)開(kāi)啟了客戶(hù)端驗(yàn)證, 所以請(qǐng)確保 /var/run/tailscale 內(nèi)存在已加入 Headscale 成功的 tailscaled 實(shí)例的 sock 文件. 其他具體環(huán)境變量等參數(shù)配置請(qǐng)參考 Earthfile.

六、客戶(hù)端網(wǎng)絡(luò)調(diào)試

在調(diào)試中繼節(jié)點(diǎn)或者不確定網(wǎng)絡(luò)情況時(shí), 可以使用一些 Tailscale 內(nèi)置的命令來(lái)調(diào)試網(wǎng)絡(luò).

6.1、Ping 命令

tailscale ping 命令可以用于測(cè)試 IP 連通性, 同時(shí)可以看到時(shí)如何連接目標(biāo)節(jié)點(diǎn)的. 默認(rèn)情況下 Ping 命令首先會(huì)使用 Derper 中繼節(jié)點(diǎn)通信, 然后嘗試 P2P 連接; 一旦 P2P 連接成功則自動(dòng)停止 Ping:

~???tailscaleping10.24.0.5
pongfromk8s13(10.24.0.5)viaDERP(XXXXX)in14ms
pongfromk8s13(10.24.0.5)viaDERP(XXXXX)in13ms
pongfromk8s13(10.24.0.5)viaDERP(XXXXX)in14ms
pongfromk8s13(10.24.0.5)viaDERP(XXXXX)in12ms
pongfromk8s13(10.24.0.5)viaDERP(XXXXX)in12ms
pongfromk8s13(10.24.0.5)via3.4.170.23:2495in9ms

由于其先走 Derper 的特性也可以用來(lái)測(cè)試 Derper 連通性.

6.2、Status 命令

通過(guò) tailscale status 命令可以查看當(dāng)前節(jié)點(diǎn)與其他對(duì)等節(jié)點(diǎn)的連接方式, 通過(guò)此命令可以查看到當(dāng)前節(jié)點(diǎn)可連接的節(jié)點(diǎn)以及是否走了 Derper 中繼:

~???tailscalestatus
10.24.0.8xmackovacsmacOS-
alivpnkovacslinuxactive;direct4.3.4.5:41644,tx1264rx944
aliyunkovacslinux-
bobkovacsmacOSoffline
bob-imackovacsmacOSoffline
companykovacslinuxactive;direct114.114.114.114:41642,tx1296rx880

6.3、NetCheck 命令

有些情況下我們可以確認(rèn)是當(dāng)前主機(jī)的網(wǎng)絡(luò)問(wèn)題導(dǎo)致沒(méi)法走 P2P 連接, 但是我們又想了解一下當(dāng)前的網(wǎng)絡(luò)環(huán)境; 此時(shí)可以使用 tailscale netcheck 命令來(lái)檢測(cè)當(dāng)前的網(wǎng)絡(luò)環(huán)境, 此命令將會(huì)打印出詳細(xì)的網(wǎng)絡(luò)環(huán)境報(bào)告:

~???tailscalenetcheck
2022/10/192127portmap:[v1]GotPMPresponse;IP:123.123.123.123,epoch:297671
2022/10/192127portmap:[v1]GotPCPresponse:epoch:297671
2022/10/192127portmap:[v1]UPnPreply{Location//192.168.11.1:39735/rootDesc.xmlServer:AsusWRT/386UPnP/1.1MiniUPnPd/2.2.0USN23345-2380-45f5-34534-04421abwb7cf0:schemas-upnp-orgInternetGatewayDevice:1},"HTTP/1.1200OK
CACHE-CONTROL:max-age=120
ST:urndevice1
USN:uuid:34564645-2380-45f5-b069-sdfdght3245....."
2022/10/192127portmap:UPnPmetachanged:{Location//192.168.11.1:39735/rootDesc.xmlServer:AsusWRT/386UPnP/1.1MiniUPnPd/2.2.0USN23345-2380-45f5-b069-04421abwb7cf0:schemas-upnp-orgInternetGatewayDevice:1}

Report:
*UDP:true
*IPv4:yes,123.123.123.123:5935
*IPv6:no,butOShassupport
*MappingVariesByDestIP:false
*HairPinning:true
*PortMapping:UPnP,NAT-PMP,PCP
*CaptivePortal:true
*NearestDERP:XXXXXAliyun
*DERPlatency:
-XXXXX:9.5ms(XXXXXAliyun)
-XXXXX:53.1ms(XXXXXBandwagonHost)

七、其他補(bǔ)充

7.1、某些代理工具兼容性

MacOS 下使用一些增強(qiáng)代理工具時(shí), 如果安裝 App Store 的官方圖形化客戶(hù)端, 則可能與這些軟件沖突, 推薦使用純命令行版本并添加進(jìn)程規(guī)則匹配 tailscale 和 tailscaled 兩個(gè)進(jìn)程, 讓它們始終走 DIRECT 規(guī)則即可.

7.2、MacOS 下 CPU 占用突然起飛

在使用一些網(wǎng)絡(luò)代理工具時(shí), 網(wǎng)絡(luò)工具會(huì)設(shè)置默認(rèn)路由; 這可能導(dǎo)致 tailscaled 無(wú)法獲取到默認(rèn)路由接口, 然后進(jìn)入死循環(huán)并把 CPU 吃滿, 同時(shí)會(huì)與 Derper 服務(wù)器產(chǎn)生大量上傳流量. 截止本文發(fā)布此問(wèn)題已修復(fù), 請(qǐng)使用 mian 分支編譯安裝, 具體見(jiàn) ISSUE/5879.

7.3、阿里云安裝客戶(hù)端后無(wú)法更新軟件

Tailscale 默認(rèn)使用 CGNAT(100.64.0.0/10) 網(wǎng)段作為內(nèi)部地址分配網(wǎng)段, 目前 Tailscale 僅允許自己的接口使用此網(wǎng)段, 不巧的是阿里云的 DNS、Apt 源等也采用此網(wǎng)段. 這會(huì)導(dǎo)致阿里云服務(wù)器安裝客戶(hù)端后 DNS、Apt 等不可用, 解決方案目前只能修改源碼刪除掉這兩個(gè) DROP 規(guī)則并重新編譯.

7.4、開(kāi)啟路由轉(zhuǎn)發(fā)

大多數(shù)時(shí)候我們可能并不會(huì)在每個(gè)服務(wù)器上都安裝 Tailscale 客戶(hù)端, 通常只安裝 2、3 臺(tái), 然后想通過(guò)這兩三臺(tái)轉(zhuǎn)發(fā)該內(nèi)網(wǎng)的所有流量. 此時(shí)你需要

啟動(dòng) tailscale 時(shí)設(shè)置正確的路由提示 --advertise-routes=192.168.1.0/24 來(lái)告訴 Headscale 服務(wù)器 “我這個(gè)節(jié)點(diǎn)可以轉(zhuǎn)發(fā)這些地址的路由”

其他節(jié)點(diǎn)啟動(dòng)時(shí)需要增加 --accept-routes=true 選項(xiàng)來(lái)聲明 “我接受外部其他節(jié)點(diǎn)發(fā)布的路由”

以上兩個(gè)選項(xiàng)配置后, 只需要 Headscale 服務(wù)器上使用 headscale node route enable -a -i XX(ID) 開(kāi)啟即可. 開(kāi)啟后目標(biāo)節(jié)點(diǎn)(ID)的路由就會(huì)發(fā)布到接受外部路由的所有節(jié)點(diǎn), 想要關(guān)閉的話去掉 -a 即可.

7.5、其他問(wèn)題

以上也只是我個(gè)人遇到的一些問(wèn)題, 如果有其他問(wèn)題推薦先搜索然后查看 ISSUE, 最后不行可以看看源碼. 目前來(lái)說(shuō) Tailscale 很多選項(xiàng)很模糊, 可能需要閱讀源碼以后才能知道到底應(yīng)該怎么做.

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 帶寬
    +關(guān)注

    關(guān)注

    3

    文章

    994

    瀏覽量

    42183
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    13

    文章

    9795

    瀏覽量

    87996
  • 通訊
    +關(guān)注

    關(guān)注

    9

    文章

    927

    瀏覽量

    35669

原文標(biāo)題:Headscale 搭建 P2P 內(nèi)網(wǎng)穿透

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問(wèn)花生殼怎么進(jìn)行內(nèi)網(wǎng)穿透的?

    花生殼是怎么進(jìn)行內(nèi)網(wǎng)穿透的,能不能用來(lái)***,還是只有組建內(nèi)網(wǎng)的功能。
    發(fā)表于 04-18 06:02

    內(nèi)網(wǎng)穿透詳解-基于NATAPP&NatAssist測(cè)試

    本帖最后由 1406093611 于 2019-11-13 22:41 編輯 內(nèi)網(wǎng)穿透詳解-基于NATAPP&NatAssist TCP測(cè)試【前言】最近做一個(gè)4G模塊
    發(fā)表于 09-13 12:14

    搭建自己的IOT平臺(tái)---內(nèi)網(wǎng)穿透

    相信大部分小伙伴在搭建環(huán)境的時(shí)候都是用虛擬機(jī)來(lái)搭建的,如果想實(shí)現(xiàn)外網(wǎng)訪問(wèn)內(nèi)網(wǎng)的話,還是比較麻煩的。在這里我就針對(duì)這個(gè)問(wèn)題,寫(xiě)一篇教程,教大家用最簡(jiǎn)單的方式實(shí)現(xiàn)內(nèi)網(wǎng)穿透,能做到外網(wǎng)訪問(wèn)內(nèi)網(wǎng)
    發(fā)表于 12-09 23:14

    穿透內(nèi)網(wǎng)遠(yuǎn)程控制軟件 TeamViewer_7.0.12979.0

    電子發(fā)燒友網(wǎng)站提供《穿透內(nèi)網(wǎng)遠(yuǎn)程控制軟件 TeamViewer_7.0.12979.0.exe》資料免費(fèi)下載
    發(fā)表于 03-15 22:30 ?22次下載

    如何使用花生殼搭建內(nèi)網(wǎng)穿透

    花生殼的內(nèi)網(wǎng)穿透原理就是通過(guò)花生殼服務(wù)器把他們的公網(wǎng)IP地址進(jìn)行翻譯,轉(zhuǎn)換成為一種私有的地址,然后在花生殼服務(wù)器上,類(lèi)似做端口映射,通過(guò)不同的端口來(lái)訪問(wèn)不同的內(nèi)網(wǎng)電腦,這一切都是通過(guò)互聯(lián)網(wǎng)來(lái)實(shí)現(xiàn)的。這里我們介紹一下如何通過(guò)花生殼
    的頭像 發(fā)表于 12-09 11:29 ?2038次閱讀

    常用的內(nèi)網(wǎng)穿透工具原理和使用方法

    nps是一款輕量級(jí)、高性能、功能強(qiáng)大的內(nèi)網(wǎng)穿透代理服務(wù)器。目前支持tcp、udp流量轉(zhuǎn)發(fā),可支持任何tcp、udp上層協(xié)議(訪問(wèn)內(nèi)網(wǎng)網(wǎng)站、本地支付接口調(diào)試、ssh訪問(wèn)、遠(yuǎn)程桌面,內(nèi)網(wǎng)d
    發(fā)表于 07-10 11:20 ?1264次閱讀
    常用的<b class='flag-5'>內(nèi)網(wǎng)</b><b class='flag-5'>穿透</b>工具原理和使用方法

    內(nèi)網(wǎng)穿透工具的種類(lèi)、原理和使用方法

    本文以滲透的視角,總結(jié)幾種個(gè)人常用的內(nèi)網(wǎng)穿透,內(nèi)網(wǎng)代理工具,介紹其簡(jiǎn)單原理和使用方法。
    的頭像 發(fā)表于 08-25 10:35 ?4225次閱讀
    <b class='flag-5'>內(nèi)網(wǎng)</b><b class='flag-5'>穿透</b>工具的種類(lèi)、原理和使用方法

    什么是nps?常見(jiàn)內(nèi)網(wǎng)穿透工具有哪些?

    nps是一款輕量級(jí)、高性能、功能強(qiáng)大的內(nèi)網(wǎng)穿透代理服務(wù)器。 目前支持tcp、udp流量轉(zhuǎn)發(fā),可支持任何tcp、udp上層協(xié)議(訪問(wèn)內(nèi)網(wǎng)網(wǎng)站、本地支付接口調(diào)試、ssh訪問(wèn)、遠(yuǎn)程桌面,內(nèi)網(wǎng)
    發(fā)表于 08-31 10:32 ?3192次閱讀
    什么是nps?常見(jiàn)<b class='flag-5'>內(nèi)網(wǎng)</b><b class='flag-5'>穿透</b>工具有哪些?

    內(nèi)網(wǎng)穿透可以帶給物聯(lián)網(wǎng)什么呢?

    內(nèi)網(wǎng)穿透可以帶給物聯(lián)網(wǎng)什么呢?
    的頭像 發(fā)表于 10-14 15:14 ?1103次閱讀

    神器!實(shí)現(xiàn)內(nèi)網(wǎng)穿透的幾款工具

    frp 是一個(gè)專(zhuān)注于內(nèi)網(wǎng)穿透的高性能的反向代理應(yīng)用,支持 TCP、UDP、HTTP、HTTPS 等多種協(xié)議??梢詫?b class='flag-5'>內(nèi)網(wǎng)服務(wù)以安全、便捷的方式通過(guò)具有公網(wǎng) IP 節(jié)點(diǎn)的中轉(zhuǎn)暴露到公網(wǎng)。
    的頭像 發(fā)表于 11-25 10:22 ?4088次閱讀
    神器!實(shí)現(xiàn)<b class='flag-5'>內(nèi)網(wǎng)</b><b class='flag-5'>穿透</b>的幾款工具

    內(nèi)網(wǎng)穿透工具FRP的快速入門(mén)

    在計(jì)算機(jī)網(wǎng)絡(luò)中,內(nèi)網(wǎng)穿透是一種通過(guò)公網(wǎng)建立安全通道,使得位于內(nèi)網(wǎng)的計(jì)算機(jī)和服務(wù)可以被外部網(wǎng)絡(luò)訪問(wèn)。對(duì)程序員而言,內(nèi)網(wǎng)穿透可以幫助你干什么呢?
    的頭像 發(fā)表于 01-02 11:47 ?1027次閱讀

    使用cpolar內(nèi)網(wǎng)穿透本地MariaDB數(shù)據(jù)庫(kù)

    本篇教程將使用cpolar內(nèi)網(wǎng)穿透本地MariaDB數(shù)據(jù)庫(kù),并實(shí)現(xiàn)在外公網(wǎng)環(huán)境下使用navicat圖形化工具遠(yuǎn)程連接本地內(nèi)網(wǎng)的MariaDB數(shù)據(jù)庫(kù)。
    的頭像 發(fā)表于 01-22 10:28 ?1011次閱讀
    使用cpolar<b class='flag-5'>內(nèi)網(wǎng)</b><b class='flag-5'>穿透</b>本地MariaDB數(shù)據(jù)庫(kù)

    遠(yuǎn)程桌面內(nèi)網(wǎng)穿透是什么?有什么作用?

    遠(yuǎn)程桌面內(nèi)網(wǎng)穿透指的是通過(guò)特定技術(shù)手段,將處于內(nèi)網(wǎng)中的電腦或服務(wù)器,通過(guò)外部網(wǎng)絡(luò)(互聯(lián)網(wǎng))進(jìn)行訪問(wèn)。內(nèi)網(wǎng)穿透的主要作用是解決在
    的頭像 發(fā)表于 09-13 08:10 ?944次閱讀
    遠(yuǎn)程桌面<b class='flag-5'>內(nèi)網(wǎng)</b><b class='flag-5'>穿透</b>是什么?有什么作用?

    常見(jiàn)的內(nèi)網(wǎng)穿透工具對(duì)比

    國(guó)內(nèi)的內(nèi)網(wǎng)穿透工具有不少選擇,適合不同的使用場(chǎng)景和需求。以下是一些比較常見(jiàn)的國(guó)內(nèi)內(nèi)網(wǎng)穿透工具:
    的頭像 發(fā)表于 11-06 14:59 ?2700次閱讀

    ElfBoard技術(shù)貼|如何完成FRP內(nèi)網(wǎng)穿透

    FRP(FastReverseProxy)是一款高效能的反向代理工具,專(zhuān)為解決內(nèi)網(wǎng)穿透問(wèn)題而設(shè)計(jì)。它能夠?qū)?b class='flag-5'>內(nèi)網(wǎng)中的服務(wù)安全地暴露至公網(wǎng),讓外部用戶(hù)輕松實(shí)現(xiàn)遠(yuǎn)程訪問(wèn)。FRP支持TCP、UDP、HTTP
    的頭像 發(fā)表于 11-08 13:30 ?729次閱讀
    ElfBoard技術(shù)貼|如何完成FRP<b class='flag-5'>內(nèi)網(wǎng)</b><b class='flag-5'>穿透</b>