在Ubuntu上用Java应用程序打开端口80

在Ubuntu上用Java应用程序打开端口80,java,ubuntu,port,Java,Ubuntu,Port,我需要做的是运行一个Java应用程序,它是Restlet编写的RESTful服务服务器端。这项服务将被运行在谷歌应用程序引擎上的另一个应用程序调用 由于GAE的限制,每个http调用都被限制在HttpUrlConnection类的端口80和443(http和https)。因此,我必须在端口80或443上部署服务器端应用程序 但是,由于该应用程序在Ubuntu上运行,并且非root用户无法访问1024以下的端口,因此在运行应用程序时将引发拒绝访问异常 我想到的解决方案包括: 将JRE的安全策略(文

我需要做的是运行一个Java应用程序,它是Restlet编写的RESTful服务服务器端。这项服务将被运行在谷歌应用程序引擎上的另一个应用程序调用

由于GAE的限制,每个http调用都被限制在HttpUrlConnection类的端口80和443(http和https)。因此,我必须在端口80或443上部署服务器端应用程序

但是,由于该应用程序在Ubuntu上运行,并且非root用户无法访问1024以下的端口,因此在运行应用程序时将引发拒绝访问异常

我想到的解决方案包括:

  • 将JRE的安全策略(文件位于/lib/security/java.policy中)更改为grantjava.net.SocketPermission“*.80”“侦听、连接、接受、解析”权限。但是,无论是使用命令行包含此文件还是覆盖JRE的java.policy文件中的内容,都会出现相同的异常

  • 尝试以root用户身份登录,但是由于我对Unix不熟悉,我不知道怎么做

  • 我还没有尝试过的另一个解决方案是将所有呼叫映射到80到更高的端口(如1234),然后我可以毫无问题地在1234上部署我的应用程序,并将GAE call发送请求映射到80端口。但如何连接缺失的缺口仍然是一个问题

  • 目前我正在使用一种“黑客”方法,即将应用程序打包到一个jar文件中,sudo使用root权限运行jar文件。它现在可以工作,但在实际部署环境中肯定不合适


    因此,如果有人对解决方案有任何想法,非常感谢

    一个更简单的解决方案是在ApacheHttpd中设置一个反向代理,Ubuntu将在端口80上从/etc/init.d运行该代理


    使用iptables也有很多方法,但我最近没有个人经验。我现在正在运行这样一个代理。

    您可以使用iptables来重定向,如下所示:

    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport http -j REDIRECT --to-ports 8080
    
    使用以下命令使更改永久化(重新启动后保持):


    解决方案1:它不会改变任何东西,这不是Java的限制,是操作系统阻止您使用特权端口号(低于1024的端口)

    解决方案2:在我看来,这不是一个好主意,有很好的理由不以root用户身份运行进程


    解决方案3:使用
    setcap
    iptables
    。请参阅。

    在ubuntu上,您可以通过运行
    sudo-i
    以root用户身份登录,这将为您提供一个临时(如果不是理想的)解决方案。实际上,需要侦听端口<1024的服务通常首先以root用户身份启动,以获得必要的权限。但是,在打开端口后,他们通过执行一些特定于Unix的系统调用,将其用户ID更改为权限较低的用户ID。Java不支持这一点,因为它必须独立于平台。然而,有一些第三方libs可以让您以可移植性为代价访问Unix/Linux系统API。如果您对本主题感兴趣,请查找“POSIX”和“Java”。当然,使用iptables转发是最好的也是最简单的解决方案。@banana king感谢您的提示,是的,这真的很有帮助,因为我从未想过在unix系统上使用Java lib进行操作。参考
    iptables-save