什么是nftables?
nftables是一个用于管理Linux内核网络堆栈的工具,它的强大之处在于其清晰而强大的配置语言,以及对多种网络协议的全面支持。与之前的iptables相比,nftables提供了更灵活、可读性更强和性能更好的解决方案。
安装nftables
首先,确保你的Linux发行版支持nftables,并使用包管理器安装它。安装后,你可以使用以下命令启动nftables服务:
sudo systemctl start nftables
1. 基本概念:
-
表(Tables):Nftables配置由表组成,表是规则的容器。有四种类型的表:filter、nat、mangle、和raw。通常,我们在filter表中配置防火墙规则。
-
链(Chains):表包含多个链,链是规则的集合。Nftables中有五种默认链:input、output、forward、prerouting和postrouting。这些链用于不同的网络包处理阶段。
-
规则(Rules):规则是定义如何处理网络包的指令。规则由条件(匹配条件)和操作(对匹配的包执行的操作)组成。
-
集合(sets):集合是一种数据结构,用于存储IP地址、端口号等信息,以便在规则中引用。
当涉及到Nftables时,理解其基本概念和语法是非常重要的。
2. 基本命令:
-
查看规则集:使用以下命令查看当前规则集:
sudo nft list ruleset
-
创建新表:创建新的Nftables表,例如,创建一个新的filter表:
sudo nft add table ip filter
-
创建新链:在表中创建新的链,例如,创建一个新的input链:
sudo nft add chain ip filter input { type filter hook input priority 0; }
-
添加规则:向链中添加规则,例如,允许SSH流量:
sudo nft add rule ip filter input tcp dport 22 accept
-
删除规则:从链中删除规则,使用
delete
命令,例如:sudo nft delete rule ip filter input tcp dport 22 accept
-
保存规则:将规则保存到配置文件中以便永久生效:
sudo nft list ruleset > /etc/nftables.conf sudo systemctl restart nftables
3. 规则语法:
-
匹配条件:规则中的条件用于匹配网络包。条件可以包括源地址、目标地址、端口号、协议等信息。例如,
ip saddr
表示源地址,tcp dport
表示目标端口。 -
操作:规则中的操作定义了匹配的网络包应该如何处理,包括接受、拒绝、重定向等。例如,
accept
表示接受网络包。 -
连接跟踪:Nftables支持连接跟踪,可以根据网络连接的状态进行过滤和操作。例如,
ct state
用于匹配连接状态。
高级nftables用法
连接跟踪
nftables可以用于创建强大的防火墙规则,其中一个关键功能是连接跟踪,允许您跟踪网络连接的状态。连接跟踪对于管理网络流量和实施安全策略非常重要。下面是一个示例规则,演示如何使用连接跟踪:
table ip my_filter {
chain input {
type filter hook input priority 0; policy drop;
ct state new,established accept
}
}
上述规则表明,只有新建立的连接和已建立的连接才会被接受,其他一切都会被拒绝。
端口转发:
#!/usr/sbin/nft -f
table ip my_nat {
chain prerouting {
type nat hook prerouting priority 0;
tcp dport 80 redirect to :8080
}
}
这个规则将端口80的流量重定向到本地端口8080。
限速
nftables还可以用于限制特定类型的流量速率,以防止过多的流量影响网络性能。以下是一个限速的示例规则:
table ip my_filter {
chain input {
type filter hook input priority 0; policy drop;
ip saddr 192.168.1.0/24 limit rate over 1/second accept
}
}
上述规则表示,只允许来自子网192.168.1.0/24的流量以每秒不超过1个包的速率进入。
多协议族支持
nftables支持多个协议族,包括ip、ip6、inet、arp、bridge等。您可以在不同的协议族中定义规则,以根据网络层协议类型来处理流量。下面是一个多协议族支持的示例:
table inet my_filter {
chain input {
type filter hook input priority 0; policy drop;
ip saddr 192.168.1.0/24 accept
}
}
table ip6 my_filter {
chain input {
type filter hook input priority 0; policy drop;
ip6 saddr fd00::/64 accept
}
}
上述示例中,我们创建了两个不同协议族的表,一个用于IPv4流量,一个用于IPv6流量,以分别处理它们。
共享规则和集合
要在不同协议族之间共享规则和集合,您可以使用define
来定义规则或集合,然后在不同协议族的规则中引用它们。例如:
define my_ips = { 192.168.1.0/24, 10.0.0.0/24 }
table ip my_filter {
chain input {
type filter hook input priority 0; policy drop;
ip saddr $my_ips accept
}
}
table ip6 my_filter {
chain input {
type filter hook input priority 0; policy drop;
ip6 saddr fd00::/64 accept
}
}
上述示例中,我们定义了一个名为my_ips
的集合,包含了一些IP地址,然后在不同协议族的规则中引用了这个集合。
Nftables中的IP集合
IP sets是一种非常有用的功能,允许你将一组IP地址组织在一起以用于规则匹配。IP集合可以用于多种目的,例如允许或拒绝一组IP地址的流量,或者用于创建更复杂的规则。
1. 创建IP集合:
要创建一个IP集合,你可以使用nft add set
命令。下面是一个示例,创建一个名为my_ip_set
的IP集合:
sudo nft add set ip filter my_ip_set {
type ipv4_addr
}
这将创建一个IPv4地址类型的IP集合,并将其放置在filter表中。
2. 添加IP地址到集合:
要向IP集合添加IP地址,使用add element
命令。例如,将IP地址192.168.1.100
添加到my_ip_set
中:
sudo nft add element ip filter my_ip_set { 192.168.1.100 }
3. 删除IP地址从集合:
要从IP集合中删除IP地址,使用delete element
命令。例如,从my_ip_set
中删除IP地址192.168.1.100
:
sudo nft delete element ip filter my_ip_set { 192.168.1.100 }
4. 使用IP集合:
将IP集合用于规则匹配是Nftables的一个强大功能。你可以在规则中使用@
符号来引用IP集合。例如,创建一个规则来允许my_ip_set
中的IP地址访问SSH端口:
sudo nft add rule ip filter input ip saddr @my_ip_set tcp dport 22 accept
这将允许my_ip_set
中的IP地址访问SSH端口。
5. 查看IP集合:
要查看IP集合的内容,可以使用list set
命令:
sudo nft list set ip filter my_ip_set
这将列出my_ip_set
中包含的所有IP地址。
6. 删除IP集合:
要删除IP集合,使用delete set
命令。例如,删除my_ip_set
:
sudo nft delete set ip filter my_ip_set
Nftables允许你创建端口集合(Port Sets)
要创建一个端口集合,你可以使用nft add set
命令。下面是一个示例,创建一个名为my_port_set
的端口集合:
sudo nft add set inet filter my_port_set {
type inet_service
}
这将创建一个端口类型的端口集合,并将其放置在inet
地址家族的filter表中。
2. 添加端口到集合:
要向端口集合添加端口,使用add element
命令。例如,将端口号80
添加到my_port_set
中:
sudo nft add element inet filter my_port_set { 80 }
3. 删除端口从集合:
要从端口集合中删除端口,使用delete element
命令。例如,从my_port_set
中删除端口号80
:
sudo nft delete element inet filter my_port_set { 80 }
4. 使用端口集合:
将端口集合用于规则匹配是Nftables的一个强大功能。你可以在规则中使用@
符号来引用端口集合。例如,创建一个规则来允许my_port_set
中的端口号访问:
sudo nft add rule inet filter input tcp dport @my_port_set accept
这将允许my_port_set
中的端口号的TCP流量通过。
5. 查看端口集合:
要查看端口集合的内容,可以使用list set
命令:
sudo nft list set inet filter my_port_set
这将列出my_port_set
中包含的所有端口号。
6. 删除端口集合:
要删除端口集合,使用delete set
命令。例如,删除my_port_set
:文章来源:https://www.toymoban.com/news/detail-736427.html
sudo nft delete set inet filter my_port_set
端口集合是Nftables中非常有用的功能,可用于管理和组织端口号,以更灵活地控制网络包的过滤和路由。请根据你的需求使用这些命令,并谨慎测试规则以确保网络安全性和性能。文章来源地址https://www.toymoban.com/news/detail-736427.html
到了这里,关于深入理解nftables:强化你的网络安全的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!