深入理解nftables:强化你的网络安全

什么是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

sudo nft delete set inet filter my_port_set

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

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值