2010-04-23 106 views
6

我們有一個產品,我們正在部署到一些小企業。它基本上是一個使用Tomcat的基於SSL的RESTful API。它安裝在小型企業的服務器上,並通過iPhone或其他設備便攜式設備訪問。所以,連接到服務器的設備可能來自任何數量的IP地址。如何訪問NAT後面的Web服務?

問題出現在安裝中。當我們安裝這個服務時,在進行端口轉發時似乎總是成爲一個問題,所以外部世界可以訪問tomcat。似乎大多數時間主人不知道路由器密碼等等。

我想研究其他方法,我們可以做到這一點。我想出了以下內容,並希望聽到關於該主題的其他想法。

  1. 設置從每個客戶端辦公室到中央服務器的SSH隧道。基本上,遠程設備將連接到端口上的中央服務器,並將該流量通過隧道傳回Tomcat。看起來有點多餘,有SSH和SSL,但真的沒有其他辦法來完成它,因爲我需要SSL(從設備到辦公室)。不確定這裏的性能影響,但我知道它會起作用。需要監控隧道,並將其恢復,如果它完成,需要處理SSH密鑰交換等。

  2. 設置uPNP爲我嘗試配置洞。大部分時間可能會工作,但uPNP不保證打開。可能是下一個好的一步。

  3. 想出一些類型的NAT橫向方案。我對這些並不熟悉,也不確定他們的工作方式。我們可以訪問身份驗證所需的集中式服務器,這樣可以更輕鬆地進行身份驗證。

我還應該注意什麼來完成這項工作?

回答

8

由您或託管服務提供商而不是客戶公開託管此服務是否沒有辦法?

我在開發自助服務終端時遇到了類似的情況。我從來不知道下一次安裝時我需要處理哪種類型的網絡環境。

我最終創建了一個PPTP VPN以允許所有信息亭連接到我公開託管的一臺服務器。然後,我們創建了一個控制器Web服務,以顯示所有通過VPN連接的信息亭。我不確定你對VPN的熟悉程度,但是通過VPN連接,我可以通過VPN分配的IP訪問信息亭,完全繞過每個信息亭前面的防火牆。

一旦我有VPN服務器設置,每個信息亭節點都非常容易設置。它還帶來了我原本沒有想到的管理收益和許可收入。通過這個基礎架構,我可以輕鬆地推出可通過手機訪問的服務。

祝你好運!

0

在Tomcat前設置一個Apache。這個Apache應該可以從互聯網上看到,Tomcat不應該這樣做。

配置Apache將所有流量轉發到Tomcat。這可以使用mod_proxy輕鬆完成(請查看ProxyPass和ProxyPassReverse指令)。

將您的SSL證書放在Apache中,以便所有客戶端都可以與Apache服務器交談HTTPS,然後Apache服務器與Tomcat交談純HTTP。

沒有隧道或其他噁心+你會驚訝配置Apache是​​如此容易。

+2

我不認爲你瞭解這個問題。 Tomcat位於Nat後面的私人IP地址。把Apache放在它面前並不能解決任何問題。 Nat以外的人仍然需要訪問服務,無論是Tomcat還是Apache。 我已經有Tomcat在端口上運行SSL應答了。只是我需要在防火牆上打洞,我試圖避免這種情況。 – 2010-04-24 03:54:26

+0

是的,上面的解決方案假設Apache不在您的專用網絡中,並且Apache和Tomcat通過防火牆中的漏洞彼此交談。對不起,沒有更明確的說。通過這種設置,客戶端不需要直接訪問您的專用網絡,因爲所有請求都通過Apache服務器進入。在我看來,這使得安全和可維護的設置成爲可能。特別是因爲防火牆上的漏洞只對Apache服務器的IP地址開放,並且你可以保護你喜歡的Apache。 – 2010-04-24 12:21:27

+2

我仍然需要在防火牆上打洞,這正是我想要避免的。 – 2010-04-28 11:53:03

2

存在解決方案以「動態」訪問NAT後面的計算機上的軟件,但通常主要用於UDP通信。

UDP hole punching技術就是其中之一。但是,這並不保證在每工作可能的情況下工作。如果通信雙方都支持「對稱錐NAT」,則不會。

您明顯可以降低客戶端無法使用UPnP作爲備份(甚至主要)備選方案進行通信的概率。

我不知道Web服務不夠,甚至不知道是否使用UDP爲您的Web服務是一種選擇(或者如果它甚至有可能)。

使用相同的技術直接進行TCP很可能會失敗(TCP連接不是無狀態的 - 這會導致很多問題)。

另一種使用相同技術的方法是建立一些基於UDP的VPN(就像OpenVPN一樣),但正如你所說的,你必須管理密鑰,證書等等。這可以是自動的(我做到了),但仍然不是微不足道的。

===編輯===

如果你真的想使用TCP,您可以創建在客戶盒該中心將作爲一箇中繼一個簡單的「代理」的軟件。

