只緣身在此山中?內網域名解析問題

配置完Nginx之後雖然還沒有新增任何網頁內容,但是web伺服器確實已經在運行了。但是這時候在瀏覽器上輸入自己的域名很可能並不能顯示正常的網頁。其實這種現象很普遍,並不是Nginx有問題,只是我們的PC正好和伺服器在同一個區域網。為了弄清楚其中的原理,我們假設訪問PC的IP地址為192。168。0。10, 伺服器的內網IP為192。168。0。11,DNS上登入的外網ip為1。1。1。1。

分析原因

在瀏覽器上輸入域名之後,首先會透過DNS伺服器進行域名解析,獲得域名對應的IP地址,這裡是1。1。1。1。之後會生成一個來自PC,傳送到域名對應地址的IP報頭。

from 192。168。0。10

to 1。1。1。1

por 80

這個包沒有問題,可以正確地被髮送到外網埠。到達外網埠之後由於是對80埠的訪問,會觸發NAT地址對映,將報頭改寫為

from 192。168。0。10

to 192。168。0。11

port 80

伺服器收到這個資料之後進行相應,返回的資料報頭為

from 192。168。0。11

to 192。168。0。10

port 80

這裡問題來了,路由器識別出這是LAN內的流量,所以不經過WAN口,直接將這個包轉發到發出請求的PC,也就是192。168。0。10。但是PC的瀏覽器在等待來自“伺服器”,也就是1。1。1。1的資料,所以會將這個包丟棄。最終表現為連線超時,訪問失敗。

解決方法

知道了原因,就可以從出問題的步驟來設計解決方案了。

使用IP地址訪問

既然是內網通訊,我們當然可以不經過外網埠直接訪問伺服器,這樣就可以正確的將來自伺服器內網地址的報文識別為返回的資訊,從而正常通訊了。要實現透過內網地址訪問伺服器,最簡單的方法就是直接在瀏覽器中輸入伺服器的內網IP。但是這樣有一個問題,就是HTTPS的認證是基於域名的,如果網站應用了SSL,透過IP的訪問會被認為是不安全的。這樣雖然不影響正常訪問伺服器的內容,但是在https普及的今天,透過這種方法訪問會收到無數來自瀏覽器的安全警告和打斷,著實不便。

內網DNS

既然可以透過內網IP正常訪問,那麼只要在網路內部設立內網DNS,將域名解析為伺服器的內網IP地址即可。而且很多作業系統都提供了覆蓋DNS的方法,比如windows系統會在傳送DNS請求之前先檢查hosts檔案中的對映專案。

在hosts檔案(C:\Windows\System32\drivers\etc\hosts)中新增自己的域名到內網IP的對映即可覆蓋外部的DNS記錄,透過域名訪問內部網站。

在路由器中配置雙向埠對映

還有一種解決辦法,是解決路由器返回資訊時不透過外網埠直接在內部轉發這一環節。在路由器的Vlan上新增類似

nat server protocol tcp global 1。1。1。1 80 inside 192。168。0。11 80

的配置,使得路由器返回的資訊也先經由埠對映傳送到外網埠,然後以1。1。1。1作為來源返回給瀏覽器,自然就可以正常的建立連線了。

只緣身在此山中?內網域名解析問題