Я хотел бы ограничить диапазон портов udp одним приложением (или пользователем). Я бы хотел не просто блокировать bind()
из других uid, но также удалите диапазон из пула, который может быть назначен автоматически.
Например, если кто-то пытается явно привязать 12345, но не запускает указанное приложение, он должен получить EPERM. Если кто-то пытается привязать неуказанный порт, он никогда не должен пытаться привязать 12345 случайным образом.
Есть ли здесь какая-то система, которая может помочь? Я пробовал просматривать документы apparmor / selinux, но они, похоже, выполняют только блокировку.
Самый простой способ сделать это в 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
Я не знаю способа вырезать брешь в середине эфемерного диапазона.
Установить Portreserve и тогда только ваша программа, которая запрашивает их через portrelease, может иметь сокеты.
Взгляните на утилиту portreserve. Но реальная служба должна попросить portreserve освободить порт, прежде чем служба сможет его использовать.