linux 防火墙管理程序 nftables

2018-08-13 23:27:49

nftables 可以代替流行的但是比较老的 {ip,ip6,arp,eb}tables。从 linux 内核 3.13 版本开始,nftables 已经成为 linux 内核主线的一部分。

nftables 没有预定义的表。

nftables 拥有一些高级的类似编程语言的能力,例如定义变量和包含外部文件。nftables 也可以用于多种地址族过滤和处理。这些地址族如下:

ip:ipv4 地址(默认)
ip6:ipv6 地址
inet:ipv4和ipv6
arp:地址解析协议
bridge:处理桥接数据包

特定的地址族包含钩子,它使得 nftables 可以当数据包在 linux 的网络堆栈中传输时访问到数据包。这意味着您可以在数据包被传递到路由之前或在它处理完毕之后对数据包执行一些操作。对于 ip、ipv6、inet 地址族来说,可以应用下面的钩子:

prerouting:刚到达并未被 nftables 的其他部分所路由或处理的数据包
input:已经被接收并且已经经过 prerouting 钩子的传入数据包
forward:如果数据报将被发送到另一个设备,它将会通过 forward 钩子
output:从本地传出的数据包
postrouting:仅仅在离开系统之前,可以对数据包进行进一步处理

arp 地址族只能使用 input 和 output 钩子。

nftables 语法

nft 命令本身有一些可以从命令行传入的选项,它们并不直接与定义过滤规则相关。这些命令行选项包含如下:

--debug <level,[level]>
#在 level 处添加调试,例如 scanner、parser、eval、netlink、mnl、segtree、proto-ctx

-h | --help  #帮助

-v | --version  #版本

-n | --numeric  #以数字方式显示地址和端口

-a | --handle   #显示规则句柄

-I | --includepath<dir>  #将 dir 添加到搜索文件路径

-f | --file <f>  #包含文件

-i | --interactive  #从命令行读取输入

表语法

在表上进行操作时,有如下4个命令可用:

add      添加表
delete  删除表
list       显示一个表中的所有规则链和规则
flush    清除一个表中的所有规则链和规则

#列出可用的表
nft list tables

#新增表
nft add table filter

#列出更多关于表的信息
nft list table filter

规则链语法

当在规则链上进行操作时,共有下述6个命令可用:

add  将一条规则链添加到表
create 在表中创建规则链,已经存在则不创建
delete 删除一条规则链
flush 清除一条规则链里所有规则
list 显示一条规则链里的所有规则
rename 修改一条规则链的名称

三种基本规则链类型

filter 数据包过滤
route 用于数据包路由
nat 用于网络地址转换

当数据包在基础规则链中传输时,处理过程可以被路由到一个或多个用户定义的规则链以进行额外的处理。

当添加一条规则链时,必须指定表。

nft add chain filter input{type filter hook input priority 0 \;}

这条命令声明一条叫做 input 的规则链将被添加到名为 filter 的表中。规则链的类型是 filter,并且优先级0附加到 input 钩子。命令行需要空格加一个分号,文件里空格反斜线可以被忽略。

规则语法

规则是过滤操作发生的地方。当操作规则时,有3个命令可用。

add 添加一条规则
insert 在规则链中加入一个规则,可以添加在规则链开头或指定的地方
delete 删除一条规则

处理方式:

accept 接收数据并且停止处理
continue 继续处理此数据包
drop 停止处理并丢弃
goto 发送到指定规则链但不返回
jump 发送到指定的规则链,当执行完成或者返回时,返回到调用的规则链
limit 如果达到了接收数据包的匹配限制,则根据规则处理数据包
log 日志记录并继续处理
queue 停止处理并发送数据包到用户空间程序
reject 停止处理并驳回
return 返回到调用的规则链

元表达式

元表达式可以在广泛应用的规则或与常用数据包或接口属性相关的规则中使用。

 表达式 描述
 iif 接收数据包接口索引
 iifname 接收数据包的接口名称
 iiftype 接收数据包的接口类型
 length 数据包字节长度
 mark 数据包标记
 oif 传出数据包接口索引
 oifname 传出数据包接口名称
 oiftype 传出数据包类型
 priority TC数据包的优先级
 protocol 以太网类型协议
 rtclassid 路由数据包领域
 skgid 原始套接字的组标识符
 skuid 原始套接字的用户标识符

连接最终表达式可以同过关键字 ct 后跟下面一项被包含进来:daddr、direction、expiration、helper、l3proto、mark、protocol、proto-src、proto-dst、saddr、state、status。

状态表达式是防火墙使用中重要的一项。普通的数据包检查和规则处理时无状态的。

