Linux:network:socket:ip_unprivileged_port_start CAP_NET_BIND_SERVICE; errno 13

234 篇文章 ¥59.90 ¥99.00
Linux系统中,低于ip_unprivileged_port_start(默认1024)的端口被视为特权端口,需要root权限或CAP_NET_BIND_SERVICE能力才能绑定。若要让非root应用绑定这些端口,可通过setcap赋予相应能力。当bind到如443端口失败时,可能与此限制有关。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ip_unprivileged_port_start - INTEGER
这个参数定义了,从哪一个port开始是非特权可以使用的port。而特权的port,需要root用户使用,或者需要权限:CAP_NET_BIND_SERVICE 。如果设置为0,就是没有特权port。
This is a per-namespace sysctl. It defines the first unprivileged port in the network namespace. Privileged ports require root or CAP_NET_BIND_SERVICE in order to bind to them. To disable all privileged ports, set this to 0. It may not overlap with the ip_local_reserved_ports range.
默认值: 1024

使用的代码:

int __inet_bind(struct sock *sk, 
### 解决TCP端口绑定错误 当遇到TCP端口绑定错误(`only one usage of each socket address`),通常是因为尝试在同一地址和端口号上创建多个监听套接字。这违反了TCP协议的规定,即每个套接字地址(IP地址加端口号)在同一时间只能被一个进程占用。 #### 原因分析 1. **TIME-WAIT状态**:即使应用程序认为连接已经关闭,在内核层面,该连接可能仍处于TIME-WAIT状态。这意味着虽然从应用层看似乎可以重用此端口,但实际上直到TIME-WAIT计时期满之前都不能这样做[^2]。 2. **特权端口限制**:如果使用的端口号小于ip_unprivileged_port_start,则需要root权限或CAP_NET_BIND_SERVICE能力才能成功绑定到这些端口。可以通过调整sysctl参数来改变这一行为[^1]。 #### 解决策略 为了防止此类问题的发生并找到解决方案: - 使用SO_REUSEADDR选项可以让新的服务器立即接管旧的服务位置而无需等待自然超时结束。需要注意的是,这种方法可能会带来一些风险,比如潜在的安全隐患以及处理未完全终止的连接数据包的能力减弱等问题。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> int main() { int server_fd; struct sockaddr_in address; // 创建socket文件描述符 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("Socket creation failed"); exit(EXIT_FAILURE); } int opt = 1; // 设置SO_REUSEADDR标志位 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("Setsockopt failed"); close(server_fd); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(8080); // 绑定socket至指定地址与端口 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) { perror("Bind failed"); close(server_fd); exit(EXIT_FAILURE); } printf("Server started\n"); listen(server_fd, 3); while(1){ accept(server_fd, NULL ,NULL ); } return 0; } ``` 上述代码展示了如何通过设置`SO_REUSEADDR`选项允许快速重启服务而不必担心TIME_WAIT状态下残留连接的影响。 #### 配置系统参数 对于特权端口的问题,可以根据实际情况考虑修改系统的配置项`ip_unprivileged_port_start`以适应特定需求。例如将其设为较低值甚至零从而取消所有特权端口的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mzhan017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值