2010-03-15 13 views
6

Lo que tengo que hacer es ejecutar una aplicación Java que sea un servidor de servicio RESTful escrito por Restlet. Y este servicio será llamado por otra aplicación que se ejecute en Google App Engine.Apertura del puerto 80 con la aplicación Java en Ubuntu

Debido a la restricción de GAE, cada llamada http está limitada al puerto 80 y 443 (http y https) con la clase HttpUrlConnection. Como resultado, tengo que implementar mi aplicación del lado del servidor en el puerto 80 o 443.

Sin embargo, como la aplicación se está ejecutando en Ubuntu, y los puertos menores de 1024 no pueden ser accedidos por usuarios no root, se niega el acceso. se lanzará una excepción cuando ejecute mi aplicación.

Las soluciones que han entrado en mi mente incluye:

  1. Cambio de la política de seguridad del JRE, que es los archivos reside en /lib/security/java.policy, a grantjava.net.SocketPermission " * .80 "permiso de" escuchar, conectar, aceptar, resolver ". Sin embargo, ni usar la línea de comando para incluir este archivo ni anular el contenido en el archivo java.policy de JRE, la misma excepción sigue apareciendo.

  2. intento iniciar sesión como usuario root, sin embargo, debido a mi falta de familiaridad con Unix, no sé cómo hacerlo.

  3. otra solución que no he intentado es asignar todas las llamadas a 80 a un puerto superior como 1234, luego puedo implementar mi aplicación en 1234 sin problemas y GAE llamar solicitud de envío al puerto 80. Pero cómo conectar la brecha que falta sigue siendo un problema.

Actualmente estoy usando un método de la "piratería", que consiste en empaquetar la aplicación en un archivo JAR, y sudo ejecuta el archivo jar con privilegios de root. Funciona ahora, pero definitivamente no es apropiado en el entorno de implementación real.

Si alguien tiene alguna idea sobre la solución, ¡muchas gracias!

+0

En ubuntu puede iniciar sesión como root ejecutando 'sudo -i' que le dará una solución provisional, si no la ideal. –

+1

En realidad, los servicios que necesitan escuchar en puertos <1024 generalmente se inician como root al principio para obtener los permisos necesarios. Sin embargo, después de haber abierto los puertos, cambian su ID de usuario a una menos privilegiada haciendo algunas llamadas al sistema específicas de Unix. Java no es compatible ya que tiene que ser independiente de la plataforma. Sin embargo, hay algunas librerías de terceros que le darán acceso a la API del sistema Unix/Linux a costa de la portabilidad. Busque "POSIX" y "Java" si le interesa este tema. Reenviar con iptables, por supuesto, es la solución preferible y más simple. –

+0

@ the-banana-king Gracias por su consejo, y sí, es realmente útil, ya que nunca había pensado en hacer cosas de Java lib para manipular en sistemas Unix. –

Respuesta

2

Solución 1: no va a cambiar cualquier cosa, esto no es una limitación de Java, es el sistema operativo el que le impide utilizar números de puerto con privilegios (puertos inferiores a 1024).

Solución 2: No es una buena idea OMI, hay buenas razones para no ejecutar un proceso como root.

Solución 3: Utilice setcap o iptables. Ver this previous question.

1

Una solución mucho más fácil es configurar un proxy inverso en Apache httpd, que Ubuntu ejecutará para usted en el puerto 80 desde /etc/init.d.

También hay formas de llegar aquí con iptables, pero no tengo experiencia personal reciente. Tengo un proxy así funcionando ahora.

6

Puede usar iptables para redirigir el uso de algo como esto:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport http -j REDIRECT --to-ports 8080 

hacer permanentes los cambios (persistir después de reiniciar) con:

iptables-save 
Cuestiones relacionadas