Firewall

帶有 Apple 伺服器管理員的 mac 伺服器上的 java http 服務

  • August 13, 2013

我編寫了一個在非伺服器 mac 上執行的簡單 com.sun.net.httpserver.HttpServer 程序。當我http://localhost:39600/test在網路瀏覽器中訪問時,它給了我正確的響應:“這是我的響應!”。

然後我將這個 java 文件移動到由 Server Admin 管理的網路伺服器 Mac OS X Snow Leopard,編譯它,在埠 39600 上執行它,http://localhost:39600/test在網路伺服器的網際網路瀏覽器中訪問。它給出了正確的響應。但是當我訪問http://webserveraddress:39600/test它時,它根本沒有反應。我知道這可能與伺服器管理員和防火牆有關,但是如何通過伺服器管理員向外部請求開放埠 39600?

這是簡單的標準 java 類,但我認為這更多是伺服器管理的問題。

package server;

import java.io.*;
import java.net.*;
import com.sun.net.httpserver.*;

public class Server {

   private static final int SERVER_PORT_NUMBER = 39600;
   private static final int MAX_WAITING_CONNECTIONS = 10;

   public static void main(String[] args) {
       new Server().run();
   }

   private Server(){
   }

   private HttpServer server;

   private void run(){
       configure();
       server.createContext("/test", testHandler);
       server.start();
   }

   private HttpHandler testHandler = new HttpHandler(){

       @Override
       public void handle(HttpExchange t) throws IOException {
           //TODO read request body

           t.sendResponseHeaders(200, 0);  //all ok!
           OutputStream os = t.getResponseBody();
           os.write("Here's my response!".getBytes());
           os.close();
       }

   };

   private void configure(){
       try {
           server = HttpServer.create(new InetSocketAddress(SERVER_PORT_NUMBER),
                   MAX_WAITING_CONNECTIONS);
       } 
       catch (IOException e) {
           System.out.println("Could not create HTTP server: " + e.getMessage());
           e.printStackTrace();
           return;
       }

       server.setExecutor(null); // use the default executor
   }
}

事實證明,Server Admin 不管理特定埠。Snow Leopard 防火牆的 GUI 只允許您打開特定的應用程序(以及它們相關的埠號)。要打開特定埠,您必須深入到終端並輸入00001 和 65535 之間的sudo ipfw add <rulenumber> allow tcp from any to any dst-port <portnum>位置,並且也是(有保留的埠號……你可以看到哪些是.<rulenumber>``<portnum>``sudo ipfw list

這很可能是由路由器上的關閉埠引起的,儘管它可能是 Web 伺服器上的防火牆。您需要在路由器上為伺服器網路打開埠 39600 - 這稱為埠轉發。

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