Linux下非Root用户不能绑定1024以下端口,报错:没有权限绑定该端口

非Root用户不能绑定1024以下端口,报错:没有权限绑定该端口

问题描述:
之前程序一直用root开发验证,今天使用普通用户突然发现绑定端口报错,无权限

问题分析:
在Linux下,默认端口1024下的是要在root下才能使用的,在其他用户下,如果尝试使用将会报错。

解决方案:

  1. 改端口把 改到1024以上,方便一些! 想想为什么默认有这个限制? 推荐此方法~
  2. 映射到端口
    让程序运行在非root帐户下,并绑定高于1024的端口,在确保能正常工作的时候,将低端口通过端口转发,将低端口转到高端口,从而实现非root运行的程序绑定低端口。
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

第一步使用sysctl确保启用IP FORWARD功能(此功能在Red Hat/CentOS默认是被禁用的),注意,代码中使用的sysctl设置是临时性设置,重启之后将会被重置,如果要长久保存,需要在/etc/sysctl.conf文件内修改:

# Default value is 0, need change to 1.
# net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1

然后从文件中加载新的配置

# load new sysctl.conf
sysctl -p /etc/sysctl.conf
 
# or sysctl -p
# default filename is /etc/sysctl.conf

第二步就是使用iptables的规则来实现端口转发到程序所在的端口,示例中我们要将80端口转发到8088。
此种方法能够比较好的达到我们的目的,我们的程序可以通过非root用户来运行,并能够对外提供低端口号的服务。

  1. SetUID
    为用户的应用程序在执行位设置user ID能够使程序可以有root权限来运行,这个方法让程序能够像在root下运行有同样的效果,不过需要非常小心,这种方法同样会带来安全风险,特别是当要执行的程序本身存在安全风险。使用的方法是:
chown root.root /path/to/application
#使用SetUID
chmod u+s /path/to/application

我们可以看到在系统下,/usr/bin/passwd这种文件,就使用了SetUID,使得每个系统能的用户都能用passwd来修改密码——这是要修改/etc/passwd的文件(而这个只有root有权限)。

既然要使用非root用户运行程序,目的就是要降低程序本身给系统带来的安全风险,因此,本方法使用的时候需要特别谨慎。

猜你喜欢

转载自blog.csdn.net/inthat/article/details/127393186