一、內(nèi)網(wǎng)穿透簡述
由于國內(nèi)網(wǎng)絡(luò)環(huán)境問題, 普遍家庭用戶寬帶都沒有分配到公網(wǎng) IP(我有固定公網(wǎng) IP, 嘿嘿); 這時(shí)候一般我們需要從外部訪問家庭網(wǎng)絡(luò)時(shí)就需要通過一些魔法手段, 比如 VPN、遠(yuǎn)程軟件(向日葵…)等; 但是這些工具都有一個普遍存在的問題: 慢+卡!
1.1、傳統(tǒng)星型拓?fù)?/p>
究其根本因素在于, 在傳統(tǒng)架構(gòu)中如果兩個位于多層 NAT(簡單理解為多個路由器)之后的設(shè)備, 只能通過一些中央(VPN/遠(yuǎn)程軟件)中轉(zhuǎn)服務(wù)器進(jìn)行鏈接, 這時(shí)網(wǎng)絡(luò)連接速度取決于中央服務(wù)器帶寬和速度; 這種網(wǎng)絡(luò)架構(gòu)我這里簡稱為: 星型拓?fù)?/p>
從這張圖上可以看出, 你的 “工作筆記本” 和 “家庭 NAS” 之間通訊的最大傳輸速度為 Up/Down: 512K/s; 因?yàn)榱髁拷?jīng)過了中央服務(wù)器中轉(zhuǎn), 由于網(wǎng)絡(luò)木桶效應(yīng)存在, 即使你兩側(cè)的網(wǎng)絡(luò)速度再高也沒用, 整體的速度取決于這個鏈路中最低的一個設(shè)備網(wǎng)速而不是你兩端的設(shè)備.
在這種拓?fù)湎? 想提高速度只有一個辦法: 加錢! 在不使用 “鈔能力” 的情況下, 普遍免費(fèi)的軟件提供商不可能給予過多的資源來讓用戶白嫖, 而自己弄大帶寬的中央服務(wù)器成本又過高.
1.2、NAT 穿透與網(wǎng)狀拓?fù)?/p>
本部分只做簡述, 具體里面有大量細(xì)節(jié)和規(guī)則可能描述不準(zhǔn)確, 細(xì)節(jié)部分推薦閱讀 How NAT traversal works.
既然傳統(tǒng)的星型拓?fù)溆羞@么多問題, 那么有沒有其他騷操作可以解決呢? 答案是有的, 簡單來說就是利用 NAT 穿透原理. NAT 穿透簡單理解如下: 在 A 設(shè)備主動向 B 設(shè)備發(fā)送流量后, 整個鏈路上的防火墻會短時(shí)間打開一個映射規(guī)則, 該規(guī)則允許 B 設(shè)備短暫的從這個路徑上反向向 A 設(shè)備發(fā)送流量. 更通俗的講大概就是所謂的: “順著網(wǎng)線來打你”
搞清了這個規(guī)則以后, 我們就可以弄一臺 “低配” 的中央服務(wù)器, 讓中央服務(wù)器來幫助我們協(xié)商兩邊的設(shè)備誰先訪問誰(或者說是訪問規(guī)則); 兩個設(shè)備一起無腦訪問對方, 然后觸發(fā)防火墻的 NAT 穿透規(guī)則(防火墻打開), 此后兩個設(shè)備就可以不通過中央服務(wù)器源源不斷的通訊了. 在這種架構(gòu)下我們的設(shè)備其實(shí)就組成了一個非標(biāo)準(zhǔn)的網(wǎng)狀拓?fù)?
在這種拓?fù)湎? 兩個設(shè)備之間的通訊速度已經(jīng)不在取決于中央服務(wù)器, 而是直接取決于兩端設(shè)備的帶寬, 也就是說達(dá)到了設(shè)備網(wǎng)絡(luò)帶寬峰值. 當(dāng)然 NAT 穿透也不是百分百能夠成功的, 在復(fù)雜網(wǎng)絡(luò)情況下有些防火墻不會按照預(yù)期工作或者說有更嚴(yán)格的限制; 比如 IP、端口、協(xié)議限制等等, 所以為了保證可靠性可以讓中央服務(wù)器中轉(zhuǎn)做后備方案, 即盡量嘗試 NAT 穿透, 如果不行走中央服務(wù)器中繼.
二、Tailscale 簡介
第一部分是為了方便讀者理解一些新型內(nèi)網(wǎng)穿透的大致基本原理, 現(xiàn)在回到本文重點(diǎn): Tailscale
Tailscale 就是一種利用 NAT 穿透(aka: P2P 穿透)技術(shù)的 VPN 工具. Tailscale 客戶端等是開源的, 不過遺憾的是中央控制服務(wù)器目前并不開源; Tailscale 目前也提供免費(fèi)的額度給用戶使用, 在 NAT 穿透成功的情況下也能保證滿速運(yùn)行.
不過一旦無法 NAT 穿透需要做中轉(zhuǎn)時(shí), Tailscale 官方的服務(wù)器由于眾所周知的原因在國內(nèi)訪問速度很拉胯; 不過萬幸的是開源社區(qū)大佬們搓了一個開源版本的中央控制服務(wù)器(Headscale), 也就是說: 我們可以自己搭建中央服務(wù)器啦, 完全 “自主可控” 啦.
三、搭建 Headscale 服務(wù)端
以下命令假設(shè)安裝系統(tǒng)為 Ubuntu 22.04, 其他系統(tǒng)請自行調(diào)整.
3.1、宿主機(jī)安裝
Headscale 是采用 Go 語言編寫的, 所以只有一個二進(jìn)制文件, 在 Github Releases 頁面下載最新版本即可:
#下載 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
下載完成后為了安全性我們需要創(chuàng)建單獨(dú)的用戶和目錄用于 Headscale 運(yùn)行
#配置目錄 mkdir-p/etc/headscale #創(chuàng)建用戶 useradd --create-home --home-dir/var/lib/headscale/ --system --user-group --shell/usr/sbin/nologin headscale
為了保證 Headscale 能持久運(yùn)行, 我們需要創(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 的啟動配置, 以下為配置樣例以及解釋(僅列出重要配置):
--- #Headscale服務(wù)器的訪問地址 # #這個地址是告訴客戶端需要訪問的地址,即使你需要在跑在 #負(fù)載均衡器之后這個地址也必須寫成負(fù)載均衡器的訪問地址 server_url:https://your.domain.com #Headscale實(shí)際監(jiān)聽的地址 listen_addr:0.0.0.0:8080 #監(jiān)控地址 metrics_listen_addr:127.0.0.1:9090 #grpc監(jiān)聽地址 grpc_listen_addr:0.0.0.0:50443 #是否允許不安全的grpc連接(非TLS) grpc_allow_insecure:false #客戶端分配的內(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ù)(可能不安全,還沒去看代碼) enabled:false #下發(fā)給客戶端的中繼服務(wù)器列表(默認(rèn)走官方的中繼節(jié)點(diǎn)) urls: -https://controlplane.tailscale.com/derpmap/default #可以在本地通過yaml配置定義自己的中繼接待你 paths:[] #SQLiteconfig db_type:sqlite3 db_path:/var/lib/headscale/db.sqlite #使用自動簽發(fā)證書是的域名 tls_letsencrypt_hostname:"" #使用自定義證書時(shí)的證書路徑 tls_cert_path:"" tls_key_path:"" #是否讓客戶端使用隨機(jī)端口,默認(rèn)使用41641/UDP randomize_client_port:false
3.3、證書及反向代理
可能很多人和我一樣, 希望使用 ACME 自動證書, 又不想占用 80/443 端口, 又想通過負(fù)載均衡器負(fù)載, 配置又看的一頭霧水; 所以這里詳細(xì)說明一下 Headscale 證書相關(guān)配置和工作邏輯:
1、Headscale 的 ACME 只支持 HTTP/TLS 挑戰(zhàn), 所以使用后必定占用 80/443
2、當(dāng)配置了 tls_letsencrypt_hostname 時(shí)一定會進(jìn)行 ACME 申請
3、在不配置 tls_letsencrypt_hostname 時(shí)如果配置了 tls_cert_path 則使用自定義證書
4、兩者都不配置則不使用任何證書, 服務(wù)端監(jiān)聽 HTTP 請求
5、三種情況下(ACME 證書、自定義證書、無證書)主服務(wù)都只監(jiān)聽 listen_addr 地址, 與 server_url 沒半毛錢關(guān)系
6、只有在有證書(ACME 證書或自定義證書)的情況下或者手動開啟了 grpc_allow_insecure 才會監(jiān)聽 grpc 遠(yuǎn)程調(diào)用服務(wù)
綜上所述, 如果你想通過 Nginx、Caddy 反向代理 Headscale, 則你需要滿足以下配置:
1、刪除掉 tls_letsencrypt_hostname 或留空, 防止 ACME 啟動
2、刪除掉 tls_cert_path 或留空, 防止加載自定義證書
3、server_url 填寫 Nginx 或 Caddy 被訪問的 HTTPS 地址
4、在你的 Nginx 或 Caddy 中反向代理填寫 listen_addr 的 HTTP 地址
Nginx 配置參考 官方 Wiki, Caddy 只需要一行 reverse_proxy headscale:8080 即可(地址自行替換).
至于 ACME 證書你可以通過使用 acme.sh 自動配置 Nginx 或者使用 Caddy 自動申請等方式, 這些已經(jīng)與 Headscale 無關(guān)了, 不在本文探討范圍內(nèi).
3.4、內(nèi)網(wǎng)地址分配
請盡量不要將 ip_prefixes 配置為默認(rèn)的 100.64.0.0/10 網(wǎng)段, 如果你有興趣查詢了該地址段, 那么你應(yīng)該明白它叫 CGNAT; 很不幸的是例如 Aliyun 底層的 apt 源等都在這個范圍內(nèi), 可能會有一些奇怪問題.
3.5、啟動 Headscale
在處理完證書等配置后, 只需要愉快的啟動一下即可:
#開機(jī)自啟動并立即啟動 systemctlenableheadscale--now
再啰嗦一嘴, 如果你期望使用 Headscale ACME 自動申請證書, 你的關(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:""
如果你期望使用自定義證書, 則你的關(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í), 啟動后會有一行警告日志, 忽略即可:
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 同級目錄下創(chuàng)建 conf 目錄用于存儲配置文件; 具體配置請參考上面的配置詳解等部分, 最后不要忘記你的 Compose 文件端口映射需要和配置文件保持一致.
四、客戶端安裝
對于客戶端來說, Tailscale 提供了多個平臺和發(fā)行版的預(yù)編譯安裝包, 并且部分客戶端直接支持設(shè)置自定義的中央控制服務(wù)器.
4.1、Linux 客戶端
Linux 用戶目前只需要使用以下命令安裝即可:
curl-fsSLhttps://tailscale.com/install.sh|sh
默認(rèn)該腳本會檢測相關(guān)的 Linux 系統(tǒng)發(fā)行版并使用對應(yīng)的包管理器安裝 Tailscale, 安裝完成后使用以下命令啟動:
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)前客戶端處于哪個內(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ā)的用于路由到其他客戶端內(nèi)網(wǎng)的路由規(guī)則(可選)
--accept-dns: 是否使用中央服務(wù)器下發(fā)的 DNS 相關(guān)配置(可選, 推薦關(guān)閉)
啟動完成后, tailscale 將會卡住, 并打印一個你的服務(wù)器訪問地址; 瀏覽器訪問該地址后將會得到一條命令:
注意: 瀏覽器上顯示的命令需要在中央控制服務(wù)器執(zhí)行(Headscale), NAMESAPCE 位置應(yīng)該替換為一個具體的 Namespace, 可以使用以下命令創(chuàng)建 Namespace (名字隨意)并讓設(shè)備加入:
在 Headscale 服務(wù)器上執(zhí)行命令成功后客戶端命令行在稍等片刻便會執(zhí)行完成, 此時(shí)該客戶端已經(jīng)被加入 Headscale 網(wǎng)絡(luò)并分配了特定的內(nèi)網(wǎng) IP; 多個客戶端加入后在 NAT 穿透成功時(shí)就可以互相 ping 通, 如果出現(xiàn)問題請閱讀后面的調(diào)試細(xì)節(jié), 只要能注冊成功就算是成功了一半, 暫時(shí)不要慌.
4.2、MacOS 客戶端
MacOS 客戶端安裝目前有兩種方式, 一種是使用標(biāo)準(zhǔn)的 AppStore 版本(好像還有一個可以直接下載的), 需要先設(shè)置服務(wù)器地址然后再啟動 App:
首先訪問你的 Headscale 地址 https://your.domain.com/apple:
復(fù)制倒數(shù)第二行命令到命令行執(zhí)行(可能需要 sudo 執(zhí)行), 然后去 AppStore 搜索 Hailscale 安裝并啟動; 啟動后會自動打開瀏覽器頁面, 與 Linux 安裝類似, 復(fù)制命令到 Headscale 服務(wù)器執(zhí)行即可(Namespace 創(chuàng)建一次就行).
第二種方式也是比較推薦的方式, 直接編譯客戶端源碼安裝, 體驗(yàn)與 Linux 版本一致:
#安裝go brewinstallgo #編譯命令行客戶端 goinstalltailscale.com/cmd/tailscale{,d}@main #安裝為系統(tǒng)服務(wù) sudotailscaledinstall-system-daemon
安裝完成后同樣通過 tailscale up 命令啟動并注冊即可, 具體請參考 Linux 客戶端安裝部分.
4.3、其他客戶端
關(guān)于 Windows 客戶端大致流程就是創(chuàng)建一個注冊表, 然后同樣安裝官方 App 啟動, 接著瀏覽器復(fù)制命令注冊即可. 至于移動端本人沒有需求, 所以暫未研究. Windows 具體的安裝流程請?jiān)L問 https://your.domain.com/windows 地址查看(基本與 MacOS AppStore 版本安裝類似).
五、中繼服務(wù)器搭建
在上面的 Headscale 搭建完成并添加客戶端后, 某些客戶端可能無法聯(lián)通; 這是由于網(wǎng)絡(luò)復(fù)雜情況下導(dǎo)致了 NAT 穿透失敗; 為此我們可以搭建一個中繼服務(wù)器來進(jìn)行傳統(tǒng)的星型拓?fù)?a target="_blank">通信.
5.1、搭建 DERP Server
首先需要注意的是, 在需要搭建 DERP Server 的服務(wù)器上, 請先安裝一個 Tailscale 客戶端并注冊到 Headscale; 這樣做的目的是讓搭建的 DERP Server 開啟客戶端認(rèn)證, 否則你的 DERP Server 可以被任何人白嫖.
目前 Tailscale 官方并未提供 DERP Server 的安裝包, 所以需要我們自行編譯安裝; 在編譯之前請確保安裝了最新版本的 Go 語言及其編譯環(huán)境.
#編譯DERPServer goinstalltailscale.com/cmd/derper@main #復(fù)制到系統(tǒng)可執(zhí)行目錄 mv${GOPATH}/bin/derper/usr/local/bin #創(chuàng)建用戶和運(yùn)行目錄 useradd --create-home --home-dir/var/lib/derper/ --system --user-group --shell/usr/sbin/nologin derper
接下來創(chuàng)建一個 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
最后使用以下命令啟動 Derper Server 即可:
systemctlenablederper--now
注意: 默認(rèn)情況下 Derper Server 會監(jiān)聽在 :443 上, 同時(shí)會觸發(fā)自動 ACME 申請證書. 關(guān)于證書邏輯如下:
1、如果不指定 -a 參數(shù), 則默認(rèn)監(jiān)聽 :443
2、如果監(jiān)聽 :443 并且未指定 --certmode=manual 則會強(qiáng)制使用 --hostname 指定的域名進(jìn)行 ACME 申請證書
3、如果指定了 --certmode=manual 則會使用 --certmode 指定目錄下的證書開啟 HTTPS
4、如果指定了 -a 為非 :443 端口, 且沒有指定 --certmode=manual 則只監(jiān)聽 HTTP
如果期望使用 ACME 自動申請只需要不增加 -a 選項(xiàng)即可(占用 443 端口), 如果期望通過負(fù)載均衡器負(fù)載, 則需要將 -a 選項(xiàng)指定到非 443 端口, 然后配置 Nginx、Caddy 等 LB 軟件即可. 最后一點(diǎn) stun 監(jiān)聽的是 UDP 端口, 請確保防火墻打開此端口.
5.2、配置 Headscale
在創(chuàng)建完 Derper 中繼服務(wù)器后, 我們還需要配置 Headscale 來告訴所有客戶端在必要時(shí)可以使用此中繼節(jié)點(diǎn)進(jìn)行通信; 為了達(dá)到這個目的, 我們需要在 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)整主配置來讓 Headscale 加載:
derp: server: #這里關(guān)閉Headscale默認(rèn)的DerperServer enabled:false #urls留空,保證不加載官方的默認(rèn)Derper urls:[] #這里填寫Derper節(jié)點(diǎn)信息配置的絕對路徑 paths: -/etc/headscale/derper.yaml #Ifenabled,aworkerwillbesetuptoperiodically #refreshthegivensourcesandupdatethederpmap #willbesetup. auto_update_enabled:true #HowoftenshouldwecheckforDERPupdates? update_frequency:24h
接下來重啟 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 安裝
目前官方似乎也沒有提供 Docker 鏡像, 我自己通過 GitHub Action 編譯了一個 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)開啟了客戶端驗(yàn)證, 所以請確保 /var/run/tailscale 內(nèi)存在已加入 Headscale 成功的 tailscaled 實(shí)例的 sock 文件. 其他具體環(huán)境變量等參數(shù)配置請參考 Earthfile.
六、客戶端網(wǎng)絡(luò)調(diào)試
在調(diào)試中繼節(jié)點(diǎn)或者不確定網(wǎng)絡(luò)情況時(shí), 可以使用一些 Tailscale 內(nèi)置的命令來調(diào)試網(wǎng)絡(luò).
6.1、Ping 命令
tailscale ping 命令可以用于測試 IP 連通性, 同時(shí)可以看到時(shí)如何連接目標(biāo)節(jié)點(diǎn)的. 默認(rèn)情況下 Ping 命令首先會使用 Derper 中繼節(jié)點(diǎn)通信, 然后嘗試 P2P 連接; 一旦 P2P 連接成功則自動停止 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 的特性也可以用來測試 Derper 連通性.
6.2、Status 命令
通過 tailscale status 命令可以查看當(dāng)前節(jié)點(diǎn)與其他對等節(jié)點(diǎn)的連接方式, 通過此命令可以查看到當(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ò)問題導(dǎo)致沒法走 P2P 連接, 但是我們又想了解一下當(dāng)前的網(wǎng)絡(luò)環(huán)境; 此時(shí)可以使用 tailscale netcheck 命令來檢測當(dāng)前的網(wǎng)絡(luò)環(huán)境, 此命令將會打印出詳細(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 的官方圖形化客戶端, 則可能與這些軟件沖突, 推薦使用純命令行版本并添加進(jìn)程規(guī)則匹配 tailscale 和 tailscaled 兩個進(jìn)程, 讓它們始終走 DIRECT 規(guī)則即可.
7.2、MacOS 下 CPU 占用突然起飛
在使用一些網(wǎng)絡(luò)代理工具時(shí), 網(wǎng)絡(luò)工具會設(shè)置默認(rèn)路由; 這可能導(dǎo)致 tailscaled 無法獲取到默認(rèn)路由接口, 然后進(jìn)入死循環(huán)并把 CPU 吃滿, 同時(shí)會與 Derper 服務(wù)器產(chǎn)生大量上傳流量. 截止本文發(fā)布此問題已修復(fù), 請使用 mian 分支編譯安裝, 具體見 ISSUE/5879.
7.3、阿里云安裝客戶端后無法更新軟件
Tailscale 默認(rèn)使用 CGNAT(100.64.0.0/10) 網(wǎng)段作為內(nèi)部地址分配網(wǎng)段, 目前 Tailscale 僅允許自己的接口使用此網(wǎng)段, 不巧的是阿里云的 DNS、Apt 源等也采用此網(wǎng)段. 這會導(dǎo)致阿里云服務(wù)器安裝客戶端后 DNS、Apt 等不可用, 解決方案目前只能修改源碼刪除掉這兩個 DROP 規(guī)則并重新編譯.
7.4、開啟路由轉(zhuǎn)發(fā)
大多數(shù)時(shí)候我們可能并不會在每個服務(wù)器上都安裝 Tailscale 客戶端, 通常只安裝 2、3 臺, 然后想通過這兩三臺轉(zhuǎn)發(fā)該內(nèi)網(wǎng)的所有流量. 此時(shí)你需要
啟動 tailscale 時(shí)設(shè)置正確的路由提示 --advertise-routes=192.168.1.0/24 來告訴 Headscale 服務(wù)器 “我這個節(jié)點(diǎn)可以轉(zhuǎn)發(fā)這些地址的路由”
其他節(jié)點(diǎn)啟動時(shí)需要增加 --accept-routes=true 選項(xiàng)來聲明 “我接受外部其他節(jié)點(diǎn)發(fā)布的路由”
以上兩個選項(xiàng)配置后, 只需要 Headscale 服務(wù)器上使用 headscale node route enable -a -i XX(ID) 開啟即可. 開啟后目標(biāo)節(jié)點(diǎn)(ID)的路由就會發(fā)布到接受外部路由的所有節(jié)點(diǎn), 想要關(guān)閉的話去掉 -a 即可.
7.5、其他問題
以上也只是我個人遇到的一些問題, 如果有其他問題推薦先搜索然后查看 ISSUE, 最后不行可以看看源碼. 目前來說 Tailscale 很多選項(xiàng)很模糊, 可能需要閱讀源碼以后才能知道到底應(yīng)該怎么做.
-
帶寬
+關(guān)注
關(guān)注
3文章
907瀏覽量
40845 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9017瀏覽量
85182 -
通訊
+關(guān)注
關(guān)注
9文章
893瀏覽量
34833
原文標(biāo)題:Headscale 搭建 P2P 內(nèi)網(wǎng)穿透
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論