rtnetlink - Linux IPv4 ルーティングソケット
#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <sys/socket.h>
rtnetlink_socket = socket(AF_NETLINK, int socket_type, NETLINK_ROUTE);
rtnetlink はカーネルのルーティングテーブルを読んだり変更したり するためのものである。これはカーネルが内部のサブシステムと 通信するためにも用いられているが、それはここでは記述しない。 この man ページではユーザー空間のプログラムとの通信に関してのみ述べる。 ネットワーク経路・IP アドレス・リンクパラメーター・ 近傍設定 (neighbor setup)・キューイングルール (queueing dicipline)・ トラフィッククラス・パケットのクラス分類などが、すべて NETLINK_ROUTE ソケットを通して制御できる。 rtnetlink は netlink メッセージをベースにしている。詳細は netlink(7) を見ること。
rtnetlink メッセージには、初期ヘッダーの後に付加的な属性を 持つものがある。
struct rtattr {
unsigned short rta_len; /* Length of option */
unsigned short rta_type; /* Type of option */
/* Data follows */
};
これらの属性の操作は、 RTA_* マクロか libnetlink のみを使って行うべきである。 rtnetlink(3) を見よ。
rtnetlink は (標準的な netlink メッセージに加えて) 以下のメッセージタイプから構成される。
- RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK
- 指定したネットワークインターフェースの情報を、生成・削除・取得する。 これらのメッセージは ifinfomsg 構造体と、それに続いていくつかの rtattr 構造体を伴う。
-
struct ifinfomsg {
unsigned char ifi_family; /* AF_UNSPEC */
unsigned short ifi_type; /* Device type */
int ifi_index; /* Interface index */
unsigned int ifi_flags; /* Device flags */
unsigned int ifi_change; /* change mask */
};
- ifi_flags はデバイスのフラグである。 netdevice(7) を参照。 ifi_index は他と重ならないインターフェースの index である (Linux 3.7 以降では、 RTMGRP_LINK メッセージで 0 以外の値を指定することができ、そのため指定した ifindex でリンクを作成できる)。 ifi_change は将来の利用のために予約されており、常に 0xFFFFFFFF にセットすべきである。
| ルーティング属性 |
| rta_type | 値の型 | 説明 |
| IFLA_UNSPEC | - | 指定されていない |
| IFLA_ADDRESS | hardware address | インターフェース L2 アドレス |
| IFLA_BROADCAST | hardware address | L2 ブロードキャストアドレス |
| IFLA_IFNAME | asciiz string | デバイス名 |
| IFLA_MTU | unsigned int | デバイスの MTU |
| IFLA_LINK | int | リンクタイプ |
| IFLA_QDISC | asciiz string | キューイングのルール |
| IFLA_STATS | 下記参照 | インターフェースの統計 |
- IFLA_STATS の値の型は struct rtnl_link_stats (Linux 2.4 以前では struct net_device_stats) である。
- RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR
- インターフェースの IP アドレスの情報を追加・削除・取得する。 Linux 2.2 では、一つのインターフェースに複数の IP アドレスを 保持させることができ、これは 2.0 の別名デバイスの概念を置き換える。 Linux 2.2 では、これらのメッセージは IPv4 と IPv6 の両方のアドレスをサポートしている。 これらは ifaddrmsg 構造体を伴う。そのあとに rtattr ルーティング属性が続くこともある。
-
struct ifaddrmsg {
unsigned char ifa_family; /* Address type */
unsigned char ifa_prefixlen; /* Prefixlength of address */
unsigned char ifa_flags; /* Address flags */
unsigned char ifa_scope; /* Address scope */
unsigned int ifa_index; /* Interface index */
};
- ifa_family はアドレスファミリーのタイプである (現在は AF_INET または AF_INET6)。 ifa_prefixlen はアドレスのアドレスマスクの長さである (IPv4 のように、 そのファミリーで定義されている場合)。 ifa_scope はアドレスのスコープである。 ifa_index はアドレスが関連づけられているインターフェースの index である。 ifa_flags はフラグワードで、 二つめのアドレス (古い別名インターフェース) の場合は IFA_F_SECONDARY に、永続的なアドレスの場合は IFA_F_PERMANENT に適用される。ユーザーによってセットされるフラグと、 undocumented なフラグがある。
| 属性 |
| rta_type | 値の型 | 説明 |
| IFA_UNSPEC | - | 指定されていない |
| IFA_ADDRESS | raw protocol address | インターフェースアドレス |
| IFA_LOCAL | raw protocol address | ローカルアドレス |
| IFA_LABEL | asciiz string | インターフェースの名前 |
| IFA_BROADCAST | raw protocol address | ブロードキャストアドレス |
| IFA_ANYCAST | raw protocol address | anycast アドレス |
| IFA_CACHEINFO | struct ifa_cacheinfo | アドレス情報 |
- RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE
- ネットワーク経路の情報を生成・削除・取得する。 これらのメッセージは rtmsg 構造体を伴う。そのあとにいくつかの rtattr 構造体を続けることもできる。 RTM_GETROUTE で rtm_dst_len と rtm_src_len に 0 をセットすると、 指定されたルーティングテーブルの全てのエントリーを所得する。 rtm_table と rtm_protocol 以外の他のフィールドに 0 を入れると、ワイルドカードを意味する。
-
struct rtmsg {
unsigned char rtm_family; /* Address family of route */
unsigned char rtm_dst_len; /* Length of destination */
unsigned char rtm_src_len; /* Length of source */
unsigned char rtm_tos; /* TOS filter */
unsigned char rtm_table; /* Routing table ID;
see RTA_TABLE below */
unsigned char rtm_protocol; /* Routing protocol; see below */
unsigned char rtm_scope; /* See below */
unsigned char rtm_type; /* See below */
unsigned int rtm_flags;
};
| rtm_type | 経路のタイプ |
| RTN_UNSPEC | 未知の経路 |
| RTN_UNICAST | ゲートウェイまたはダイレクトな経路 |
| RTN_LOCAL | ローカルインターフェースの経路 |
| RTN_BROADCAST | ローカルなブロードキャスト経路 (ブロードキャストとして送信される) |
| RTN_ANYCAST | ローカルなブロードキャスト経路 (ユニキャストとして送信される) |
| RTN_MULTICAST | マルチキャスト経路 |
| RTN_BLACKHOLE | パケットを捨てる経路 |
| RTN_UNREACHABLE | 到達できない行き先 |
| RTN_PROHIBIT | パケットを拒否する経路 |
| RTN_THROW | 経路探索を別のテーブルで継続 |
| RTN_NAT | ネットワークアドレスの変換ルール |
| RTN_XRESOLVE | 外部レゾルバを参照 (実装されていない) |
| rtm_protocol | 経路の情報源 |
| RTPROT_UNSPEC | 不明 |
| RTPROT_REDIRECT | ICMP リダイレクトによる (現在は用いられない) |
| RTPROT_KERNEL | カーネルによる |
| RTPROT_BOOT | ブート時 |
| RTPROT_STATIC | 管理者による |
RTPROT_STATIC よりも大きな値はカーネルによって解釈されない。これは 単なるユーザーへの情報である。これらは経路情報の情報源を タグ付けしたり、複数のルーティングデーモンからの情報を 区別するために用いることができる。 既に割り当てられているルーティングデーモンの識別子については <linux/rtnetlink.h> を見よ。
- rtm_scope は行き先への距離である。
| RT_SCOPE_UNIVERSE | グローバルな経路 |
| RT_SCOPE_SITE | ローカルな自律システムにおける内部経路 |
| RT_SCOPE_LINK | このリンク上の経路 |
| RT_SCOPE_HOST | ローカルホスト上の経路 |
| RT_SCOPE_NOWHERE | 行き先が存在しない |
ユーザーは RT_SCOPE_UNIVERSE と RT_SCOPE_SITE の間の値を用いることができる。
- rtm_flags は以下の意味を持つ:
| RTM_F_NOTIFY | 経路が変更されると、 rtnetlink を通してユーザーに通知が行く。 |
| RTM_F_CLONED | 経路は他の経路によって複製された。 |
| RTM_F_EQUALIZE | マルチパスイコライザ (まだ実装されていない) |
rtm_table ではルーティングテーブルを指定する。
| RT_TABLE_UNSPEC | 指定されていないルーティングテーブル |
| RT_TABLE_DEFAULT | デフォルトのテーブル |
| RT_TABLE_MAIN | メインのテーブル |
| RT_TABLE_LOCAL | ローカルテーブル |
ユーザーは RT_TABLE_UNSPEC と RT_TABLE_DEFAULT. の間の任意の値を用いることができる。
| 属性 |
| rta_type | 値の型 | 説明 |
| RTA_UNSPEC | - | 無視される |
| RTA_DST | protocol address | 経路の行き先アドレス |
| RTA_SRC | protocol address | 経路の発信元アドレス |
| RTA_IIF | int | 入力インターフェースの index |
| RTA_OIF | int | 出力インターフェースの index |
| RTA_GATEWAY | protocol address | 経路のゲートウェイ |
| RTA_PRIORITY | int | 経路の優先度 |
| RTA_PREFSRC | protocol address | Preferred source address |
| RTA_METRICS | int | 経路のメトリック |
| RTA_MULTIPATH | | Multipath nexthop data br (see below). |
| RTA_PROTOINFO | | No longer used |
| RTA_FLOW | int | Route realm |
| RTA_CACHEINFO | struct rta_cacheinfo | (linux/rtnetlink.h 参照) |
| RTA_SESSION | | No longer used |
| RTA_MP_ALGO | | No longer used |
| RTA_TABLE | int | Routing table ID; if set, rtm_table is ignored |
| RTA_MARK | int |
| RTA_MFC_STATS | struct rta_mfc_stats | (linux/rtnetlink.h 参照) |
| RTA_VIA | struct rtvia | Gateway in different AF (see below) |
| RTA_NEWDST | protocol address | パケットの経路の行き先アドレスを変更する |
| RTA_PREF | char | RFC4191 IPv6 router preference (see below) |
| RTA_ENCAP_TYPE | short | Encapsulation type for lwtunnels (下記参照) |
| RTA_ENCAP | | Defined by RTA_ENCAP_TYPE |
| RTA_EXPIRES | int | Expire time for IPv6 routes (in seconds) |
- RTA_MULTIPATH contains several packed instances of struct rtnexthop together with nested RTAs (RTA_GATEWAY):
-
struct rtnexthop {
unsigned short rtnh_len; /* Length of struct + length
of RTAs */
unsigned char rtnh_flags; /* Flags (see
linux/rtnetlink.h) */
unsigned char rtnh_hops; /* Nexthop priority */
int rtnh_ifindex; /* Interface index for this
nexthop */
}
- There exist a bunch of RTNH_* macros similar to RTA_* and NLHDR_* macros useful to handle these structures.
-
struct rtvia {
unsigned short rtvia_family;
unsigned char rtvia_addr[0];
};
- rtvia_addr is the address, rtvia_family is its family type.
- RTA_PREF may contain values ICMPV6_ROUTER_PREF_LOW, ICMPV6_ROUTER_PREF_MEDIUM, and ICMPV6_ROUTER_PREF_HIGH defined incw <linux/icmpv6.h>.
- RTA_ENCAP_TYPE may contain values LWTUNNEL_ENCAP_MPLS, LWTUNNEL_ENCAP_IP, LWTUNNEL_ENCAP_ILA, or LWTUNNEL_ENCAP_IP6 defined in <linux/lwtunnel.h>.
- (これらの値を埋めること!)
- RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH
- 近傍テーブル (neighbor table) のエントリー (例えば ARP エントリー) の情報を追加・削除・取得する。 このメッセージは ndmsg 構造体を伴う。
-
struct ndmsg {
unsigned char ndm_family;
int ndm_ifindex; /* Interface index */
__u16 ndm_state; /* State */
__u8 ndm_flags; /* Flags */
__u8 ndm_type;
};
struct nda_cacheinfo {
__u32 ndm_confirmed;
__u32 ndm_used;
__u32 ndm_updated;
__u32 ndm_refcnt;
};
- ndm_state は以下の状態のビットマスクである:
| NUD_INCOMPLETE | 現在レゾルブ中のキャッシュエントリー |
| NUD_REACHABLE | 動作確認済みのキャッシュエントリー |
| NUD_STALE | 期限切れのキャッシュエントリー |
| NUD_DELAY | タイマー待ちのキャッシュエントリー |
| NUD_PROBE | 再確認中のキャッシュエントリー |
| NUD_FAILED | 不正なキャッシュエントリー |
| NUD_NOARP | 行き先キャッシュのないデバイス |
| NUD_PERMANENT | 静的なエントリー |
有効な ndm_flags は以下の通り:
| NTF_PROXY | プロクシ arp エントリー |
| NTF_ROUTER | IPv6 ルータ |
rtattr 構造体は、 rta_type フィールドに応じてそれぞれ以下の意味を持つ:
| NDA_UNSPEC | 未知のタイプ |
| NDA_DST | 近傍キャッシュネットワーク層の行き先アドレス |
| NDA_LLADDR | 近傍キャッシュリンク層のアドレス |
| NDA_CACHEINFO | キャッシュの統計 |
rta_type フィールドが NDA_CACHEINFO の場合には、 struct nda_cacheinfo ヘッダーが続く。
- RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE
- ルーティングルールを追加・削除・取得する。 struct rtmsg を伴う。
- RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC
- キューイングルールを追加・削除・取得する。 このメッセージは struct tcmsg を伴い、またそのあとに属性がいくつか続くこともある。
-
struct tcmsg {
unsigned char tcm_family;
int tcm_ifindex; /* interface index */
__u32 tcm_handle; /* Qdisc handle */
__u32 tcm_parent; /* Parent qdisc */
__u32 tcm_info;
};
| 属性 |
| rta_type | 値の型 | 説明 |
| TCA_UNSPEC | - | 指定されていない |
| TCA_KIND | asciiz string | キューイングルールの名前 |
| TCA_OPTIONS | byte sequence | Qdisc 特有のオプションが続く |
| TCA_STATS | struct tc_stats | Qdisc の統計 |
| TCA_XSTATS | qdisc-specific | モジュール特有の統計 |
| TCA_RATE | struct tc_estimator | レート制限 |
さらに、 qdisc モジュール特有の様々な属性を指定できる。 詳細な情報は適切なインクルードファイルを見よ。
- RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS
- トラフィッククラスを追加・削除・取得する。 これらのメッセージは、上述の struct tcmsg を伴う。
- RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER
- トラフィックフィルターの情報を追加・削除・取得する。 これらのメッセージは、上述の struct tcmsg を伴う。
rtnetlink は Linux 2.2 の新機能である。
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。