-m não funciona no comando ping

7

Eu estava aprendendo o comando ping do Linux e suas opções, e li sobre a opção -m que é usada para marcar o pacote de saída. Ao receber, podemos filtrar primeiro o resultado do pacote marcado.

Estou tentando definir a marca do pacote, mas recebi uma mensagem de aviso:

$ ping -m 10 server
PING server (192.168.2.2) 56(84) bytes of data.
Warning: Failed to set mark 10
64 bytes from server (192.168.2.2): icmp_req=1 ttl=64 time=0.182 ms
64 bytes from server (192.168.2.2): icmp_req=2 ttl=64 time=0.201 ms

Então, por que não consegue marcar? Como posso marcar um pacote usando a opção -m ?

    
por terdon 04.05.2016 / 12:52

1 resposta

14

Resposta curta: Você não pode fazer com um usuário normal.

Resposta longa: Para marcar pacotes, você precisa ser um usuário root ou pelo menos um usuário com o recurso SO_MARK (precisa ser definido como root):

SO_MARK no soquete (7) :

   SO_MARK (since Linux 2.6.25)
          Set the mark for each packet sent through this socket (similar
          to the netfilter MARK target but socket-based).  Changing the
          mark can be used for mark-based routing without netfilter or
          for packet filtering.  Setting this option requires the
          CAP_NET_ADMIN capability.

O pedaço de código em ping_common.c de iputils que confirma esta teoria:

#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

Para saber mais sobre as capacidades: man capacidades (7) e capacidades (7 ) visão geral .

Se você quiser ir mais longe em recursos com todos os outros binários do sistema, isso é uma boa maneira de investigá-los. Envolve a compilação do kernel, portanto, pode não ser adequado para o ambiente de produção.

Utilidade de marcação ICMP:

Como está descrito em páginas de manual :

-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.

E, como explicado em uma pergunta superusuário , esse recurso pode ser útil ao sondar o ambiente de rede multilink / multiroute, onde você precisa forçar que um pacote ICMP passe por um "fluxo" específico.

Exemplo prático. Anfitrião 1:

$ ping -m 10 <host>

Host 2. Altere a política padrão de INPUT para DROP e aceite pacotes apenas do ip de origem da rota específica que possui a marca 10 no host 1:

# iptables -P INPUT DROP
# iptables -A INPUT -s <IP_SOURCE_MARK_10> -p icmp -j ACCEPT

Isso já foi explicado aqui . Novamente, ele será melhor usado para depurar decisões de roteamento (se você tiver mais de um caminho entre dois hosts), já que um tcpdump -nevvv -i <interface> src host <source_host> será mais que suficiente para apenas testar "chegada do pacote icmp".

    
por 04.05.2016 / 13:21

Tags