为什么前1024个端口仅限于root用户?
绑定是服务器端套接字不可或缺的步骤。这就像为最终用户(服务器)提供一些地址。因此,我们为运行服务器分配了IP地址和端口号。但是我们不能向服务器提供任何随机端口号。端口号1到1023仅限于root用户,并且我们不能在没有root访问权限的情况下分配这些端口。
此限制背后的原因是,大多数主要网络服务(例如HTTP,FTP,SSH,Telnet,POP等)都在此范围内运行。因此,如果允许任何人在这些端口上运行,则可能会出现以下情况:
- 不受信任的用户可以运行在这些端口上侦听登录(访问)详细信息的程序。
- 不受信任的用户可以运行未经授权的服务器应用程序。
下面的程序验证了以下事实:从1到1023的端口号被限制用于root用户访问。
我们使用bind()函数,成功时返回0,失败时返回-1。我们在循环中为不同的端口号调用bind,直到返回0。
// Server side C program to demonstrate
// that we can not assign port number less
// than 1024 without root access
#include
#include
int main()
{
int server = socket(AF_INET, SOCK_STREAM, 0);
if (server < 0)
printf("Error in server creating\n");
else
printf("Server Created\n");
struct sockaddr_in my_addr, peer_addr;
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = INADDR_ANY;
my_addr.sin_addr.s_addr = inet_addr("10.32.40.213");
int b = 1, i = 0;
while (b)
{
i++;
// Assigning every port number starting
// from one to check
// if it is able to bind properly or not
my_addr.sin_port = htons(i);
// On correct binding, it return 0
// and so 0 in b will terminate loop
b = bind(server, (struct sockaddr*) &my_addr,
sizeof(my_addr));
}
printf("Binded Correctly on port number %d\n", i);
}
输出:
Server Created
Binded Correctly on port number 1024
如何允许非root用户访问绑定到端口号1024以下?
但是有两种方法可以分配不具有root特权的小于1024的端口号:
- 方法1 :使用CAP_NET_BIND_SERVICE授予对进程的低编号端口访问权限:
为此,我们只需要在终端运行以下命令:sudo setcap CAP_NET_BIND_SERVICE=+eip /path/to/binary
- 方法2 :使用authbind授予一次性访问权限,并具有更好的用户/组/端口控制。让我们必须分配端口号80。为此,需要执行以下步骤:
- 使用任何程序包管理器安装authbind
- 在终端中一个接一个地运行以下两个命令:
sudo touch /etc/authbind/byport/80 sudo chmod 777 /etc/authbind/byport/80
在这里,80是命令的尽头,因为我们正试图分配端口号80给出。
- 现在在终端中执行以下命令
authbind --deep /path/to/binary command line args
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。