从源码构建和安装 nftables
nftables
需要一些用户空间的库,nft
用户空间命令行工具和内核模块。
如果你使用主流发行版,你可以考虑使用发行版的 nftables。
安装用户空间库
你需要安装下列用户空间库:
- libmnl,这个库提供了使用 Netlink 进行内核和用户空间通信的接口。你的发行版很可能已经提供了你可以使用的
libmnl
包。如果你决定使用发行版的包,确信你也安装好了开发包。 - libnftnl(通常称为
libnftables
),这个库提供了把netlink
消息转换到对象的底层 API。
你还需要 libgmp
和 libreadline
,大多数发行版都提供了这两个包,所以确信你安装好了这个包的开发扩展。
如果你打算测试 nftables
,我们建议你使用 lobnftnl
和 nft
的 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_ipv6
,nf_tables_bridge
,nf_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。因为这是压缩过的,因此你可以用
zcat
或zgrep
命令。
在下面 Debian 的例子中,CONFIG_NFT_REDIR_IPV4
和 CONFIG_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
模块(选择 m
或 y
)。下面是例子:
$ 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