端口轉發
兩年前我買了一台雙盤位的群暉NAS,配置兩個4T的硬盤,這玩意兒一度改變了我使用電腦的模式,真是爽爆了!最最主要的功能就是我能用它規整我所有的資料,並且不管何時何地,只要有網就能訪問。為了能夠做到這點,我需要一些網絡配置,這就是:端口轉發。(或者稱作“虛擬服務器”)
這是我家網絡的結構圖:
群暉NAS放在我家的內網中,網段是192.168.1.0/24,家用路由器的WAN口連着光貓,組成了“上級網絡”,網段是192.168.0.0/24,光貓具有一個公網地址,這個地址是動態分配的。在外網要訪問NAS,就得通過光貓,將網絡包轉到家用路由器,再通過家用路由器轉到NAS,很顯然,這里面有兩次轉發。
你也許這時候有疑問了,為什么NAS和台式機不直接接上光貓?這樣能省一個網絡節點啊?不這么干的原因是:
1,光貓的WIFI功能垃圾透頂,多連幾台設備就卡殼
2,光貓作為路由器的功能太弱,可玩性太差,用來管理設備各種不便
你也許還有另一個疑問,為什么不把光貓接到家用路由器的LAN口上,使得所有局域網設備在同一個內網中?這樣設置端口轉發也只需要設置一次轉發即可。像這樣:
嗯,好問題,事實上我也這樣玩過,但很快發現這樣做之后,家用路由器就喪失了很多功能,比如流量監控,還有許多網管功能,都已經失效,因為路由器設計的時候,這些功能都是針對WAN口的控制,如果數據不流經WAN口,路由器不認為各個設備在訪問外網,這樣的連接方式相當於是將路由器當做一個普通交換機+一個無線AP來用了。
所以,我把光貓WIFI關掉,DHCP關掉,手動設置了光貓的網絡地址192.168.0.1,手動設置家用路由器的WAN口地址為靜態IP,192.168.0.2,以及LAN地址為192.168.1.1,打開家用路由器的DHCP功能,設置DHCP的范圍是192.168.1.2-192.168.1.99。
光貓端口轉發設置:
外部端口 | 協議 | 內部地址 | 內部端口 |
5000 | TCP | 192.168.0.2 | 5000 |
5001 | TCP | 192.168.0.2 | 5001 |
…… |
就是說把對外網地址的5000端口的TCP包轉發到192.168.0.2的5000端口去。也許你想知道我為什么能登錄到光貓去設置,這是因為我跟電信的人要了光貓的管理密碼:P
接着是家用路由器的設置,類似的:
外部端口 | 協議 | 內部地址 | 內部端口 |
5000 | TCP | 192.168.1.200 | 5000 |
5001 | TCP | 192.168.1.200 | 5001 |
…… |
這樣,假設公網動態IP地址是:101.202.15.46(我瞎寫的),那么我對http://101.202.15.46:5000的訪問,就被最終轉到內網的http://192.168.1.200:5000去。
這樣就能在外網訪問群暉的DSM界面了。
DDNS
很顯然,101.202.15.46這個地址不便記憶,且有可能會變動,所以我們還需要個“動態域名解釋”,說起動態域名解釋服務,有大家耳熟能詳的“花生殼”,當然,這次我沒用花生殼,群暉自己就有提供這個服務,可以在群暉的控制面板-外部訪問-DDNS中配置:
一旦完成,你就可以使用http://yourname.synology.me:5000來訪問你的DSM管理界面了。
另外DDNS的服務商有很多,找一個能用的就夠了,弄多個反倒麻煩。
值得注意的是,有一種情況會導致你的DDNS配置不成功,那就是你的寬帶根本沒有公網地址,這個並不奇怪,你的手機連3G、4G上網,手機的地址就不是公網地址,它是移動/聯通的一個局域網地址,不信自己去看看。很明顯,DDNS將域名解釋到這么一個局域網地址是沒有任何意義的。如果是這種情況的話,就得用反向代理了,原理是你的NAS跟一台有公網地址的主機保持一個數據通道,DDNS將域名解釋到這台公網主機的地址去,公網主機通過數據通道將數據轉發到你的NAS上來,顯然,這種做法很低效,並且對公網主機造成的開銷較大,所以一般都是要收取一定費用的,花生殼等提供了這類服務,群暉的QuickConnect也是類似這種服務,群暉是免費的,但用起來感覺不是很穩定,並且速度很慢。
SSL證書
下一個問題,我要用https訪問我的DSM界面:https://yourname.synology.me:5001。
但我自簽的證書瀏覽器不認,會阻止一般的用戶訪問,比如你想讓你的家人/同事也用NAS,他們一打開就看到證書無效,然后就沒有然后了。
解決方法是讓瀏覽器認這個證書,將根證書安裝到訪問者的電腦上即可。但這種方法不好,第一很麻煩,第二如果使用移動設備(手機平板之類)的話,就很難弄。於是你要給自己的域名搞一張證書,一看,都是收費的,且麻煩一大堆,遂放棄。
其實現在已經有一個完美的解決方案,那就是Let' Encrypt,這是它的官方站點:https://letsencrypt.org/
通過它,我們能獲取到免費的證書,且非常好用,唯一的問題是有效期比較短,但要續也很簡單。
如果你用的是群暉,你甚至都不需要什么復雜的注冊和配置的過程,僅僅在“控制面板-安全性-證書”這頁面中點幾下,一張有效的證書很快就能部署完成。
這樣你和你的小伙伴就能愉快地在外網訪問這個地址了:https://yourname.synology.me:5001
關於Let's Encrypt的更多配置,請參考它的官網,總之這個是個好東西。
局域網里直接用域名訪問
局域網里直接用域名訪問你的NAS,可行不?試試看,你很快發現不可行,不可行就換回用內網IP地址訪問即可,如果你不想折騰,就到此為止。如果想折騰或者了解下為什么,就接着往下看。
這是一個困擾了我很久的問題,這個問題簡單描述為:為什么我不能用公網地址訪問本地服務器?
這又是一個非常非常常見的問題,公司里有一台服務器,地址是192.168.1.200,我們通過端口轉發,使得外網能通過101.202.15.46這個公網IP地址來訪問這台服務器,當然通過域名訪問也是一樣的,域名就被解釋為101.202.15.46嘛。現在我的工作電腦(192.168.1.100)想通過域名訪問這台服務器,會出現什么狀況?
我先把網絡結構簡化成這個樣子:
過程描述如下:
1,工作電腦,要訪問服務器,於是跟路由器說:“我要訪問http://101.202.15.46:80”,
2,路由器接到請求,看到地址原來就直接是自己的公網地址,於是按照端口轉發的配置規則,將請求轉到192.168.1.200:80去(注意,這個時候數據包並未流經公網)
3,服務器收到請求后要給客戶端返回數據,如何返回?當然是根據原地址來了,由於數據包並未流經公網(未經過NAT),所以源地址是192.168.1.100,於是告訴路由器,我要發數據包到192.168.1.100去
4,路由器一看,這不就是內網地址么?於是直接將數據包丟給了工作電腦,工作電腦收到了數據包
嗯?表面上看數據包有來有回,應該可以,事實上不行——工作電腦嘗試跟101.202.15.46建立連接,但收到的包卻來自192.168.1.200,TCP連接無法成功建立,通信失敗。這個問題又有另外一個常見的稱呼,叫:IP回流。大家搜一下就能收到。
如何解決這個問題?
方法一:增加一個外網路由設備(稱之為路由器B吧,原先路由器叫路由器A),並在路由器A上配置這么一條路由規則:當來自內部的主機嘗試訪問101.202.15.46:80時,將數據包轉發到路由器B,路由器B收到數據包后再按正常操作把數據包轉回給路由器A,數據包走向大致這樣:
紅色箭頭是去,藍色箭頭是回,路由器B就充當了一個外部的中轉站。當然了,實際的情況可能不需要額外的一個設備,但由於我只是有所了解,沒有實際操作過,所以也寫不出更具體的內容了,若有不對,請不吝賜教。
方法二:將內網要訪問的yourname.synology.me域名解釋為192.168.1.200,然后……搞定!
顯然方法二比方法一直截了當得多,這也是我認為的“正統方法”。怎么配這個域名解釋?最簡單的方法是直接修改自己電腦上的hosts文件,這樣不需要找公司的IT,自己就能搞定。但電腦上能弄弄,手機上呢?再說這么多電腦,要一台台配置么?還有如果你用的是筆記本,哪天拿到外網去辦公了,是不是又要把hosts文件改回來?
所以,最好的方法,還是在路由器上配置,我家的路由器(ASUS RT-AC86U,刷了梅林固件)就可以配。具體方法如下:
1,先開啟路由器的SSH功能(過程略)
2,SSH登錄至路由器
3,創建文件/jffs/dnsmasq.conf.add,內容是:
addn-hosts=/jffs/configs/hosts
4,創建文件/jffs/configs/hosts,內容是:
192.168.1.200 yourname.synology.me
5,重啟Dnsmasq服務
service restart_dnsmasq
搞定。這時候你試着在電腦上看看yourname.synology.me解釋到哪里去了
nslookup yourname.synology.me
也許還是外網地址,這是因為dns緩存的緣故,你清一下就好了
ipconfig /flushdns
最后
折騰,有時候不在於直接產生了多少價值,還在於在這個過程中真正學到了些東西。