【Linux】Linux普通用户启动的进程如何绑定1024以下的端口


问题

  • 在Linux中,1024以下端口被称为privileged port,即特权端口。特权端口只能被由root启动的进程监听,该问题常出现在nginx非root启动的场景下(web需要80端口,而非root启动nginx后nginx无法bind 80端口)

解决方法

  • 为特定可执行文件赋予绑定特定端口的权限(执行一次永久生效)

    ```

    setcap 'cap_net_bind_service=+ep' /path/to/program

    ```

  • 取消可执行文件绑定端口的权限

    ```

    setcap -r /path/to/program

    ```

注意

  • 要使用setcap,你的内核版本必须大于 2.6.24
  • 如果目标文件是一个脚本,这样做是不行的(执行bind和listen的实际上是脚本解释器)
  • 如果你为一个程序设置了这种权限,那么LD_LIBRARY_PATH对该程序将会失效,如果你的程序依赖它来找到所需要的库,那么你可以考虑使用端口转发了。