Краткий ответ: С обычным пользователем не обойтись.
Длинный ответ: Чтобы иметь возможность маркировать пакеты, вы должны быть пользователем root или, по крайней мере, пользователем с возможностью SO_MARK
(необходимо установить как root):
SO_MARK в socket (7) :
SO_MARK (начиная с Linux 2.6.25) Установите метку для каждого пакета, отправляемого через этот сокет (аналогично сетевому фильтру Цель MARK, но на основе сокетов). Изменение метки можно использовать для маршрутизации на основе меток без netfilter или для фильтрации пакетов. Для установки этого параметра требуется возможность CAP_NET_ADMIN.
Фрагмент кода в ping_common.c от iputils, который подтверждает эту теорию:
#ifdef SO_MARK
if (options & F_MARK) {
int ret;
enable_capability_admin();
ret = setsockopt(sock->fd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark));
disable_capability_admin();
if (ret == -1) {
/* we probably dont wanna exit since old kernels
* dont support mark ..
*/
fprintf(stderr, "Warning: Failed to set mark %d\n", mark);
}
}
#endif
Чтобы узнать больше о возможностях : man возможности (7) и возможности (7) обзор .
Если вы хотите расширить возможности всех других двоичных файлов системы, это хороший способ их проверить. Включает компиляцию ядра, поэтому он не может быть подходящим для производственной среды.
Полезность маркировки ICMP:
Как описано на manpages :
-m mark
use mark to tag the packets going out. This is useful for variety of reasons
within the kernel such as using policy routing to select specific outbound processing.
И как объясняется в вопросе суперпользователя , эта функция может быть полезна при проверке многоканального / многоуровневого сетевая среда, в которой вам нужно заставить ICMP-пакет проходить через один определенный «поток».
Практический пример. Хост 1:
$ ping -m 10
Хост 2. Измените политику по умолчанию INPUT
на DROP
и принимайте пакеты только от исходного IP-адреса определенного маршрута, имеющего отметку 10 на хосте 1:
# iptables -P INPUT DROP
# iptables -A INPUT -s -p icmp -j ACCEPT
Это уже объяснялось здесь .Опять же, его лучше использовать для отладки решений о маршрутизации (если у вас более одного пути между двумя хостами), поскольку tcpdump -nevvv -i
будет более чем достаточно просто проверить "прибытие пакета icmp".