您將有以下模式:

  1. Web服務客戶端盒子,後面的NAT
  2. 「代理」在同一個盒子軟件,建立傳出(因此非封閉)的TCP連接到您的公司服務器
  3. 您的公司服務器也託管一個WebService,它需要一個類似於「客戶端標識符」的東西來將請求重定向到適當建立的TCP連接。
  4. 代理程序詢問當地的WebService,併發送回響應到公司服務器,中繼到發起請求的響應也是如此。

替代方案:您可能會要求代理軟件直接連接到請求者以提高性能,但是您可能會遇到與嘗試避免相同的NAT問題。

+0

謝謝。我想保留基於HTTP的東西,所以需要堅持使用TCP。我真的需要一個解決方案,即nat後面的服務器啓動一個出站TCP連接並對其進行維護,從而允許入站TCP連接跨過它,並指向某個端口。 – 2010-04-28 13:59:43

+0

@jr不客氣。我希望有一個類似於TCP的UDP解決方案。不幸的是,路由器和防火牆通常足夠聰明,可以確定TCP連接是入站還是出站時。因此,所描述的技術不能工作。然而,我更新了我的答案,提出了**新的可能解決方案**。 – ereOn 2010-04-28 14:16:08

+0

+1這就是Hamachi和Skype(以及有朝一日在未來的Cryptolink)工作的方式。 – 2010-05-04 15:28:01

0

我不得不這樣做,在過去類似的東西,我相信 最好的選擇是你提出的第一個。

您可以通過使用帶有-R選項的ssh,使用 publick密鑰驗證和幾個腳本來檢查連接是否簡單。不要忘記各種保持活躍和超時 ssh的功能。

不要擔心表演。如果可以,請使用非特權用戶和端口 。不要費心去設置一個CA,每個遠程服務器的公鑰都更容易維護,除非你擁有數千個服務器。

監測非常簡單。每臺服務器都應該在 中央服務器上測試該服務。如果隧道出現故障或者沒有連接,則隧道失效。 重新啓動隧道在任何情況下都不會造成傷害。

或者您可以使用IPsec(strongswan)在網絡級別執行此操作。 這可能會更棘手的設置,這是我使用的選項,但我會 下次使用SSH,它會節省我很多時間。

0

如果您希望與客戶端服務器進行RESTful集成,那麼通向作爲代理的中央服務器的隧道似乎是最佳方法。

但是,如果這不是一個硬性要求,你可以讓中央服務器處理問題的REST的東西,整合中央服務器並與其他中間件客戶端服務器。優秀的候選人將是RMI或JMS。例如,客戶端發起的RMI連接允許服務器對客戶端進行RMI調用。

+0

請求在服務器上啓動時,RMI是否直接處理HTTP?我還沒有看RMI多年,那時RMI無法通過HTTP從服務器推送。 – mdma 2010-05-05 02:57:22

+0

我不認爲RMI http隧道可以解決任何問題。問題在於'客戶端服務器'位於NAT防火牆之後,因此必須始終啓動與「中央服務器」的連接(如果您不進行端口轉發)。使用RMI,您可以啓動到「中央服務器」的連接,以便「中央服務器」可以使用回調連接到「客戶端服務器」(順便說一下,基於http的RMI不支持回調)。 – Kdeveloper 2010-05-05 14:54:43

1

使用SSH隧道進行+1。這是衆所周知的,廣泛可用,並不難配置。

但是,正如您所指出的,您已經在運行SSL,所以SSH加密是多餘的。您可以使用常規的隧道代理來代替SSH,從而提供沒有加密的隧道。我過去使用過this one,它運行良好,雖然我沒有加載測試它 - 它只與少數用戶一起使用。

Here's來自使用隧道代理從防火牆外部訪問其網絡攝像頭的人的博客。

2

類似這樣的事情,人們正在通過HTTP隧道傳輸一切,以及爲什麼某些硬件供應商爲第7層數據包過濾收取了一筆小小的財富。

當客戶至少有三個問題時,這是一項解決一個問題的大量工作。除了你確定的那個,如果他們不知道自己的密碼,那麼誰呢?一個不在那裏工作的管理員?這是一個問題。其次,如果他們不知道密碼,這意味着他們幾乎肯定會在防火牆的固件更新方面落後很多。

我認爲他們應該認真考慮在他們的防火牆上進行PROM重置並從頭開始重新配置(並在固件升級時對其進行升級)。

3只鳥,一塊石頭。

+0

+1 - 雖然我經常使用打孔技術進行快速一次性測試或演示,但對於長期解決方案,這是真正的答案... – Stobor 2010-05-05 06:47:20

+2

在完美的世界中是的......但是在真實世界,客戶只是從不聽,並要求你解決他*問題,而不是*真實*問題。 :/ – ereOn 2010-05-05 09:54:23

0

你可以嘗試連接到電腦/服務器,並通過hamachi(免費VPN軟件)隧道傳輸所有數據,因爲你可以安裝這個工具,它會創建一個反向連接(從你的nat到外部),所以你可以連接到它

site:http://hamachi.cc/