戰(zhàn)指南)
你的telly IPTV代理真的安全嗎一份新手也能看懂的加固實(shí)戰(zhàn)指南【免費(fèi)下載鏈接】tellyAn IPTV proxy項(xiàng)目地址: https://gitcode.com/gh_mirrors/te/telly先說(shuō)個(gè)真實(shí)場(chǎng)景。上個(gè)月我?guī)鸵晃慌笥雅挪閱?wèn)題他折騰了整整一天Plex 始終找不到設(shè)備。我遠(yuǎn)程一看配置文件里Base-Address 0.0.0.0:6077日志里還躺著一行刺眼的報(bào)錯(cuò)。改成一個(gè) IP 后三分鐘就通了。他撓著頭問(wèn)我這玩意兒不是裝上就能用嗎怎么這么多講究telly 是一個(gè)用 Go 語(yǔ)言編寫(xiě)的 IPTV 代理工具核心作用是把 IPTV 源的 M3U 播放列表翻譯成 Plex Live 能直接認(rèn)出的虛擬電視調(diào)諧器。聽(tīng)起來(lái)很酷但正因?yàn)樗焐鸵┞对诰钟蚓W(wǎng)上、還要替你去拉取各種流媒體源它的telly安全配置做得好不好直接決定了你的 IPTV 服務(wù)是只給你自己看還是全網(wǎng)免費(fèi)共享。這篇文章不整那些讓人昏昏欲睡的安全理論就按風(fēng)險(xiǎn)從高到低的順序帶你把 telly 的每個(gè)薄弱點(diǎn)逐個(gè)焊死。全程有配置示例、有踩坑記錄跟著走一遍新手也能在半小時(shí)內(nèi)搞定。先搞清楚 telly 把門(mén)開(kāi)在哪里telly 的全部行為都由一個(gè) TOML 配置文件控制默認(rèn)放在三個(gè)位置之一/etc/telly/telly.config.toml、$HOME/.telly/telly.config.toml或者運(yùn)行目錄下的telly.config.toml。官方示例配置可以看項(xiàng)目根目錄的README.md里面注釋寫(xiě)得非常詳細(xì)建議當(dāng)成字典來(lái)查。打開(kāi)這個(gè)文件你會(huì)看到四個(gè)必填區(qū)塊[Discovery]telly 怎么向 Plex 自我介紹、[IPTV]流媒體行為、[Log]日志、[Web]網(wǎng)絡(luò)監(jiān)聽(tīng)。另外還有一個(gè)[[Source]]區(qū)塊用來(lái)配置你的 IPTV 源。記住這張地圖下面所有操作都是在這個(gè)文件上做文章。改動(dòng)后重啟 telly 生效不需要重新編譯任何東西。第一站身份信息還在用出廠默認(rèn)值先把它換掉telly 的[Discovery]區(qū)塊里有幾個(gè)字段是它向 Plex 證明我是我的憑證。官方示例里給出的默認(rèn)值是[Discovery] Device-Auth telly123 Device-ID 12345678 Device-UUID 問(wèn)題在于所有下載過(guò)這個(gè)項(xiàng)目的人手里的默認(rèn)值都長(zhǎng)得一模一樣。telly123這種密碼說(shuō)句不好聽(tīng)的跟沒(méi)鎖門(mén)沒(méi)什么區(qū)別。隔壁鄰居要是也裝了 Plex 和 telly兩邊設(shè)備直接互相認(rèn)親你的頻道列表可能就跑到人家電視上去了。正確做法其實(shí)很樸素[Discovery] Device-Auth Kx9#mP2!vL5qR7 # 至少12位混合大小寫(xiě)、數(shù)字和符號(hào) Device-ID 8f3T2aB9 # 8位隨機(jī)字母數(shù)字別用12345678這種連續(xù)串 Device-UUID # 留空讓telly自動(dòng)生成即可順手說(shuō)個(gè)進(jìn)階玩法如果你要跑兩個(gè)telly 實(shí)例比如給兩臺(tái)不同的 Plex 用Device-ID、Device-UUID和端口三者組合起來(lái)才是每臺(tái)設(shè)備的唯一鑰匙記得每個(gè)實(shí)例都換成不同組合不然兩臺(tái)會(huì)打架。這個(gè)細(xì)節(jié)寫(xiě)在README.md的注釋里屬于資深用戶才懂的坑。第二站監(jiān)聽(tīng)地址設(shè)錯(cuò)了等于把家門(mén)鑰匙掛門(mén)口這是整份配置里最容易出錯(cuò)、也最危險(xiǎn)的一環(huán)。先看兩個(gè)字段的分工Listen-Addresstelly 進(jìn)程實(shí)際聽(tīng)哪個(gè)網(wǎng)卡的哪個(gè)端口也就是真正開(kāi)著的門(mén)Base-Addresstelly 告訴 Plex你來(lái)找我玩的時(shí)候用這個(gè)地址相當(dāng)于遞給別人的名片不少教程會(huì)教你把兩個(gè)都設(shè)成0.0.0.0:6077然后你就收獲了和開(kāi)頭那位朋友一模一樣的報(bào)錯(cuò)。telly 在啟動(dòng)時(shí)會(huì)對(duì)配置做檢查邏輯在main.go的validateConfig函數(shù)里發(fā)現(xiàn)Base-Address是0.0.0.0會(huì)直接拒絕啟動(dòng)日志里寫(xiě)著base URL is set to 0.0.0.0, this will not work.——因?yàn)?Plex 拿到這張名片會(huì)傻乎乎地往 localhost 上連而 localhost 是它自己不是你的 telly。更隱蔽的坑在反向搭配Listen-Address全接口監(jiān)聽(tīng)、Base-Address卻是 localhost這時(shí) telly 只會(huì)甩給你一行警告然后照常運(yùn)行。后果是什么局域網(wǎng)里任何設(shè)備都能直接訪問(wèn) telly 的 6077 端口而 Plex 卻連不上流。所以請(qǐng)記住這組黃金搭配[Web] Base-Address 192.168.1.100:6077 # 必須是telly所在機(jī)器的實(shí)際內(nèi)網(wǎng)IP Listen-Address 0.0.0.0:6077 # 全接口監(jiān)聽(tīng)方便局域網(wǎng)設(shè)備發(fā)現(xiàn)如果你的 Plex 和 telly 在同一臺(tái)機(jī)器上Base-Address用localhost:6077也沒(méi)問(wèn)題但一旦涉及局域網(wǎng)共享務(wù)必?fù)Q成真實(shí) IP。至于端口6077 只是約定俗成的默認(rèn)值改成 8088、19000 之類(lèi)的冷門(mén)端口能擋掉一大批只會(huì)掃默認(rèn)端口的腳本小子。第三站配置文件本身就是你的保險(xiǎn)柜聊完網(wǎng)絡(luò)說(shuō)點(diǎn)很多人忽略的那份telly.config.toml里躺著什么你的 IPTV 服務(wù)商賬號(hào)密碼、M3U 播放列表的完整 URL——不少供應(yīng)商的播放列表鏈接里直接內(nèi)嵌username和password參數(shù)。也就是說(shuō)這份文件本身就是一把萬(wàn)能鑰匙。所以它的文件權(quán)限必須按保險(xiǎn)柜標(biāo)準(zhǔn)來(lái)chmod 600 /etc/telly/telly.config.toml # 或者 chmod 600 ~/.telly/telly.config.toml600的含義是只有所有者能讀寫(xiě)其他人一律靠邊站這對(duì)單用戶家庭環(huán)境是夠用的。如果你跟人合租服務(wù)器再狠一點(diǎn)把所屬組也鎖死別讓同組的其他用戶有可乘之機(jī)。有人可能要問(wèn)那 M3U 地址里的密碼會(huì)出現(xiàn)在日志里嗎t(yī)elly 這一點(diǎn)做得還算厚道——源碼里內(nèi)置了一個(gè)凈化邏輯在lineup.go的getM3U和getXMLTV里會(huì)把日志中 URL 的username、password、token參數(shù)替換成REDACTED字樣再輸出。但注意日志凈化≠日志安全它只負(fù)責(zé)打碼不負(fù)責(zé)幫你隱藏其他敏感信息。還有一個(gè)容易踩的雷把[Log] Level調(diào)成debug時(shí)telly 啟動(dòng)會(huì)把完整配置以 JSON 形式打印到日志里見(jiàn)main.go包括你的 Source 區(qū)塊。所以生產(chǎn)環(huán)境老老實(shí)實(shí)用infodebug 只留給本地調(diào)試。第四站日志和調(diào)試接口低調(diào)才能活得久接著上面說(shuō)日志。[Log]區(qū)塊有兩個(gè)開(kāi)關(guān)值得你認(rèn)真權(quán)衡[Log] Level info # debug/info/warn/error/fatal 五檔可選 Requests false # 是否記錄每個(gè)HTTP請(qǐng)求Requests true的時(shí)候telly 會(huì)把每個(gè)訪問(wèn)請(qǐng)求的客戶端 IP、User-Agent、路徑、耗時(shí)全部寫(xiě)進(jìn)日志代碼在routes.go的ginrus中間件。開(kāi)發(fā)期開(kāi)著確實(shí)方便排查但生產(chǎn)環(huán)境開(kāi)著等于把自己家的訪客登記簿攤在門(mén)口。尤其當(dāng)你把 telly 暴露到公網(wǎng)時(shí)這條建議從可選直接升級(jí)成必須——關(guān)掉它日志會(huì)安靜很多也少了很多被人研究的素材。另一個(gè)低調(diào)的秘訣telly 自帶一個(gè)/debug.json接口routes.go里注冊(cè)的會(huì)返回完整的頻道列表內(nèi)部狀態(tài)。這玩意兒在本地調(diào)試時(shí)很香但如果你開(kāi)了公網(wǎng)端口記得在反向代理或防火墻層面把它擋掉或者干脆別讓 telly 離開(kāi)內(nèi)網(wǎng)。順帶一提t(yī)elly 還有一個(gè)/manage管理頁(yè)面前端代碼在frontend/目錄下默認(rèn)沒(méi)有任何認(rèn)證。誰(shuí)連上你的 6077 端口誰(shuí)就能看到這個(gè)頁(yè)面。所以再次強(qiáng)調(diào)防火墻只放行該放行的 IP別讓 6077 裸奔到公網(wǎng)。第五站用 Docker 部署這幾行配置能救命如果你用 Docker 跑 telly官方鏡像tellytv/telly:dev-ffmpeg自帶 ffmpeg 轉(zhuǎn)碼能力隔離性天然比裸進(jìn)程好一截但有幾個(gè)細(xì)節(jié)值得摳一摳。最值得強(qiáng)調(diào)的就是配置文件的只讀掛載。想象一下配置文件能被容器里的進(jìn)程改寫(xiě)一旦某個(gè)環(huán)節(jié)出了岔子比如誤操作你的保險(xiǎn)柜就可能被自己人撬開(kāi)。改成只讀一勞永逸version: 3 services: telly: image: tellytv/telly:dev-ffmpeg container_name: telly ports: - 6077:6077 environment: - TZAsia/Shanghai volumes: - ./telly.config.toml:/etc/telly/telly.config.toml:ro # 關(guān)鍵就是末尾的:ro restart: unless-stoppedREADME.md里的 Docker 示例沒(méi)有加:ro但你完全可以加這不影響任何功能純賺一層保險(xiǎn)。還有兩點(diǎn)官方兩個(gè)鏡像dev和dev-ffmpeg中dev-ffmpeg只多了個(gè) ffmpeg體積大得有限建議無(wú)腦選它。萬(wàn)一以后想開(kāi)轉(zhuǎn)碼不用改任何啟動(dòng)命令。注意[IPTV]區(qū)塊里的FFMpeg開(kāi)關(guān)想用就取消注釋設(shè)為true不想用就保持注釋狀態(tài)千萬(wàn)別寫(xiě)成false——這會(huì)讓 telly 的解析邏輯陷入奇怪的狀態(tài)屬于 README 里明示的坑。關(guān)于 telly 還有個(gè)特色提醒它單實(shí)例加載超過(guò) 420 個(gè)頻道時(shí)Plex 會(huì)直接卡死lineup.go里寫(xiě)死了這個(gè)上限超了直接 panic。所以老老實(shí)實(shí)用Filter正則把頻道過(guò)濾到合理數(shù)量比如Filter Sports|United States.*這既是性能問(wèn)題也是安全問(wèn)題的近親——頻道越少暴露面越小。收尾出門(mén)前的十分鐘自檢到這里核心的加固動(dòng)作都做完了。最后送你一份出門(mén)檢查單每次改完配置重啟 telly 之前花十分鐘過(guò)一遍基本就穩(wěn)了Device-Auth是不是還是telly123Device-ID還是不是12345678Base-Address填的是真實(shí)內(nèi)網(wǎng) IP而不是0.0.0.0配置文件權(quán)限是不是600Log Level是不是info級(jí)別Requests是不是false6077 端口有沒(méi)有被防火墻限制在可信 IP 范圍內(nèi)有沒(méi)有打開(kāi)/debug.json和/manage這類(lèi)無(wú)認(rèn)證接口的公網(wǎng)訪問(wèn)Docker 掛載配置有沒(méi)有加:ro如果有一項(xiàng)打了勾但答案是沒(méi)做那就趁現(xiàn)在回去補(bǔ)上。安全這回事說(shuō)穿了就是把默認(rèn)值換掉、把暴露面收窄、把日志管住三件事。telly 的默認(rèn)配置是為了讓你跑起來(lái)而不是為了讓你跑得安全——這兩者之間就差今天這幾步。最后啰嗦一句telly 處于活躍開(kāi)發(fā)中配置項(xiàng)可能隨版本變動(dòng)動(dòng)手之前先瞄一眼README.md和更新日志。愿你的 telly 從此只為你自己亮燈把 IPTV 的樂(lè)趣留給客廳把麻煩擋在門(mén)外。【免費(fèi)下載鏈接】tellyAn IPTV proxy項(xiàng)目地址: https://gitcode.com/gh_mirrors/te/telly創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考