在Ubuntu上用Java应用程序打开端口80
我需要做的是运行一个Java应用程序,它是Restlet编写的RESTful服务服务器端。这项服务将被运行在谷歌应用程序引擎上的另一个应用程序调用 由于GAE的限制,每个http调用都被限制在HttpUrlConnection类的端口80和443(http和https)。因此,我必须在端口80或443上部署服务器端应用程序 但是,由于该应用程序在Ubuntu上运行,并且非root用户无法访问1024以下的端口,因此在运行应用程序时将引发拒绝访问异常 我想到的解决方案包括:在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的安全策略(文
因此,如果有人对解决方案有任何想法,非常感谢 一个更简单的解决方案是在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