从源码构建和安装 nftables

nftables 需要一些用户空间的库,nft 用户空间命令行工具和内核模块。

如果你使用主流发行版,你可以考虑使用发行版的 nftables

安装用户空间库

你需要安装下列用户空间库:

  • libmnl,这个库提供了使用 Netlink 进行内核和用户空间通信的接口。你的发行版很可能已经提供了你可以使用的 libmnl 包。如果你决定使用发行版的包,确信你也安装好了开发包。
  • libnftnl(通常称为 libnftables),这个库提供了把 netlink 消息转换到对象的底层 API。

你还需要 libgmplibreadline,大多数发行版都提供了这两个包,所以确信你安装好了这个包的开发扩展。

如果你打算测试 nftables,我们建议你使用 lobnftnlnft 的 git 快照。

从 git 安装用户空间库

要安装 libnftnl,输入这些神奇的文字:

$ git clone git://git.netfilter.org/libnftnl
$ cd libnftnl
$ sh autogen.sh
$ ./configure
$ make
$ sudo make install

如果你有任何编译问题,请报告到 Netfilter 开发者邮件列表,并提供尽可能多的信息。

从快照中安装用户空间库

你可以通过 Netfilter FTP 获得每天的快照。然后你需要使用下列命令:

$ wget ftp://ftp.netfilter.org/pub/libnftnl/snapshot/libnftnl-20140217.tar.bz2
$ tar xvjf libnftnl-20140217.tar.bz2
$ ./configure
$ make
$ sudo make install

安装用户空间 nft 命令行工具

这个命令行工具提供了配置 nftables 的用户接口。

从 git 中安装

只需要输入下列命令:

% git clone git://git.netfilter.org/nftables
% cd nftables
% sh autogen.sh
% ./configure
% make
% make install

你需要使用下面的命令检查你的系统是否安装了 nft

% nft
nft: no command specified

这说明没有正确的安装 nft

安装 Linux 内核的 nftables 支持

前提:nftables 在 Linux 内核 3.14 版本之后可用,但是还是开发阶段,所以我们建议你使用最新版的内核。

验证是否安装成功

你可以通过检查是否能安装 nf_tables 内核模块来验证你是否安装成功。

% modprobe nf_tables

然后你可以用 lsmod 检查它是否安装成功:

# lsmod | grep nf_tables
nf_tables              42349  0

dmesg 应该会显示下列消息:

% dmesg
...
[13939.468020] nf_tables: (c) 2007-2009 Patrick McHardy <[email protected]>

确定你同时加载了地址族支持,例如:

% modprobe nf_tables_ipv4

lsmod 命令应该显示这样:

# lsmod | grep nf_tables
nf_tables_ipv4         12869  0 
nf_tables              42349  1 nf_tables_ipv4

其它的地址族模块是:nf_tables_ipv6nf_tables_bridgenf_tables_arp 和 (从 Linux 内核 3.14 开始)nf_tables_inet

这些模块提供了正确的表和过滤链支持。

你也可以检查你当前的内核支持哪些模块,方法取决于你的发行版:

  • 在 Debian 上,查看 /boot/config-XXX-YYY 目录,XXX 是你的内核包的版本,YYY 是你的架构,例如 /boot/config-4.2.0-1-amd64
  • 在 Arch 上, 查看 /proc/config.gz。因为这是压缩过的,因此你可以用 zcatzgrep 命令。

在下面 Debian 的例子中,CONFIG_NFT_REDIR_IPV4CONFIG_NFT_REDIR_IPV6 没有设置,所以你无法在规则集中使用 redirect

% grep CONFIG_NFT_ /boot/config-4.2.0-1-amd64
CONFIG_NFT_EXTHDR=m
CONFIG_NFT_META=m
CONFIG_NFT_CT=m
CONFIG_NFT_RBTREE=m
CONFIG_NFT_HASH=m
CONFIG_NFT_COUNTER=m
CONFIG_NFT_LOG=m
CONFIG_NFT_LIMIT=m
CONFIG_NFT_MASQ=m
CONFIG_NFT_REDIR=m
CONFIG_NFT_NAT=m
CONFIG_NFT_QUEUE=m
CONFIG_NFT_REJECT=m
CONFIG_NFT_REJECT_INET=m
CONFIG_NFT_COMPAT=m
CONFIG_NFT_CHAIN_ROUTE_IPV4=m
CONFIG_NFT_REJECT_IPV4=m
CONFIG_NFT_CHAIN_NAT_IPV4=m
CONFIG_NFT_MASQ_IPV4=m
# CONFIG_NFT_REDIR_IPV4 is not set
CONFIG_NFT_CHAIN_ROUTE_IPV6=m
CONFIG_NFT_REJECT_IPV6=m
CONFIG_NFT_CHAIN_NAT_IPV6=m
CONFIG_NFT_MASQ_IPV6=m
# CONFIG_NFT_REDIR_IPV6 is not set
CONFIG_NFT_BRIDGE_META=m
CONFIG_NFT_BRIDGE_REJECT=m

从 git 中安装

这会慢一点,因为你会从 Linux 内核中接收 nftables git 树:

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nftables.git

当接收完 git 树后,你需要按照上面的相同的步骤操作。

但是,你会得到 nftables 内核代码最近的更改。

当配置内核时,确信启用了所有的 nftables 模块(选择 my)。下面是例子:

$ make oldconfig

Netfilter Xtables support (required for ip_tables) (NETFILTER_XTABLES) [M/y/?] m
Netfilter nf_tables support (NF_TABLES) [N/m] (NEW) m
  Netfilter nf_tables payload module (NFT_PAYLOAD) [N/m] (NEW) m
  Netfilter nf_tables IPv6 exthdr module (NFT_EXTHDR) [N/m] (NEW) m
  Netfilter nf_tables meta module (NFT_META) [N/m] (NEW) m
  Netfilter nf_tables conntrack module (NFT_CT) [N/m] (NEW) m
  Netfilter nf_tables rbtree set module (NFT_RBTREE) [N/m] (NEW) m
  Netfilter nf_tables hash set module (NFT_HASH) [N/m] (NEW) m
  Netfilter nf_tables counter module (NFT_COUNTER) [N/m] (NEW) m
  Netfilter nf_tables log module (NFT_LOG) [N/m] (NEW) m
  Netfilter nf_tables limit module (NFT_LIMIT) [N/m] (NEW) m
  Netfilter nf_tables nat module (NFT_NAT) [N/m] (NEW) m
  Netfilter x_tables over nf_tables module (NFT_COMPAT) [N/m/?] (NEW) m

IPv4 nf_tables support (NF_TABLES_IPV4) [N/m] (NEW) m
  nf_tables IPv4 reject support (NFT_REJECT_IPV4) [N/m] (NEW) m
  IPv4 nf_tables route chain support (NFT_CHAIN_ROUTE_IPV4) [N/m] (NEW) m
  IPv4 nf_tables nat chain support (NFT_CHAIN_NAT_IPV4) [N/m] (NEW) m

IPv6 nf_tables support (NF_TABLES_IPV6) [M/n] m
  IPv6 nf_tables route chain support (NFT_CHAIN_ROUTE_IPV6) [M/n] m
  IPv6 nf_tables nat chain support (NFT_CHAIN_NAT_IPV6) [M/n] m

Ethernet Bridge nf_tables support (NF_TABLES_BRIDGE) [N/m/y] (NEW) m