-m オプションは ping コマンドには影響しません。

-m オプションは ping コマンドには影響しません。

私はLinuxpingコマンドとそのオプションについて学び、発信-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

短い答え:一般ユーザーではできません。

長い答え:パケットにタグを付けるには、rootまたは少なくともSO_MARK次の機能を持つユーザーでなければなりません(rootに設定する必要があります)。

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パケット到着」を検出するのに十分なので、ルーティング決定をデバッグするのに適しています(2つのホスト間に複数のパスがある場合)。

関連情報