NETLINK IPCメカニズムに基づくプロセス間通信デバッグ

1701 ワード

NETLINKベースのアプリケーションでは、アプリケーションとカーネル間の通信のコマンドとイベントを表示する方法が必要です.
現在、カーネルはnetlinkモニタリングのカーネルモジュールを実現しており、このカーネルモジュールに基づいて、従来のネットワークプロトコルキャプチャ方式を使用してNETLINK関連のコマンドとイベントを取得することができます.
1)カーネルNETLINKモニタ機能を開く
 CONFIG_NLMON=m//モジュールで開く
2)ipコマンドを使用してnlmonネットワークポートを作成する
  #ip link add nlmon0 type nlmon
  #ip link set nlmon0 up
3)tcpdumpを使用して、アプリケーションのインタラクティブシーン間で発生するNETLINKベースのメッセージのキャプチャを開始する
tcpdump -i nlmon0 -w/path/to/writable/folder/netlinkMsg.pcap 
4)テストが完了し、wiresharkツールを使用してpcapパッケージを開くと、
5)現在の問題
a)カーネルデフォルトモジュールはnetlinkメッセージカテゴリを制限しており、現在は以下のように簡単にこの関数を修正することができ、
tcpdumpはnetlinkタイプのメッセージをすべてキャプチャできます
static bool netlink_filter_tap(const struct sk_buff *skb)
{
	struct sock *sk = skb->sk;

	/* We take the more conservative approach and
	 * whitelist socket protocols that may pass.
	 */
	switch (sk->sk_protocol) {
	case NETLINK_ROUTE:
	case NETLINK_USERSOCK:
	case NETLINK_SOCK_DIAG:
	case NETLINK_NFLOG:
	case NETLINK_XFRM:
	case NETLINK_FIB_LOOKUP:
	case NETLINK_NETFILTER:
	case NETLINK_GENERIC:
		return true;
	}

	return false;

簡単な変更は次のとおりです.
static bool netlink_filter_tap(const struct sk_buff *skb)
{     //let all netlink type msg pass
	return true;
}

b)wiresharkのデフォルトのnetlinkプロトコル解析器のサポートが不十分で、現在NETLINK_のみをサポートしている.ROUTE,NETLINK_GENERIC,NETLINK_SOCK_DIAGはいくつかありますが、解析器のサポートが不十分で、コマンドと内容をよく見ることができません.
例えばnl 80211に対して、簡単な基本コマンドしか解析できません.ハイパスプラットフォーム、WLAN関連には大量のVENDORコマンドとイベントがユーザープロセスとカーネルWLANで駆動されています.wiresharkの解析器を拡張する必要があります.