Die Option -m funktioniert im Ping-Befehl nicht


7

Ich lernte den Linux- pingBefehl und seine Optionen und las über die -mOption, die zum Markieren des ausgehenden Pakets verwendet wird. Beim Empfang können wir zuerst das markierte Paketergebnis filtern.

Ich versuche, die Markierung für das Paket zu setzen, habe jedoch eine Warnmeldung erhalten:

$ 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

Warum wird es nicht markiert? Wie kann ich ein Paket mit der -mOption markieren ?


Hast du das als root versucht?
Vinz

Nein, ich hatte keine Root-Erlaubnis.

Welche Linux Distribution und Version?
fpmurphy

Linux ltsp64 3.2.0-33-generic # 52-Ubuntu SMP Do 18.10. 16:19:45 UTC 2012 i686 i686 i386 GNU / Linux

Antworten:


16

Kurze Antwort: Mit einem normalen Benutzer kann man nichts anfangen.

Lange Antwort: Um Pakete markieren zu können, müssen Sie ein Root-Benutzer oder zumindest ein Benutzer mit der SO_MARKFähigkeit sein (muss als Root festgelegt werden):

SO_MARK am Socket (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.

Der Code bei ping_common.c von iputils, der diese Theorie bestätigt:

#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

Um mehr über Fähigkeiten zu erfahren: Übersicht über die Fähigkeiten des Menschen (7) und die Fähigkeiten (7) .

Wenn Sie die Funktionen aller anderen Binärdateien des Systems weiter ausbauen möchten, ist dies eine gute Möglichkeit, sie zu prüfen. Umfasst die Kernel-Kompilierung, sodass sie möglicherweise nicht für die Produktionsumgebung geeignet ist.

Nützlichkeit der ICMP-Kennzeichnung:

Wie auf den Manpages beschrieben :

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

Und wie in einer Superuser- Frage erläutert , kann diese Funktion nützlich sein, wenn Sie eine Multilink- / Multiroute-Netzwerkumgebung prüfen, in der Sie erzwingen müssen, dass ein ICMP-Paket einen bestimmten "Fluss" durchläuft.

Praktisches Beispiel. Host 1:

$ ping -m 10 <host>

Host 2. Ändern Sie die Standardrichtlinie für INPUTto DROPund akzeptieren Sie Pakete nur von der Quell-IP der spezifischen Route, die auf Host 1 die Markierung 10 aufweist:

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

Dies wurde bereits erklärt hier . Auch hier wird es besser zum Debuggen von Routing-Entscheidungen verwendet (wenn Sie mehr als einen Pfad zwischen zwei Hosts haben), da a tcpdump -nevvv -i <interface> src host <source_host>mehr als genug ist, um nur die "Ankunft von ICMP-Paketen" zu prüfen.


Warum ist es nur für Root-Benutzer beschränkt?

1
Da es sich um eine Paketmarkierung handelt, handelt es sich also um eine Socket-Manipulation. Es ist ein Vektor für mögliche Angriffe, die alles ausnutzen könnten, was mit dem Netzwerkstapel und möglicherweise dem Kernel zusammenhängt. Aus diesem Grund haben Sie in den meisten Distributionen standardmäßig keine Berechtigung zum "Ping-Markieren", und Sie sollten dies nicht zulassen, es sei denn, Sie benötigen es aus einem bestimmten Grund.

wann ist es sinnvoll?

Wenn Sie einen Server an einen anderen pingen müssen und sich auf eine spezielle Markierung für das Debuggen "einigen" müssen. Eine andere Anwendung könnte das Multilink-Debug sein, bei dem Sie Ihre Links markieren und icmp über ein bestimmtes vlan / interface / adsl_link senden müssen.

Ich kann es nicht verstehen. Bitte geben Sie mir ein bisschen mehr Informationen?
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.