new:一个新的数据包到达防火墙,例如一个 syn 标志的 tcp 数据包。
established:数据包已经被处理或跟踪连接的一部分。
invalid:一个不符合协议规则的数据包。
related:一个数据包与某个连接有关,该连接的协议不使用其他手段跟踪其状态,例如icmp或者被动ftp。
untracked:一个用于绕开连接跟踪的管理员状态,典型用于特殊情况。

new、established、related使用的最频繁的。下面是一个允许 established 和 related 的 ssh 连接的规则。允许相关的连接时很重要的,一方内存被清除而否定所有已经建立连接的状态。

nft add rule filter input tcpdport 22 ct state established,related accept

ipv4报头表达式

 表达式描述 
 checksum ip报头校验和
 daddr 目的ip地址
 frag-off 分片偏移
 hdrlength 包括选项在内的ip报头长度
 id ip标识符
 length 数据包的总长度
 protocol ip层上面的协议
 saddr 源ip地址
 tos 服务类型值
 ttl 生存期值
 version ip报头版本,ipv4总是4

ipv6报头表达式

 表达式描述 
 daddr 目的ip地址
 flowlabel 流标签
 hoplimit 跳数限制
 length 负载的长度
 nexthdr 下一报头协议
 priority 优先级值
 saddr 源ip地址
 version ip报头版本,ipv6总是6

tcp报头表达式

 表达式 描述
 ackseq 确认号
 checksum 数据包的校验和
 doff 数据偏移
 dport 数据包所发生的端口(目的端口)
 flags tcp标志
 sequence 序列号
 sport 数据包发出的端口(源端口)
 urgptr 紧急指针值
 window tcp窗口值

udp报头表达式

 表达式描述 
 checksum 数据包的校验和
 dport 数据包所发往的端口(目的端口)
 length 数据包的总长度
 sport 数据包发出的端口(源端口)

arp报头表达式

 表达式 描述
 hlen 硬件地址长度
 htype arp硬件类型
 op 操作
 plen 协议地址长度
 ptype 以太网类型

在添加一条规则时,表和规则链需要与匹配标准一同被指定。例如,添加一个用以接受从特定主机到来的SSH连接的规则如下所示。此规则被添加到前面创建的 filter 表中的 input 规则链

nft add filter input tcp dport 22 accept

各种各样的声明,例如 accept、drop、 reject、log和其他声明被称为扩展( extensions)。用于扩展的许多选项和操作模式在 nftables 中也同样适用。例如记录传入连接时,需要使用log声明。 端口的新连接。另外,还可以添加一个限制以防止日志记录机制不堪重负。 此声明可以与连接跟踪联合使用,以仅仅记录到达22号端口的新连接。

nftables 中的日志记录需要 nfnetlink_log 或 xt_LOG内核模块或内核的支持。而且,您需要通过将 "ipt_LOG" 写入 proc 文件中的 nf_log 以启用日志记录:

echo "ipt_LOG" > /proc/sys/net/netfilter/nf_log/2

记录新 SSH 连接(频率限制)的 nftable 命令最终看起来是这样的

nft add filter input tcp dport 22 ct state new limit rate 3/second log

元表达式,比如那些选择传入或传出接口的元表达式,被用作一个规则中更进一步的选择器。例如,记录到达 eth0 接口的新连接的命令看起来是这样的:

nft add filter input iif eth0 ct state new limit rate 10/minute log

nftables 文件语法

nftables 最好的一个特性便是支持读取包含 nftables 规则的外部文件。这些文件可以保存导入的规则,在使用时无需创建又长又复杂的 shell 脚本。即便如此, shell 脚本作为防火墙规则文件的容器,在导入规则时依旧很有用。

nftables使用 -f 选项来导入文件。例如,此文件创建了一个基础的过滤防火墙,以记录新的 ssh 数据包(频率限制):

table filter{
    chain input{
        type filter hook input priority 0;
        tcpdport 22 ct state new limit rate 3/second log prefix "NEWpacket: "
    }

    chain output{
        type filter hook input priority 0;
    }
}

假设此文件被保存为 firewall.nft,它便可以使用下面的命令进行加载

nft -f firewall.nft

小结

nftables 与 iptables很相似,规则和选项在构建防火墙时通常可以互相兼容。nftables 利用表,表包含了规则链,而规则链包含了许多规则。规则会告诉 nftables 在处理数据包时应该做什么。像 iptables 一样, nftables可以在数据包上执行 accept、drop、 reject、log以及相似的动作。 nftables 可以包括基于状态的处理。 nftables 取代了 arptables, iptables和 ebtables。


备注:
1.本系列命令都在centos7里测试,其他发行版如ubuntu、debian、fedora、opensuse等可能略微不同
2.本文只讲解常用用法,详细用法请自行利用 man 命令查看
3.原文地址http://www.freecls.com/a/2712/fc

 

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。