2017-08-03 70 views
0

我已經爲API服務器構建了一個節點js代碼。部分功能之一是,它在啓動時應該能夠知道自己的IP,儘管它運行的服務器的設置類型不同。在所有場景中查找節點js服務器的外部IP地址

經典場景並不難(我認爲)。有幾個選項,例如使用os模塊並查找ip或外部接口。我相信還有其他方法,有些可能會更好,但這是我迄今爲止所做的方式。隨意添加儘可能豐富的信息。

有這種情況,我偶然發現。在一種情況下,網絡服務器在谷歌雲實例上運行。這個實例有兩個IP,一個是內部的,一個是外部的。我想要的是外部IP。但是,當我使用上述方法時,實際的外部IP不是返回對象的一部分。內部知識產權被宣佈爲被視爲非內部知識產權。即使當我在服務器命令行中運行不同的命令時,唯一返回的IP也是實際上是內部的,並且不能用於訪問節點服務器。

據我所知,實例本身並不知道它是外部IP。可能有一個DNS(我認爲)會將對外部IP的請求重定向到正確的實例。

在互聯網上閱讀時,我發現在使用負載平衡或代理時,獲取服務器的正確外部IP的問題也可能會增加。

我想過的解決方案是讓節點js代碼向我將構建的服務發出請求。此服務將把節點js服務器視爲客戶端,並將返回其外部IP。從我所做的實驗中,req對象包含客戶IP的信息。所以我應該先檢查req.connection.remoteAddress然後req.headers ['x-forwarded-for']的第一個元素。理想情況下,服務器將向自己發出請求,但

我知道有外部API,例如https://api.ipify.org?format=json這樣做 - 返回實際的IP。但我非常希望節點js服務器獨立於我無法控制的服務。

但是,我真的希望有比從服務器返回服務器IP請求更好的解決方案。

+0

不幸的是,服務器沒有辦法讓所有的配置都知道它的公有IP,而不需要詢問外部觀察者(比如你引用的服務)。 –

+0

你最後提出了什麼解決方案? – EMX

+0

@EMX:我最終創建了自己的服務,迄今爲止已證明可以用於我們測試過的場景。 –

回答

0

但是,我真的希望有更好的解決方案 比從服務器返回服務器IP請求。

這是不可能的,你總是依賴某種外部觀察者/外部請求。

雖然在互聯網上閱讀,我讀了獲得 服務器的正確外部IP的問題也可能會使用負載均衡 或代理時上升。

這是因爲並非在所有情況下自己的設備能夠自我感知其外部IP的。可能有一些網絡位於後面,這意味着分配給將WAN轉發給它的設備的外部地址。 (例如:路由器),所以當你試圖從設備接口本身獲取外部IP時,你最終會獲得一個IP,但是在路由器LAN的範圍內,而不是用於外部請求的IP。

所以,如果你真的想

  1. 在所有方案中使用的方法
  2. 不依賴於第三方服務

唯一的解決辦法: 構建自己ip回聲服務(您維護並可用於未來的項目)。