Security

如何從外部區域網路訪問 Jetty Server?

  • September 1, 2021

我最初在 stackoveflow 上發布了這個問題,但被告知它更適合這個網站。

我正在嘗試從 LAN 外的另一台機器訪問部署在一台機器上的 Jetty 伺服器,但它不工作。我已經閱讀了這個文章並遵循了@Joakim Erdfelt提供的建議,但是它沒有用。我的程式碼如下:

Server server = new Server();
   

   
// HTTP connector
ServerConnector serverConnector = new ServerConnector(server, 1, 1);
serverConnector.setHost("0.0.0.0"); <-
serverConnector.setPort(8080);
serverConnector.setIdleTimeout(30000);
   
   

// Set the connector
server.addConnector(serverConnector);

我嘗試使用以下程式碼從另一台遠端伺服器訪問伺服器:

String postUrl = "http://" + myIP + ":8080"; // myIP is set to the public IP address of Jetty Server

System.out.println("Post URL: " + postUrl);

RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(120 * 1000).build();



try (CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();) {

HttpPost httpPostRequest = new HttpPost(postUrl);

...

但是,這會引發以下異常:

HttpPostConnectException: Connect to 123.4.56.78:8080.. failed: Connection refused: connect

是什麼導致了這個錯誤?我在提示時允許訪問防火牆,所以我認為這不是防火牆問題。該埠8080也未用於任何其他程序。我嘗試了多個埠無濟於事。

謝謝

我會將我的一些建議移至答案。您缺少基本的網路知識,請嘗試閱讀一些內容(例如此處)。一些基礎知識:

  • 無法從 Internet 訪問本地 IP(網路 192.168.xx、10.xxx 等),只能從 Internet 直接訪問直接連接到您的 Internet 提供商(您的家庭路由器)的設備。
  • 當您連接到您的家庭路由器並瀏覽網際網路時,會發生幾件事:由於您的本地 IP 無法從網際網路訪問,您的家庭路由器會隱藏您的本地 IP,並用您的公共 IP 替換它。完成此操作後,路由器會記錄連接以便能夠處理回复。當回復到達時,相同的過程會反過來:如果路由器在其表中為傳入的數據包找到匹配的連接,則公共 IP 將替換為您的私有 IP,並且回復將被轉發到網路中的正確設備。這個過程稱為NAT網路地址轉換
  • NAT 可以保護您的家庭網路中的設備(您的設備可以訪問網際網路,但網際網路無法訪問您的設備!) - 但如果您希望家庭網路中的設備可以訪問,這也很困難來自網路。這是因為您的路由器必須知道每個傳入的數據包如何處理它。預設值為:如果您的家庭網路中沒有設備打開該連接,則傳入的數據包將被丟棄!

現在應該清楚了,為什麼您有多個 IP:Google 只能看到您的公共 IP。為了讓您的碼頭伺服器可以從網際網路訪問,您需要埠轉發。基本上,您將在您的家庭路由器中創建一個規則“將您在埠 8080 上收到的每個 TCP 數據包轉發到內部設備 XY ”。您需要查看路由器手冊以了解如何執行此操作,大多數路由器都有用於配置的 Web 界面。我希望這能消除你的困惑……

引用自:https://serverfault.com/questions/1076302