nftables:强化你的网络安全

转:https://blog.csdn.net/dmgy110/article/details/132625791

什么是nftables?
nftables是一个用于管理Linux内核网络堆栈的工具,它的强大之处在于其清晰而强大的配置语言,以及对多种网络协议的全面支持。与之前的iptables相比,nftables提供了更灵活、可读性更强和性能更好的解决方案。
安装nftables
首先,确保你的Linux发行版支持nftables,并使用包管理器安装它。安装后,你可以使用以下命令启动nftables服务:

sudo apt install 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;
    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:

sudo nft delete set inet filter my_port_set
端口集合是Nftables中非常有用的功能,可用于管理和组织端口号,以更灵活地控制网络包的过滤和路由。请根据你的需求使用这些命令,并谨慎测试规则以确保网络安全性和性能。

 

posted @ 2023-11-03 23:18  Awakenedy  阅读(1283)  评论(0)    收藏  举报