如何在Linux上以普通用户身份在端口80上运行服务器?

我已经搜索了很长一段时间,但找不到它.

我在Ubuntu Linux上并希望在端口80上运行服务器,但由于Ubuntu的安全机制,我收到以下错误:

java.net.BindException: Permission denied:80

我认为应该很简单,要么禁用这种安全机制,以便所有用户都可以使用端口80,或者为当前用户分配所需的权限以访问端口80.

解决方法

简答:你不能.低于1024的端口只能由root打开.根据评论 – 好吧,你可以使用 CAP_NET_BIND_SERVICE,但是这种应用于java bin的方法将使得任何java程序都可以使用此设置运行,如果不是安全风险,这是不可取的.

答案很长:您可以将端口80上的连接重定向到您可以作为普通用户打开的其他端口.

以root身份运行:

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

由于环回设备(如localhost)不使用预先路由规则,如果需要使用localhost等,也可以添加此规则(thanks @Francesco):

# iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-ports 8080

注意:上述解决方案不适合多用户系统,因为任何用户都可以打开端口8080(或您决定使用的任何其他高端口),从而拦截流量. (致CesarB).

编辑:根据评论问题 – 删除上述规则:

# iptables -t nat --line-numbers -n -L

这将输出如下内容:

Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 redir ports 8088
2    REDIRECT   tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:80 redir ports 8080

你感兴趣的规则是nr. 2,所以删除它:

# iptables -t nat -D PREROUTING 2

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...