# 當我需要在咖啡廳查詢家裡 NAS 的數據庫時... > 一個關於 frp(Fast Reverse Proxy)讓 Synology NAS MySQL 服務隨時隨地可訪問的實戰故事 ## 咖啡廳裡的突發需求 那是個週日的下午,我正坐在市區一家安靜的咖啡廳裡,手邊擺著一杯剛沖好的拿鐵。原本只是想來這裡放鬆一下,沒想到突然接到客戶的電話,需要立刻查詢一些存放在家裡 Synology NAS 上 MySQL 資料庫裡的資料。 問題來了:我的 NAS 在家裡的私人網路裡,沒有固定 IP,也沒辦法直接從外面連進去。當下真的讓我頭痛,總不能跟客戶說「我得回家一趟才能查資料」吧?  ## 為什麼傳統方案讓人頭痛? 說實話,我之前也試過其他方法。Synology 自己的 QuickConnect 雖然方便,但速度真的不敢恭維,而且對於資料庫這種需要穩定連線的應用來說,延遲和不穩定性真的會讓人抓狂。 架 VPN 呢?OpenVPN 配置起來複雜到讓人想放棄,每次有新設備要連都得重新設定一堆憑證。而且說到底,我只是想要一個簡單的資料庫遠端存取,不需要把整個家裡的網路都暴露出來。 你是不是也遇過這種情況?明明技術上應該很簡單的事情,卻因為網路環境的限制而變得複雜無比。 ## frp:我發現的數位橋樑 後來我無意間發現了 frp(Fast Reverse Proxy)這個工具。簡單來說,它就像是在你家和外面世界之間架了一座專用的數位橋樑。 frp 的工作原理其實很有趣: 1. **你家的 NAS** 主動連接到一台有公網 IP 的 **frp 伺服器** 2. **frp 伺服器** 就像個中繼站,負責轉發所有的資料 3. **外部的你** 連接到這台伺服器的指定埠口 4. 伺服器把你的請求透過隧道轉發給家裡的 NAS 整個過程就像是:「我想跟家裡的資料庫聊天,但我們中間隔了一堵防火牆的高牆。沒關係,我們找個在牆外的朋友當傳話筒,這樣就能正常溝通了。」 ## 實戰配置:我的踩坑之路 ### 第一步:選對架構(血的教訓) 我一開始就踩了個大坑。興沖沖地下載 frp,結果執行的時候噴出「Exec format error」。查了半天才發現,Synology 雖然是 x86_64 架構,但我不小心下載成 ARM 版本了。 正確的做法是: ```bash mkdir -p ~/frpc && cd ~/frpc wget https://github.com/fatedier/frp/releases/download/v0.64.0/frp_0.64.0_linux_amd64.tar.gz tar -xzf frp_0.64.0_linux_amd64.tar.gz cd frp_0.64.0_linux_amd64 # 記得先測試一下是否能執行 ./frpc -v ``` ### 第二步:設定配置檔(關鍵中的關鍵)  frp 的配置檔格式在新版本中改成了 TOML,說實話比舊的 INI 格式清爽多了。我的配置長這樣: ```toml # ~/frpc/frp_0.64.0_linux_amd64/frpc.toml serverAddr = "frps server ip" serverPort = 7000 auth.token = "你的_TOKEN_在這裡" [log] to = "/var/services/homes/你的使用者名稱/frpc/logs/frpc.log" level = "info" maxDays = 7 [[proxies]] name = "mysql_3306" type = "tcp" localIP = "127.0.0.1" localPort = 3306 remotePort = 5999 transport.useEncryption = true transport.useCompression = true ``` 這個配置的意思是:把我 NAS 本機 `127.0.0.1:3306` 的 MySQL 服務,對外暴露成 `[ip]:5999`。別人只要連接 `[ip]:5999`,就等於直接連到我家裡的 MySQL。 ### 第三步:權限問題(又一個坑) 原本想把日誌放在 `/var/log` 裡面,結果發現沒有寫入權限。後來改成把所有的執行檔案、日誌、PID 檔都放在家目錄下,問題就解決了: ```bash # 先建立必要的目錄 mkdir -p ~/frpc/logs ~/frpc/run # 啟動 frpc(背景執行) cd ~/frpc/frp_0.64.0_linux_amd64 nohup ./frpc -c ./frpc.toml > ~/frpc/logs/frpc.log 2>&1 & echo $! > ~/frpc/run/frpc.pid ``` ### 第四步:測試連接(成功的興奮感) 當我第一次在咖啡廳裡執行這個指令的時候: ```bash mysql -h [ip] -P 5999 -u myuser -p --protocol=TCP ``` 然後看到熟悉的 MySQL 提示符出現,那種興奮感真的無法形容。就像是突然打通了任督二脈,從此以後想在哪裡工作就在哪裡工作。 ## 安全性考量:不能忽視的重要環節  你可能會擔心:把資料庫暴露到公網上安全嗎?這個擔心很合理,但 frp 其實提供了不錯的安全保護: ### 1. 加密傳輸 配置裡的 `transport.useEncryption = true` 確保所有資料都經過加密傳輸。即使有人在中間攔截,也看不到實際的資料內容。 ### 2. 認證機制 `auth.token` 就像是一把鑰匙,沒有正確的 token 就無法建立連接。 ### 3. 指定埠口映射 我們只暴露了 MySQL 的 3307 埠,其他服務都還是安全地躲在家裡的網路裡。 ### 4. 資料庫層面的安全 記得在 MySQL 層面也要做好權限控制,不要使用 root 帳號,建立專門的使用者並限制其權限。 ## 常見問題:我踩過的其他坑 ### frps 伺服器的選擇 你需要一台有公網 IP 的伺服器來跑 frps(伺服器端)。我是租用雲端主機,每個月幾百塊而已。記得要開放對應的埠口(7000 用於控制連接,5999 是我們的 MySQL 服務埠)。 ### 開機自動啟動 如果你想要 NAS 重開機後自動啟動 frpc,可以在 DSM 的任務排程器裡建立一個開機任務:     ```bash cd /var/services/homes/你的使用者/frpc/frp_0.64.0_linux_amd64 && nohup ./frpc -c ./frpc.toml > /var/services/homes/你的使用者/frpc/logs/frpc.log 2>&1 & ``` ### 效能和穩定性 用了這麼久下來,frp 的穩定性讓我很滿意。資料庫查詢的回應時間基本上就是你的網路延遲加上一點點的代理開銷,對於一般的應用場景來說完全夠用。 ### 監控和維護 記得定期檢查日誌: ```bash # 查看運行狀態 ps aux | grep '[f]rpc' # 查看日誌 tail -f ~/frpc/logs/frpc.log # 重新載入配置(如果你改了設定) cd ~/frpc/frp_0.64.0_linux_amd64 ./frpc reload -c ./frpc.toml ``` ## 這個方案適合你嗎? 經過這段時間的使用,我覺得 frp 特別適合這些場景: - 你有自己的 NAS,需要遠端存取上面的服務 - 你有基本的 Linux 指令操作能力 - 你願意租用一台便宜的雲端主機當中繼點 - 你需要的是穩定、安全的點對點連接 如果你只是偶爾需要存取 NAS 上的檔案,那用 Synology 的 QuickConnect 或 VPN 可能更簡單。但如果你像我一樣,需要頻繁地從外部存取 NAS 上的資料庫或其他服務,frp 真的是個很棒的解決方案。 ## 寫在最後 現在每當我坐在咖啡廳裡工作的時候,再也不用擔心需要存取家裡的資料。那種隨時隨地都能連接到自己資料的自由感,真的讓工作變得更有彈性。 當然,技術方案沒有絕對的好壞,重點是找到適合自己需求的解決方案。frp 對我來說就是那個「剛好」的選擇:不會太複雜,但功能夠強大;不會太昂貴,但穩定性很好。 如果你也遇到類似的需求,不妨試試看 frp。說不定它也能成為你的數位橋樑,讓你的數據隨時隨地都能觸手可及。 --- **參考資料索引:** - [frp 官方 GitHub](https://github.com/fatedier/frp) - [數據庫遠程訪問安全最佳實踐](https://www.keepersecurity.com/blog/2024/04/03/how-to-securely-manage-database-access-for-remote-users/) - [Synology NAS 遠程訪問方案比較](https://www.youtube.com/watch?v=fuVdM-4a3Kk) --- 這篇文章記錄了我在解決遠程訪問家用 NAS 數據庫問題時的實際經歷。希望我的踩坑經驗能幫助到有同樣需求的朋友,讓大家少走一些彎路。 如果你在配置過程中遇到問題,或是有更好的解決方案,歡迎一起交流討論! **技術標籤:** #frp #Synology #MySQL #遠程訪問 #內網穿透 #數據庫安全 --- *本文所有配置均基於個人實際使用經驗,僅供參考。在實際部署時,請根據自己的網絡環境和安全需求進行適當調整。*
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up