Raspberry Pi: 從外部連線回來


新外裝,也追加了散熱片。

先前情提要一下。
我架了一個RASPI,掛載網路硬碟,PI上面跑著妙蛙程序。我發現如果採用無線網卡(我用Edimax-7811Un)來進行這件事情,PI很快就會熱當,即使是在涼爽的天氣狀況而且我額外裝了散熱片之下也仍然難逃一劫。這使得我改用有線走RJ45的方案,目前看起來狀況改善且連線速度大幅提升。

下一階段目標,就是我可以從外部網路遠端進入我的PI。

這代表我需要兩件事情成立,第一是我要知道我的對外IP,也就是我的ROUTER的對外IP;然後我的ROUTER必須能知道當我對他連線的時候我要找的是誰。由於ROUTER對外是Dynamic IP,所以得用DDNS服務來確保我們可以隨時得知正確的IP位址。我採用了NO-IP的服務,他的免費帳戶提供了最多三組的HOSTNAME,只要設定一個自己容易記得的HOSTNAME,然後把我們ROUTER的外部IP跟他連結即可。問題是我們的外部IP是會改變的!這邊有兩條路可走,第一是透過ROUTER提供的DDNS對應功能,讓ROUTER自動更新自己的IP位址給DDNS業者。但是我發現我的ROUTER,Time Capsule,很遺憾並沒有這個功能,所以我必須走第二條路徑:讓我的主機自己定期回報正確的IP位址給NO-IP。


*安裝NO-IP客戶端程式(for Linux)


這個DUC(Dynamic Update Client)程式能夠達成上述一事。官方有教學文件,照著步驟就可以簡單完成,安裝過程中會要求輸入你的NO-IP帳號及密碼,以及回報的週期頻率(應該是以分鐘為單位,預設每三十分鐘更新一次)。安裝完成後啟動這個程式,他就會在背景運作了。(這邊有個小小要注意的點是/usr/local/bin/noip2要用sudo來執行不然會出現找不到設定檔的錯誤。)


*設定固定內部IP


接下來是當我從外部藉由NO-IP HOSTNAME連回ROUTER時,ROUTER必須能夠知道我要找的是區網底下的PI主機。PI是藉由DHCP取得內部IP,根據租期長短這個IP可能會變動,這會讓事情變得複雜。我們可以用兩種方式讓PI取得靜態而非動態的內部IP。第一種方式是從PI本身下手,修改/etc/network/interface設定檔:

遮掉原本的設定
# iface eth0 inet dhcp

加入新設定
# to use static private ip
iface eth0 inet static
address 你想要的靜態IP位址
netmask 255.255.255.0
network 192.168.2.0(假設路由器位址是在192.168.2網域)
boradcast 192.168.2.255(假設路由器位址是在192.168.2網域)
gateway 路由器IP位址

我一開始這麼做,但後來想想一旦網路環境有些變化(真的很快就變了!),這個寫死的設定檔可能會讓我的PI一時無法上網,到時候我又得替它接個螢幕鍵盤才能搞定那就麻煩了。所以後來我採用第二種方式,就是不在PI的設定檔動手腳,而是在Time Capsule這邊替他保留DHCP IP位址,如此一來我需要設定的就只有在Time Capsule裡面選好一個IP位址並且告知PI的MAC位址。這件事情可以在AirPort Utility.app裡簡單達成。


*Port Forwarding


光是讓PI取得固定的內部IP位址是不夠的,當我從外部對連線ROUTER時,ROUTER還是不知道我其實想找的是PI。這邊需要做一個「轉埠」的動作,藉由指定的PORT來讓ROUTER知道我是要找他區網底下特定的主機位址。在Time Capsule底下要做到這件事情必須開啟「DHCP and NAT」這個模式,可以在AirPort管理介面裡點Time Capsule的Edit按鈕,在Network標籤底下可以選擇三種模式。

這邊要講一下,由於我是從(一台原則上不歸我管的)ROUTER牽線連給TIme Capsule(簡稱TC了啦),所以TC預設的模式會是Bridge。然而Bridge沒有NAT的能力,所以必須轉換模式,但在這樣的拓撲結構下可能會遇到Double NAT的警告,因為等於是有兩台ROUTER都開DHCP + NAT。嗯,這也是沒辦法的事。(咦)等我們遇到問題再說吧。開啟DHCP and NAT模式之後,TC就可以做Port Forwarding了!

問題還是沒解決,因為我們現在有兩台ROUTER。一個方法是維持TC的Bridge Mode,我們把轉埠的任務交給對外的那台ROUTER。或者我們在對外那台ROUTER上設定DMZ權限給TC。因為一些大人的理由最後我選擇採用後者。我對網路不是很熟,但似乎前者是比較好的結構就是了。



在完成上面這一大堆設定之後,我現在可以在Internet上隨時連線回我的PI了!只要透過:

ssh 我的NO-IP HOSTNAME

就能輕易回家。
這代表我可以從外部網路投放種子給妙蛙了呱呱。

嗯,這回就先到這裡吧。
喔等等補個小插曲。讓我抱怨一下Time Capsule這個玩意兒。他的AirPort這個介面實在是有點不太行,他只能告訴你無線的客戶端的IP位址(有時又自己改成MAC位址,看不出來一致性所在),卻不能告訴你有線的客戶端的位址。WTF!?所以當我的PI初次藉由有線連到TC的時候,就發生了我他媽的不知道我的PI的IP位置的窘境。

不,堅決不把PI接上螢幕和鍵盤。(好遠啊)
於是我只好寫了下面這個東西:



過程中再次體認我的Shell Scripting功力實在低落﹍﹍


1 comment(s):

紹均 | 01 September, 2016 23:00

最後面找ip的script,用這個指令或許較為方便、快速
arp -a | sed '/^\?/d'

Post a Comment

回應文章前請注意下列三勿原則:

1)勿拍照;(→會有靈異的照片從你的相機裡跑出來...
2)勿餵食;(→會有飢渴的猛獸從我的網誌裡跑出來...
3)勿告白。(→會有奇怪的東西從站長體內裡跑出來...

謝謝大家的配合。
( > ー <)b