📌  相关文章
📜  如何以非root用户访问权限绑定到小于1024的端口号?

📅  最后修改于: 2021-05-26 01:58:06             🧑  作者: Mango

为什么前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. 方法1 :使用CAP_NET_BIND_SERVICE授予对进程的低编号端口访问权限:
    为此,我们只需要在终端运行以下命令:
    sudo setcap CAP_NET_BIND_SERVICE=+eip /path/to/binary
  2. 方法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基础课程》。