私は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つのホスト間に複数のパスがある場合)。