以前的一些嘗試:
想過很多種外網訪問樹莓派的方案,比如說ngrok 反向代理什么的,但是免費的反向代理服務速度太慢太不穩定了,而且其本質就是將端口轉發到另一台服務器上,然后我們訪問處於公網的該服務器對應端口,與處在局域網的樹莓派通信。如果是為了搭建服務器而去租另一台服務器,就有點本末倒置了,所以反向代理方案,pass!
其實很多路由器是自帶端口轉發的功能的,你可以把局域網的設備進行mac,ip的綁定,然后轉發你要轉發的局域網ip和端口到公網ip上,你就可以通過公網ip和對應端口,訪問你的局域網設備了。但是問題在於,我們普通家庭的ip都是動態ip,由運營商的DHCP服務器動態分配,每隔一段時間,或者路由器重啟,公網ip都會發生改變。所以如果你想訪問你的局域網設備,就必須知道你家里的公網ip是多少,非常麻煩。然后我天真的想到了申請電信的固定ip,公網ip固定了,那只要用路由器的端口轉發功能把樹莓派的端口映射到公網ip上就可以直接訪問樹莓派了。但是申請固定ip遠比我想象的要麻煩,而且還要額外的費用,
打擾了。
DDNS的大致原理介紹:
最后了解到DDNS(動態域名解析服務)的技術,真正解決了我的問題。我們知道DNS的大致原理是,購買一個域名,將域名和公網ip進行綁定,訪問主機時,ip地址寫對於的域名就可以了,dns服務器會把這個域名自動解析成對應的ip地址。而DDNS:Dynamic Domain Name Server,動態域名解析服務,就是通過調用域名提供商的對於api,用腳本定時去獲取某個域名對應的ip,如果和本地的公網IP不一致了,就進行修改,這樣你的域名就可以和你的公網ip保持一致了。
配置過程
1材料准備:
樹莓派一台,帶有端口轉發功能的路由器一台,一個域名(我買的是阿里雲的域名)
2服務搭建:
首先在路由器里進行設置,將樹莓派的局域網ip固定下來,然后設置端口轉發,將22端口轉發給虛擬主機的21端口(22端口是文件傳輸端口,反正我主要是用來進行ssh連接),這個時候你已經可以用公網ip在putty上對你的樹莓派進行ssh連接了。接下去就是購買域名,去阿里雲注冊一個域名,然后加入一條解析,因為等下我們調用的api不支持增加記錄,只支持修改解析記錄,所以需要一條默認的記錄。做完這一步,只要你的公網ip沒有馬上變化,你已經可以用這個域名進行一些連接了。加下去就是寫python腳本,調用api,進行ip的修改,這個網上教程很多,我也是直接用了現成的腳本,給大家分享一下吧,只要把config.json修改成你對應的數據就行了(accessid ,accesspasswd ,一級域名,二級域名,解析方式:默認A),修改完之后,運行語句: python3 DDNS.py就可以修改你的解析了。
但是這樣還不夠,需要讓這個修改解析的腳本定時去運行,所以我用了crontab來設置定時運行,樹莓派好像是自帶crontab的,在ubuntu和debian上的一些簡單命令是:
安裝:apt-get install cron
啟動:service cron start
重啟:service cron restart
停止:service cron stop
檢查狀態:service cron status
查詢cron可用的命令:service cron
檢查Cronta工具是否安裝:crontab -l
增加定時啟動記錄:crontab -e
增加記錄的方式也很簡單,格式是 m h dom mon dow command
m: 表示分鍾,范圍0到59 h:表示小時,范圍0到23 dom:表示日,范圍1到31 mon:表示月,范圍1到12 dow:表示星期,范圍0到7,0和7都是星期日 command:表示命令
比如每10分鍾運行一次腳本的命令就是:
*/10 * * * * cmd命令
這里非常坑的問題是,多一個或者少一個空格空格都可能會導致語法錯誤,建議先在命令行執行一下試試,成功的話就復制粘貼過去。
還有一個就是查看crontab服務是否是開機自啟動,並且添加自啟動、
樹莓派默認系統下設置crontab【定時任務】為開機啟動和開機不啟動
systemctl is-enabled cron.service --- 查看crond是否為開機自啟動
systemctl enable cron.service --- 將服務設置為開啟啟動
systemctl disable cron.service --- 關閉服務開機自啟動
關於DDNS的python腳本,我暫時還沒有放到我的gitee上,需要的聯系我。
完成了以上的工作我們就實現了樹莓派服務器的搭建,雖然性能是遠遠不夠的,但是拿來玩一玩還可以可以的,畢竟一個域名一年才8塊錢,真香。