Вопрос или проблема
Недавно (возможно, из-за обновления, но не из-за перезагрузки) моя система перестала позволять мне пинговать другие хосты, хотя root может это делать без проблем. Она выдает информативное сообщение об ошибке, но оно оказалось недостаточно информативным для меня:
$ ping 1.1.1.1
ping: socktype: SOCK_RAW
ping: socket: Operation not permitted
ping: => missing cap_net_raw+p capability or setuid?
$ sudo ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=59 time=31.9 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=59 time=28.6 ms
^C
--- 1.1.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 28.552/30.231/31.911/1.679 ms
$ ping -V
ping from iputils 20240905
libcap: yes, IDN: yes, NLS: no, error.h: yes, getrandom(): yes, __fpending(): yes
Как это исправить?
Проблема заключалась прямо в сообщении об ошибке, хотя решение не было явным. Мне пришлось немного поискать, чтобы найти команду, необходимую для повторного включения использования ping обычными пользователями.
Ошибка “missing cap_net_raw+p capability or setuid” указывает на два решения: новый метод “возможности файлов” (см. man setcap
) и старый метод setuid
, которого я старался избегать.
Чтобы установить эту возможность файла, просто выполните sudo setcap cap_net_raw+p /usr/bin/ping
$ ping 1.1.1.1
ping: socktype: SOCK_RAW
ping: socket: Operation not permitted
ping: => missing cap_net_raw+p capability or setuid?
$ which ping
/usr/bin/ping
$ getcap /usr/bin/ping
$ sudo setcap cap_net_raw+p /usr/bin/ping
$ getcap /usr/bin/ping
/usr/bin/ping cap_net_raw=p
$ ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=59 time=32.6 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=59 time=28.2 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=59 time=31.5 ms
^C
--- 1.1.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 28.218/30.783/32.632/1.871 ms
$
Ответ или решение
Если система перестала пинговать другие хосты, кроме как от имени пользователя root
, и выдаёт сообщение "Operation not permitted", вы столкнулись с проблемой, связанной с отсутствием необходимых прав для операции сетевого уровня ICMP. Ошибка "missing cap_net_raw+p capability or setuid" указывает на необходимость либо установления соответствующих файловых возможностей (file capabilities), либо использования привилегий setuid
.
Ваш случай, судя по всему, был вызван недавним обновлением системы. Ваша система использует "ping" из пакета iputils версии 20240905, который поддерживает использование libcap для управления правами на выполнение сетевых операций.
Как решить проблему
-
Проверка текущих возможностей:
Убедитесь, что у программы нет установленных возможностей:$ getcap /usr/bin/ping
-
Установление необходимых прав:
Чтобы обычные пользователи могли выполнять командуping
, задайте для программы необходимые права:$ sudo setcap cap_net_raw+p /usr/bin/ping
-
Проверка установленных возможностей:
Убедитесь, что права установлены успешно:$ getcap /usr/bin/ping /usr/bin/ping cap_net_raw=p
Поддержка и расширение
Этот подход позволяет избежать более агрессивного метода с использованием setuid
, что может повлечь за собой дополнительные риски безопасности. Установка соответствующих файловых возможностей позволяет более точно регулировать доступ к программам и их функциональности. Данный метод считается более современным и безопасным.
Заключение
Следуя вышеописанным шагам, вы должны восстановить способность обычных пользователей выполнять команду ping
без привилегий root
. Это обеспечит более гибкое и безопасное управление правами доступа в вашей системе. Позаботьтесь о том, чтобы регулярные обновления системы не изменили настроек, или настройте мониторинг для подобных изменений.