Security
如何從外部區域網路訪問 Jetty Server?
我最初在 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 界面。我希望這能消除你的困惑……