-m 옵션은 ping 명령에 영향을 주지 않습니다.

-m 옵션은 ping 명령에 영향을 주지 않습니다.

저는 Linux ping명령과 해당 옵션에 대해 배우고 있으며 -m나가는 패킷을 표시하는 옵션에 대해 읽고 있습니다. 수신 시 먼저 표시된 패킷 결과를 필터링할 수 있습니다.

패킷에 대한 태그를 설정하려고 하는데 다음과 같은 경고 메시지가 나타납니다.

$ 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

그렇다면 마킹이 실패하는 이유는 무엇입니까? 이 옵션을 사용하여 -m패킷을 어떻게 표시 할 수 있습니까?

답변1

짧은 답변:일반 사용자로는 할 수 없습니다.

긴 답변:패킷에 태그를 지정하려면 루트이거나 최소한 SO_MARK다음 기능을 갖춘 사용자여야 합니다(루트로 설정해야 함).

SO_MARK가 있음소켓(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.

이것코드 조각iputils의 ping_common.c는 이 이론을 확인합니다.

#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 태그의 목적:

설명대로매뉴얼 페이지:

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

호스트 2. 기본 정책을 변경 하고 호스트 1에서 10으로 표시된 특정 경로의 소스 IP에서만 패킷을 허용하도록 INPUT변경 합니다.DROP

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

이것은 이미 설명되었습니다.여기. 또한 tcpdump -nevvv -i <interface> src host <source_host>"icmp 패킷 도착"을 감지하는 데 충분하므로 라우팅 결정을 디버깅하는 데 더 적합합니다(두 호스트 사이에 둘 이상의 경로가 있는 경우).

관련 정보