一、nftables简介
nftables是Linux内核中新一代的数据包过滤、分类和转发框架,可以用于代替之前广泛使用的iptables和ip6tables,并提供更好的性能和可扩展性,同时支持IPv4和IPv6。它允许用户定义、分类和过滤数据包,使管理员可以更加灵活、精细地控制网络流量。
二、nftables配置
为了开始使用nftables,您首先需要像安装iptables一样,从源代码中安装nftables。安装后,您需要执行以下步骤启用nftables:
1. 启用nftables服务
$ systemctl enable nftables.service
2. 将防火墙规则添加到nftables.conf文件中
nftables.conf是一个配置文件,可用于指定nftables规则。这个文件将被读入,以初始化nftables的防火墙规则集合。
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0;
# 允许外部主机访问SSH
ct state new,established tcp dport 22 accept
# 允许外部主机访问HTTP和HTTPS
ct state new,established tcp dport {80, 443} accept
# 允许回环接口上的所有数据包
iif lo accept
# 其他数据包都将被拒绝
reject with icmpx type admin-prohibited
}
}
3. 加载nftables防火墙规则
你可以使用nft或nftables命令行工具加载规则,例如:
$ nft -f /etc/nftables.conf
三、nftables示例代码
1. 允许某个IP地址访问端口
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0;
ip saddr 192.168.1.50 tcp dport 22 accept
}
}
2. 阻止某个IP地址访问端口
table inet filter {
chain input {
type filter hook input priority 0;
ip saddr 192.168.1.50 drop
}
}
3. 防止针对SSH暴力破解
将以下脚本保存到/etc/nftables.conf中以防止SSH暴力攻击。该规则将在5分钟内允许三个尝试,如果更多的尝试被阻止,则将为源IP地址禁用端口22访问。
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set bruteforce {
type ipv4_addr
flags interval
size 65535
interval 5m
timeout 1h
}
chain input {
type filter hook input priority 0;
ct state new tcp dport 22 {
add @bruteforce { ip saddr timeout 30s }
# 如果来源IP地址在黑名单中,则禁止访问
if @bruteforce >= 3 { drop }
# otherwise accept
accept
}
# 允许外部主机访问SSH
ct state new,established tcp dport 22 accept
# 允许外部主机访问HTTP和HTTPS
ct state new,established tcp dport {80, 443} accept
# 允许回环接口上的所有数据包
iif lo accept
# 其他数据包都将被拒绝
reject with icmpx type admin-prohibited
}
}
4. 将数据包路由到不同的链中
以下示例将TCP数据包重定向到TCP链中,将UDP数据包重定向到UDP链中:
table inet filter {
chain input {
type filter hook input priority 0;
# 将TCP数据包重定向到TCP链中
ip protocol tcp jump TCP
# 将UDP数据包重定向到UDP链中
ip protocol udp jump UDP
# 其他数据包都将被拒绝
reject with icmpx type admin-prohibited
}
chain TCP {
type filter hook input priority 0;
# 处理TCP数据包的规则
...
}
chain UDP {
type filter hook input priority 0;
# 处理UDP数据包的规则
...
}
}
5. 管理nftables防火墙规则
以下命令可以用于管理nftables防火墙规则:
# 显示当前规则集以及规则的统计信息
$ nft list ruleset
# 刷新规则集和计数器
$ nft flush ruleset
# 测试规则是否匹配
$ nft test rule {table} {chain} {rule}
# 添加一条规则
$ nft add rule {table} {chain} {rule}
# 删除一条规则
$ nft delete rule {table} {chain} {rule}
# 显示规则集占用的内存
$ nft --debug=netlink --handle --echo <file>
四、总结
nftables提供了比iptables更灵活和可扩展的防火墙框架,并在Linux内核中得到广泛的应用。它允许用户定义、分类和过滤数据包,从而更好地控制网络流量,保障网络安全。本文介绍了nftables的安装和配置步骤,并给出了几个示例代码,可以帮助读者更好地了解并使用nftables。