Netlink

**Netlink 通訊端家族**（英語：Netlink socket family）是一組 Linux 核心介面（Linux kernel interfaces），可用於行程間通訊，Linux 核心與使用者空間的行程間、使用者行程間的通訊。然而它並不像網路通訊端可以用於主機間通訊，Netlink 只能用於同一主機上行程通訊，並通過 PID 來標識它們。

Netlink 被設計為在 Linux 核心與使用者空間行程傳送各種網路資訊。網路工具 iproute2 利用
Netlink 從使用者空間與核心進行通訊。Netlink 由一個在使用者空間的標準的 Socket 介面和核心模組
提供的核心 API 組成。Netlink 的設計比 ioctl 更加靈活，Netlink 使用了 AF\_NETLINK Socket
家族。

RFC 3549（頁面存檔備份，存於網際網路檔案館）詳細的描述了 Netlink 協定。

## 歷史

Netlink 用於替代複雜和不夠靈活的 ioctl 通訊方式，ioctl 方法主要用設定和取得外部 socket，
為了提供向下相容，ioctl 將一直被 Linux 核心所支援，用法如下：

```
error = ioctl(ip_socket, ioctl_type, &value_result);
```

Netlink 在 Linux 核心 2.0 版本中作為字元裝置被首次提供使用。這個介面已經過時了，但是作為
一種 ioctl 通訊方法，它仍可繼續使用。Netlink socket 介面從 Linux 核心 2.2 開始提供使用。

## 包結構

不像 BSD 通訊端存取網際網路協定那樣，頭資訊中的標識和目的地都是自動生成（如 TCP），
Netlink 訊息頭（結構體 nlmsghdr）必須由傳送方準備好，就像 socket 工作在 SOCK\_RAW 模式下
一樣。儘管 SOCK\_DGRAM 被用於建立它。

然而，資料部分可能進一步巢狀其它特定的子訊息系統。

## Netlink 通訊端簇

AF\_NETLINK 協定家族提供了多個子協定。每個介面連接不同的核心組件並且有各自的訊息集。
如：

```
int socket(AF_NETLINK, SOCK_DGRAM or SOCK_RAW, protocol)
```

由於缺少標準，SOCK\_DGRAM 和 SOCK\_RAW 並不保證在每個 Linux 發行版（或其它作業系統）被聲
明。有些原始碼中聲明兩種都可以使用，紅帽的文件中聲明 SOCK\_RAW 一直可以被使用，而
iproute2 交換使用兩者。

## Netlink 協定

Netlink 所支援的協定如下（並不完全）：**NETLINK\_ROUTE**NETLINK\_ROUTE 提供路由和連接資訊。這些資訊主要被使用者空間的路由守護行程使用。對於這個
協定，Linux 聲明了大量的子訊息：

* 鏈路層：**RTM\_NEWLINK, RTM\_DELLINK, RTM\_GETLINK, RTM\_SETLINK**
* 位址設定：**RTM\_NEWADDR, RTM\_DELADDR, RTM\_GETADDR**
* 路由表：**RTM\_NEWROUTE, RTM\_DELROUTE, RTM\_GETROUTE**
* 鄰居快取（Neighbor Cache）：**RTM\_NEWNEIGH, RTM\_DELNEIGH, RTM\_GETNEIGH**
* 路由規則：**RTM\_NEWRULE, RTM\_DELRULE, RTM\_GETRULE**
* Queuing Discipline Settings: **RTM\_NEWQDISC, RTM\_DELQDISC, RTM\_GETQDISC**
* Traffic Classes used with Queues: **RTM\_NEWTCLASS, RTM\_DELTCLASS, RTM\_GETTCLASS**
* 流量過濾：**RTM\_NEWTFILTER, RTM\_DELTFILTER, RTM\_GETTFILTER**
* 其它：**RTM\_NEWACTION, RTM\_DELACTION, RTM\_GETACTION, RTM\_NEWPREFIX, RTM\_GETPREFIX, RTM\_GETMULTICAST, RTM\_GETANYCAST, RTM\_NEWNEIGHTBL,RTM\_GETNEIGHTBL, RTM\_SETNEIGHTBL**

**NETLINK\_FIREWALL**

　
: NETLINK\_FIREWALL 提供給使用者空間使用者程式一個介面，使用者空間應用程式利用這個介面可以從防火牆接收包。

**NETLINK\_NFLOG**

　
: NETLINK\_NFLOG 提供了一個 iptables 和 Netfilter 間通訊的介面。

**NETLINK\_ARPD**

　
: NETLINK\_ARPD 提供了一個介面用於從使用者空間來管理 ARP 表。

**NETLINK\_AUDIT**

　
: NETLINK\_AUDIT 只能在 Linux 核心 2.6.6 及以後才可以使用，它提供了一個使用者審計子系統的介面。

**NETLINK\_IPV6\_FW**

　
: NETLINK\_IPV6\_FW 提供了一個將包從 netfilter 傳送到使用者空間的介面。

**NETLINK\_ROUTE6**

**NETLINK\_TAPBASE**

**NETLINK\_TCPDIAG**

**NETLINK\_XFRM**

　
: NETLINK\_XFRM 提供了一個介面用於管理 IPSec 安全組件 (IPSec Security association) 和安全策略資料庫的介面。主要被金鑰管理的守護行程用於網際網路金鑰交換（Internet Key Exchange）協定。

### 使用者自訂的 Netlink 協定

使用者也可以在自己的核心中添加自訂的 Netlink 處理器。這允許其它 Netlink 協定被開發用於連接新的核心模組。

## 參考資料

## 外部連結

* Pablo Neira Ayuso, Rafael M. Gasca, Laurent Lefèvre. Communicating between the kernel and user-space in Linux using Netlink sockets. Software: Practice and Experience, 40(9):797-810, August 2010
* Why and How to Use Netlink Sockets（頁面存檔備份，存於網際網路檔案館）
* RFC 3549（頁面存檔備份，存於網際網路檔案館）
* http://netfilter.org/projects/libmnl（頁面存檔備份，存於網際網路檔案館） — 「Minimalist Library for Netlink」 — userspace library for construction and parsing of Netlink messages
* http://www.infradead.org/~tgr/libnl（頁面存檔備份，存於網際網路檔案館） = "Netlink Protocol Library Suite" - full functional library covering almost all aspects of working with netlink sockets
* Manipulating the Networking Environment Using RTNETLINK（頁面存檔備份，存於網際網路檔案館）
* Netlink Sockets - Overview