我想将 UDP 端口范围限制到单个应用程序(或用户)。我想要实现的不仅仅是阻止bind()
其他 uid,还要从可以自动分配的池中删除该范围。
例如,如果有人尝试明确绑定 12345,但未运行指定的应用程序,他们应该获得 EPERM。如果有人尝试绑定未指定的端口,他们永远不应尝试随机绑定 12345。
有没有什么系统可以帮到你?我试过浏览 apparmor / selinux 文档,但它们似乎只做了阻止部分。
答案1
在 Linux 上执行此操作的最简单方法是保留标准临时端口范围的顶部或底部范围内的一块。
通过运行来了解你当前的范围
cat /proc/sys/net/ipv4/ip_local_port_range
然后通过向其中回显不同的内容来设置它(并修改 sysctl.conf 或类似文件以使其在启动时也发生)。我的系统使用 32768-61000,因此我可以将其更改为 32768-60000 并结合 SELinux/AppArmor 为我的应用程序保留 60001-61000。
echo "32768 60000" > /proc/sys/net/ipv4/ip_local_port_range
我不知道如何在这个短暂范围的中间开辟出一个空隙。
答案2
看一下 portreserve 实用程序。但实际服务必须先请求 portreserve 释放端口,然后服务才能使用它。
答案3
安装波特雷泽夫然后只有通过 portrelease 请求它们的程序才能拥有套接字。