内容一:导出 iptables 防火墙规则
# iptables-save > /root/iptables_save
(补充:这里以将 iptables 防火墙规则导出到 /root/iptables_save 文件为例)
内容二:导入 iptables 防火墙规则
# iptables-restore < /root/iptables_save
(补充:这里以将 /root/iptables_save 文件里的内容导入到 iptables 防火墙为例)
# iptables-save > /root/iptables_save
(补充:这里以将 iptables 防火墙规则导出到 /root/iptables_save 文件为例)
# iptables-restore < /root/iptables_save
(补充:这里以将 /root/iptables_save 文件里的内容导入到 iptables 防火墙为例)
只有 CentOS 8 & RHEL 8 才可以使用 nftables 防火墙
# dnf install nftables
# iptables -F
# ip6tables -F
# systemctl disable firewalld.service
# systemctl stop firewalld.service
# systemctl enable nftables
# systemctl start nftables
# vi /etc/sysconfig/nftables.conf
添加以下内容:
......
include "/etc/nftables/nftables.rules"
# vi /etc/nftables/nftables.rules
flush ruleset
table inet siemens_FW {
chain siemens_FW_input {
type filter hook input priority 0; policy accept;
iif "lo" accept
ip saddr 127.0.0.0/8 counter packets 0 bytes 0 drop
ip6 saddr ::1 counter packets 0 bytes 0 drop
ip saddr 192.168.1.1 tcp dport ssh accept
tcp dport ssh drop
}
chain siemens_FW_forward {
type filter hook forward priority 0; policy accept;
}
chain siemens_FW_output {
type filter hook output priority 0; policy accept;
}
}
(
补充:
(1)这里以基本的本地巡回路由策略并禁止除 192.168.1.1 的 IP 地址访问本地的 22 端口为例
(2)这里的 /etc/nftables/nftables.rules 是在 2.1 中添加的
)
# systemctl start nftables
只有 CentOS 8 & RHEL 8 才可以使用 nftables 防火墙
# dnf install nftables
# iptables -F
# ip6tables -F
# systemctl disable firewalld.service
# systemctl stop firewalld.service
# systemctl enable nftables
# systemctl start nftables
# nft create table inet <table>
# nft create chain inet <table> input { type filter hook input priority 0 \; }
# nft create chain inet <table> forward { type filter hook forward priority 0 \; }
# nft create chain inet <table> output { type filter hook output priority 0 \; }
# nft add rule inet filter input iif lo accept
# nft add rule inet filter input ip saddr 127.0.0.0/8 counter drop
# nft add rule inet filter input ip6 saddr ::1 counter drop
nftables脚本例子:过滤和NAT
#! /bin/bash
#清空当前规则集:
nft flush ruleset
#查询当前规则集:
nft list ruleset
#添加一个表:
nft add table inet filter
#添加input、forward和output三个基本链。input和forward的默认策略是drop。output的默认策略是accept。
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
nft add chain inet filter output { type filter hook output priority 0 \; policy accept \; }
#添加两个与TCP和UDP关联的常规链:
nft add chain inet filter TCP
nft add chain inet filter UDP
#related和established的流量会accept:
nft add rule inet filter input ct state related,established accept
#loopback接口的流量会accept:
nft add rule inet filter input iif lo accept
#无效的流量会drop:
nft add rule inet filter input ct state invalid drop
#新的echo请求(ping)会accept:
nft add rule inet filter input ip protocol icmp icmp type echo-request ct state new accept
#新的UDP流量跳转到UDP链:
nft add rule inet filter input ip protocol udp ct state new jump UDP
#新的TCP流量跳转到TCP链:
nft add rule inet filter input ip protocol tcp tcp flags \& \(fin\|syn\|rst\|ack\) == syn ct state new jump TCP
#未由其他规则处理的所有通信会reject:
nft add rule inet filter input ip protocol udp reject
nft add rule inet filter input ip protocol tcp reject with tcp reset
nft add rule inet filter input counter reject with icmp type prot-unreachable
#web服务器的连接端口80:
nft add rule inet filter TCP tcp dport 80 accept
#打开web服务器HTTPS连接端口443:
nft add rule inet filter TCP tcp dport 443 accept
#允许SSH连接端口22:
nft add rule inet filter TCP tcp dport 22 accept
#NAT
#删除规则表 dnat1
#nft delete table ip dnat1
#增加规则表 dnat1
nft add table ip dnat1
#在表dnat1中增加一条链 prerouting [SNAT]
nft add chain dnat1 prerouting { type nat hook prerouting priority 0 \;}
#在表dnat1中增加一条链 postrouting [DNAT]
nft add chain dnat1 postrouting { type nat hook postrouting priority 100 \; }
#
nft add rule dnat1 prerouting ip daddr 192.168.1.1 tcp dport 80 counter dnat 172.16.1.2:80
nft add fule dnat1 postrouting ip daddr 172.16.1.2 tcp dport 80 counter snat to 172.16.1.1
#
nft add rule dnat1 prerouting ip saddr 172.16.1.2 tcp sport 80 counter dnat 192.168.1.2
nft add rule dnat1 postrouting ip saddr 172.16.1.2 tcp sport 80 counter snat to 192.168.1.1
————————————————
版权声明:本文为CSDN博主「linranguo」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangcg123/article/details/108739367
注明:所有转载内容皆直接从被转载文章网页的标题和内容的文本中复制而来
CC 4.0 BY-SA 版权协议网址:https://creativecommons.org/licenses/by-sa/4.0/deed.z
站主补充:
补充目录:
站主补充一:开启 nft 防火墙的方法
1.1 清空 iptables 防火墙
1.1.1 清空 iptables 防火墙
1.1.2 清空 ip6tables 防火墙
1.2 关闭 firewalld 防火墙
1.2.1 取消 firewalld 防火墙的开机自启
1.2.2 关闭 firewalld 防火墙
1.3 启动 nfttables 防火墙
1.3.1 将 nfttables 防火墙设置为开机自启
1.3.2 启动 nftables 防火墙
1.3.3 情况 nfttables 防火墙
站主补充二:添加 nft 防火墙规则
2.1 创建 nft 防火墙的表、链和测试规则
2.2 在 nft 防火墙开头添加一条规则
2.3 在 nft 防火墙结尾追加一条规则
2.4 在 nft 防火墙中间增加规则
2.4.1 使用 index 索引作为位置参考添加规则
2.4.1.1 在 nft 防火前中间插入一条规则
2.4.1.2 在 nft 防火墙中间追加一条规则
2.4.1.3 查看刚刚创建的 nft 表、链和规则
2.4.2 使用 handle 句柄作为位置参考添加规则
2.4.2.1 查看 handle 句柄
2.4.2.2 在 nft 防火前中间插入一条规则
2.4.2.3 在 nft 防火墙中间追加一条规则
2.4.2.4 查看刚刚创建的 nft 表、链和规则
2.4.2.5 在添加规则的同时显示 handle 值
站主补充三:在 nft 防火墙中间删除规则
3.1 查看 handle 句柄
3.2 删除规则
3.3 查看删除后的表和链
站主补充四:列出 nft 规则
4.1 列出某张表里的所有规则
4.2 列出某张表里某个链里的所有规则
站主补充五:一次性给 nft 防火墙设置多 IP 地址或多端口
5.1 直接一次性给 nft 防火墙设置多个 IP 地址或多端口
5.1.1 直接一次性给 nft 防火墙设置多个 IP 地址
5.1.2 直接一次性给 nft 防火墙设置多个端口
5.1.3 直接一次性给某个 IP 地址添加某个端口为例
5.1.4 查看添加后的表和链
5.2 将多个 IP 地址或多端口放到一个组里再设置
5.2.1 nft 创建组
5.2.1.1 nft 创建组的格式
5.2.1.1.1 nft 创建不支持 IP 地址区间组的格式
5.2.1.1.2 nft 创建支持 IP 地址区间组的格式
5.2.1.2 nft 创建组的数据类型
5.2.2 将多个 IP 地址或多端口放到一个组里再设置(不支持 IP 区间)
5.2.2.1 创建一个组
5.2.2.1.1 创建一个组
5.2.2.1.2 查看刚刚创建的组
5.2.2.2 设置组的默认属性
5.2.2.3 给组里添加元素
5.2.2.4 查看刚刚创建的组
5.2.3 将多个 IP 地址或多端口放到一个组里再设置(支持 IP 区间)
5.2.3.1 创建一个组
5.2.3.2 给组里添加元素
5.2.3.3 查看刚刚创建的组
5.2.4 将多个 IP 地址或多端口放到一个组里再设置(同时使用多个数据类型)
5.2.4.1 创建一个组
5.2.4.2 查看刚刚创建的组
5.2.4.3 给组里添加元素
5.2.4.4 将同时使用多个数据类型的组引用到链中
站主补充六:nft 字典
6.1 nft 无名字典
6.1.1 创建表
6.1.2 创建要使用链
6.1.3 创建和 TCP 协议相关的链
6.1.4 创建和 UDP 协议相关的链
6.1.5 给要使用的链设置字典
6.1.6 查看字典
6.2 nft 有名字典
6.2.1 创建表
6.2.2 创建要使用链
6.2.3 创建字典
6.2.4 给字典添加元素
6.2.5 将字典引用到链中
站主补充七:备份和恢复 nft 规则
7.1 备份 nft 规则
7.2 恢复 nft 规则
站主补充八:nftiptables 的使用案例
8.1 前期准备工作
8.1.1 查看已有的 nftiptables 策略
8.1.2 清除所有 nftiptables 策略
8.2 nftiptables 的使用案例
8.2.1 创建 nftiptables 表的案例
8.2.2 创建 nftiptables 链的案例
8.2.2.1 案例一:创建 input 链
8.2.2.2 案例二:创建 output 链
8.2.2.3 案例三:创建 forward 链
8.2.2.4 案例四:创建 TCP 链
8.2.2.5 案例五:创建 UPD 链
8.2.3 nftiptables 规则的案例
8.2.3.1 案例一:允许正在连接的连接连入
8.2.3.2 案例二:允许本地可以连入
8.2.3.3 案例三:丢掉无效的流量
8.2.3.4 案例四:允许被 ping
8.2.3.5 案例五:允许新的 UDP 流量跳到 UDP 链
8.2.3.6 案例六:允许新的 TCP 流量跳到 TCP 链
8.2.3.7 案例七:没有其它规则处理的 UDP 流量都会被拒绝
8.2.3.8 案例八:没有其它规则处理的 TCP 流量都会被拒绝
8.2.3.9 案例九:没有其它规则处理的 ICMP 流量都会被拒绝
8.2.3.10 案例十:对所有访问者开放某一个端口
8.2.3.11 案例十一:拒绝某一个 IP 地址访问某一个端口
8.2.3.12 案例十二:某一个端口除了某一个 IP 地址以外的所有禁止访问
8.2.3.13 案例十三:将朝向某一个 IP 地址的某一个端口指向另一个 IP 地址的某一个端口
8.2.3.14 案例十四:将朝向某一个 IP 地址的流量指向另一个 IP 地址
8.2.4 nftiptables 备份和恢复的案例
8.2.4.1 备份 nft 规则
8.2.4.2 恢复 nft 规则
具体的补充:
站主补充一:开启 nft 防火墙的方法
1.1 清空 iptables 防火墙
1.1.1 清空 iptables 防火墙
# iptables -F
1.1.2 清空 ip6tables 防火墙
# ip6tables -F
1.2 关闭 firewalld 防火墙
1.2.1 取消 firewalld 防火墙的开机自启
# systemctl disable firewalld
1.2.2 关闭 firewalld 防火墙
# systemctl stop firewalld
1.3 启动 nfttables 防火墙
1.3.1 将 nfttables 防火墙设置为开机自启
# systemctl enable nftables
1.3.2 启动 nftables 防火墙
# systemctl start nftables
1.3.3 清空 nfttables 防火墙规则
# nft flush ruleset
站主补充二:添加 nft 防火墙规则
2.1 创建 nft 防火墙的表、链和测试规则
# nft flush ruleset
# nft add table inet filter
# nft add chain inet filter input { type filter hook forward priority 0 \; policy accept \; }
# nft add rule inet filter input tcp dport 1000 accept
# nft add rule inet filter input tcp dport 1001 accept
# nft add rule inet filter input tcp dport 1002 accept
(
补充:
(1)添加 filter 表
(2)添加默认允许所有连接都进入的 input 链
(3)添加允许 TCP 1000 端口、TCP 1001 端口 和 TCP 1002 的规则
)
2.2 在 nft 防火墙开头添加一条规则
# nft insert rule inet filter input tcp dport 999 accept
(补充:这里以在 filter 表 input 链的开头添加允许 TCP 999 端口进入为例)
2.3 在 nft 防火墙结尾追加一条规则
# nft add rule inet filter input tcp dport 1003 accept
(补充:这里以在 filter 表 input 链的结尾添加允许 TCP 1003 端口进入为例)
2.4 在 nft 防火墙中间增加规则
2.4.1 使用 index 索引作为位置参考添加规则
2.4.1.1 在 nft 防火前中间插入一条规则
# nft insert rule inet filter input index 0 tcp dport 997 accept
(补充:这里以在 filter 表 input 链的第一个位置插入允许 TCP 1003 端口进入为例)
2.4.1.2 在 nft 防火墙中间追加一条规则
# nft add rule inet filter input index 0 tcp dport 998 accept
(补充:这里以在 filter 表 input 链的第一个位置追加允许 TCP 998 端口进入为例)
2.4.1.3 查看刚刚创建的 nft 表、链和规则
# nft list ruleset
table inet filter {
chain input {
type filter hook forward priority filter; policy accept;
tcp dport 997 accept
tcp dport 999 accept
tcp dport 998 accept
tcp dport 1000 accept
tcp dport 1001 accept
tcp dport 1002 accept
tcp dport 1003 accept
}
}
2.4.2 使用 handle 句柄作为位置参考添加规则
2.4.2.1 查看 handle 句柄
# nft --handle list ruleset
table inet filter { # handle 5
chain input { # handle 1
type filter hook forward priority filter; policy accept;
tcp dport 997 accept # handle 8
tcp dport 999 accept # handle 6
tcp dport 998 accept # handle 7
tcp dport 1000 accept # handle 2
tcp dport 1001 accept # handle 3
tcp dport 1002 accept # handle 4
tcp dport 1003 accept # handle 5
}
}
(补充:这里是接着前面的步骤在继续)
2.4.2.2 在 nft 防火前中间插入一条规则
# nft insert rule inet filter input handle 7 tcp dport 101 accept
(补充:这里以在 filter 表 input 链的 handle 7 位置插入允许 TCP 101 端口进入为例)
2.4.2.3 在 nft 防火墙中间追加一条规则
# nft add rule inet filter input handle 3 tcp dport 101 accept
(补充:这里以在 filter 表 input 链的 handle 3 位置追加允许 TCP 101 端口进入为例)
2.4.2.4 查看刚刚创建的 nft 表、链和规则
# nft --handle list ruleset
table inet filter { # handle 5
chain input { # handle 1
type filter hook forward priority filter; policy accept;
tcp dport 997 accept # handle 8
tcp dport 999 accept # handle 6
tcp dport 101 accept # handle 9
tcp dport 998 accept # handle 7
tcp dport 1000 accept # handle 2
tcp dport 1001 accept # handle 3
tcp dport 101 accept # handle 10
tcp dport 1002 accept # handle 4
tcp dport 1003 accept # handle 5
}
}
(补充:这里是接着前面的步骤在继续)
2.4.2.5 在添加规则的同时显示 handle 值
# nft --echo --handle add rule inet filter input tcp dport 10000 accept
add rule inet filter input tcp dport 10000 accept # handle 11
(补充:这里以在 filter 表 input 链的结尾添加允许 TCP 10000 端口进入并显示 handle 编号为例)
站主补充三:在 nft 防火墙中间删除规则
3.1 查看 handle 句柄
# nft --handle list ruleset
table inet filter { # handle 5
chain input { # handle 1
type filter hook forward priority filter; policy accept;
tcp dport 997 accept # handle 8
tcp dport 999 accept # handle 6
tcp dport 101 accept # handle 9
tcp dport 998 accept # handle 7
tcp dport 1000 accept # handle 2
tcp dport 1001 accept # handle 3
tcp dport 101 accept # handle 10
tcp dport 1002 accept # handle 4
tcp dport 1003 accept # handle 5
tcp dport 10000 accept # handle 11
}
}
(补充:这里是接着前面的步骤在继续)
3.2 删除规则
# nft delete rule inet filter input handle 2
(补充:这里以在 filter 表 input 链中删除编号为 handle 2 的规则为例)
3.3 查看删除后的表和链
# nft --handle list ruleset
table inet filter { # handle 5
chain input { # handle 1
type filter hook forward priority filter; policy accept;
tcp dport 997 accept # handle 8
tcp dport 999 accept # handle 6
tcp dport 101 accept # handle 9
tcp dport 998 accept # handle 7
tcp dport 1001 accept # handle 3
tcp dport 101 accept # handle 10
tcp dport 1002 accept # handle 4
tcp dport 1003 accept # handle 5
tcp dport 10000 accept # handle 11
}
}
(补充:这里是接着前面的步骤在继续)
站主补充四:列出 nft 规则
4.1 列出某张表里的所有规则
# nft list table inet filter
4.2 列出某张表里某个链里的所有规则
# nft list chain inet filter input
table inet filter {
chain input {
type filter hook forward priority filter; policy accept;
tcp dport 997 accept
tcp dport 999 accept
tcp dport 101 accept
tcp dport 998 accept
tcp dport 1001 accept
tcp dport 101 accept
tcp dport 1002 accept
tcp dport 1003 accept
tcp dport 10000 accept
}
}
(补充:这里是接着前面的步骤在继续)
站主补充五:一次性给 nft 防火墙设置多 IP 地址或多端口
5.1 直接一次性给 nft 防火墙设置多个 IP 地址或多端口
5.1.1 直接一次性给 nft 防火墙设置多个 IP 地址
# nft add rule inet filter input ip saddr { 172.16.0.1, 172.16.0.2, 172.16.0.3 } accept
(补充:这里以在 filter 表 input 链的开头添加允许 172.16.0.1、172.16.0.2、172.16.0.3 IP 地址进入为例)
5.1.2 直接一次性给 nft 防火墙设置多个端口
# nft add rule inet filter input tcp dport { http, nfs, ssh } accept
(补充:这里以在 filter 表 input 链的开头添加允许 http、nfs、ssh 端口进入为例)
5.1.3 直接一次性给某个 IP 地址添加某个端口为例
# nft add rule inet filter input ip saddr . meta l4proto . tcp dport { 172.16.1.200 . tcp . 443 } accept
(补充:这里以在 filter 表 input 链的开头添加允许 172.16.1.200 IP 地址 TCP 443 端口进入为例)
5.1.4 查看添加后的表和链
# nft list ruleset
5.2 将多个 IP 地址或多端口放到一个组里再设置
5.2.1 nft 创建组
5.2.1.1 nft 创建组的格式
5.2.1.1.1 nft 创建不支持 IP 地址区间组的格式
# nft add set inet <表名> <组名> { type <数据类型> \;}
5.2.1.1.2 nft 创建支持 IP 地址区间组的格式
# nft add set inet <表名> <组名> { type <数据类型> \; flags interval \; }
5.2.1.2 nft 创建组的数据类型
ipv4_addr ipv4 地址
ipv4_addr ipv6 地址
ether_addr:网卡的 MAC 地址
inet_proto:网络协议
inet_service:网络服务
mark:标记
5.2.2 将多个 IP 地址或多端口放到一个组里再设置(不支持 IP 区间)
5.2.2.1 创建一个组
5.2.2.1.1 创建一个组
# nft add set inet filter one { type ipv4_addr \; }
(补充:这里以在 filter 表中创建使用 ipv4_addr 数据类型名为 one 的组为例)
5.2.2.1.2 查看刚刚创建的组
# nft list sets
table inet filter {
set one {
type ipv4_addr
}
}
5.2.2.2 设置组的默认属性
# nft insert rule inet filter input ip saddr @one drop
(补充:这里以将 one 组设置为黑名单的性质为例)
# nft list chain inet filter input
table inet filter {
chain input {
type filter hook forward priority filter; policy accept;
ip saddr @one drop
tcp dport 997 accept
tcp dport 999 accept
tcp dport 101 accept
tcp dport 998 accept
tcp dport 1001 accept
tcp dport 101 accept
tcp dport 1002 accept
tcp dport 1003 accept
tcp dport 10000 accept
ip saddr { 172.16.0.1, 172.16.0.2, 172.16.0.3 } accept
tcp dport { 22, 80, 2049 } accept
}
}
5.2.2.3 给组里添加元素
# nft add element inet filter one { 172.16.0.10, 172.16.0.11, 172.16.0.12}
(补充:这里以在 filter 表 one 组里添加 172.16.0.10, 172.16.0.11, 172.16.0.12 IP 地址元素为例)
5.2.2.4 查看刚刚创建的组
# nft list set inet filter one
table inet filter {
set one {
type ipv4_addr
elements = { 172.16.0.10, 172.16.0.11,
172.16.0.12 }
}
}
5.2.3 将多个 IP 地址或多端口放到一个组里再设置(支持 IP 区间)
5.2.3.1 创建一个组
# nft add set inet filter two { type ipv4_addr \; flags interval \; }
(补充:这里以在 filter 表中创建使用 ipv4_addr 数据类型名为 two 的组同时使用 flags interval 标签为例)
5.2.3.2 给组里添加元素
# nft add element inet filter two { 172.16.1.0/24 }
或者:
# nft add element inet filter two { 172.16.1.0-172.16.1.255 }
(补充:这里以在 filter 表 one 组里添加 172.16.1.0/24 IP 地址段元素为例)
5.2.3.3 查看刚刚创建的组
# nft list set inet filter two
table inet filter {
set two {
type ipv4_addr
flags interval
elements = { 172.16.1.0/24 }
}
}
5.2.4 将多个 IP 地址或多端口放到一个组里再设置(同时使用多个数据类型)
5.2.4.1 创建一个组
# nft add set inet filter three { type ipv4_addr . inet_proto . inet_service \; }
(补充:这里以在 filter 表中创建使用 ipv4_addr、inet_proto、inet_service 数据类型名为 three 的组为例)
5.2.4.2 查看刚刚创建的组
# nft list set inet filter three
table inet filter {
set three {
type ipv4_addr . inet_proto . inet_service
}
}
5.2.4.3 给组里添加元素
# nft add element inet filter three { 172.16.0.200 . tcp . ssh }
# nft add element inet filter three { 172.16.0.201 . tcp . ssh }
(补充:这里以在 filter 表 three 组里添加 172.16.1.0.200、172.16.0.201 IP 地址 tcp ssh 端口元素为例)
5.2.4.4 将同时使用多个数据类型的组引用到链中
# nft add rule inet filter input ip saddr . meta l4proto . tcp dport @three
(补充:这里以在 filter 表 input 链中引入 three 组为例)
站主补充六:nft 字典
6.1 nft 无名字典
6.1.1 创建表
# nft add table inet filter
(补充:这里以创建名为 filter 的表为例)
6.1.2 创建要使用链
# nft add chain inet filter input
(补充:这里以创建名为 input 的链为例)
6.1.3 创建和 TCP 协议相关的链
# nft add chain inet filter tcp_chain
(补充:这里以创建名为 tcp_chain 的链为例)
6.1.4 创建和 UDP 协议相关的链
# nft add chain inet filter udp_chain
(补充:这里以创建名为 udp_chain 的链为例)
6.1.5 给要使用的链设置字典
# nft add rule inet filter input meta l4proto vmap { tcp : jump tcp_chain, udp : jump udp_chain }
(补充:这里以在 filter 表 input 链里设置将 tcp_chain 链作为 TCP 协议将 udp_chain 链作为 UDP 协议的字典为例)
6.1.6 查看字典
# nft list chain inet filter input
table inet filter {
chain input {
meta l4proto vmap { tcp : jump tcp_chain, udp : jump udp_chain }
}
}
6.2 nft 有名字典
6.2.1 创建表
# nft add table inet filter
(补充:这里以创建名为 filter 的表为例)
6.2.2 创建要使用链
# nft add chain inet filter input
(补充:这里以创建名为 input 的链为例)
6.2.3 创建字典
# nft add map inet filter new { type inet_proto : verdict \; }
(补充:这里以在 filter 表里创建名为 new 字典为例)
6.2.4 给字典添加元素
# nft add element inet filter new { 172.16.3.10 : drop, 172.16.3.15 :accept }
(补充:这里以在 new 字典中添加拒绝 172.16.3.10 IP 地址和接收 172.16.3.15 IP 地址的规则为例)
6.2.5 将字典引用到链中
# nft add rule inet filter input ip saddr vmap @new
(补充:这里以在 filter 表 input 链中引用 new 字典为例)
站主补充七:备份和恢复 nft 规则
7.1 备份 nft 规则
# nft list ruleset > /root/nftables
(补充:这里以将 ruleset 规则备份到 /root/nfttables 文件为例)
7.2 恢复 nft 规则
# nft -f /root/nftables
(补充:这里以恢复 /root/nftables 文件里的 nft 规则为例)
站主补充八:nftiptables 的使用案例
8.1 前期准备工作
8.1.1 查看已有的 nftiptables 策略
# nft list ruleset
8.1.2 清除所有 nftiptables 策略
# nft flush ruleset
8.2 nftiptables 的使用案例
8.2.1 创建 nftiptables 表的案例
# nft add table inet filter
(补充:这里以创建 filter 表为例)
8.2.2 创建 nftiptables 链的案例
8.2.2.1 案例一:创建 input 链
# nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
(补充:这里以在 filter 表中创建默认拒绝所有数据的 input 链为例)
8.2.2.2 案例二:创建 output 链
# nft add chain inet filter output { type filter hook output priority 0 \; policy accept \; }
(补充:这里以在 filter 表中创建默认允许所有数据的 output 链为例)
8.2.2.3 案例三:创建 forward 链
# nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
(补充:这里以在 filter 表中创建默认允许所有数据的 forward 链为例)
8.2.2.4 案例四:创建 TCP 链
# nft add chain inet filter TCP
(补充:这里以在 filter 表中创建 TCP 链为例)
8.2.2.5 案例五:创建 UPD 链
# nft add chain inet filter UDP
(补充:这里以在 filter 表中创建 UDP 链为例)
8.2.3 nftiptables 规则的案例
8.2.3.1 案例一:允许正在连接的连接连入
# nft add rule inet filter input ct state related,established accept
8.2.3.2 案例二:允许本地可以连入
# nft add rule inet filter input iif lo accept
8.2.3.3 案例三:丢掉无效的流量
# nft add rule inet filter input ct state invalid drop
8.2.3.4 案例四:允许被 ping
# nft add rule inet filter input ip protocol icmp icmp type echo-request accept
8.2.3.5 案例五:允许新的 UDP 流量跳到 UDP 链
# nft add rule inet filter input ip protocol udp ct state new jump UDP
8.2.3.6 案例六:允许新的 TCP 流量跳到 TCP 链
# nft add rule inet filter input ip protocol tcp tcp flags \& \(fin\|syn\|rst\|ack\) == syn ct state new jump TCP
8.2.3.7 案例七:没有其它规则处理的 UDP 流量都会被拒绝
# nft add rule inet filter input ip protocol udp reject
8.2.3.8 案例八:没有其它规则处理的 TCP 流量都会被拒绝
# nft add rule inet filter input ip protocol tcp reject with tcp reset
8.2.3.9 案例九:没有其它规则处理的 ICMP 流量都会被拒绝
# nft add rule inet filter input counter reject with icmp type prot-unreachable
8.2.3.10 案例十:对所有访问者开放某一个端口
# nft add rule inet filter TCP tcp dport 80 accept
(补充:这里以对所有访问者开放 80 端口为例)
8.2.3.11 案例十一:拒绝某一个 IP 地址访问某一个端口
# nft add rule inet filter input ip saddr 172.16.0.6 tcp dport 22 drop
(补充:这里以拒绝 172.16.0.6 的 TCP 22 端口为例)
8.2.3.12 案例十二:某一个端口除了某一个 IP 地址以外的所有禁止访问
# nft add rule inet filter input ip saddr 172.16.0.1 tcp dport 22 accept
# nft add rule inet filter input tcp dport 22 drop
(补充:这里以拒绝除 172.16.0.1 以外的所有 IP 地址访问 TCP 22 端口为例)
8.2.3.13 案例十三:将朝向某一个 IP 地址的某一个端口指向另一个 IP 地址的某一个端口
# nft add rule filter input ip daddr 172.16.1.1 tcp dport 80 counter dnat 172.16.1.2:80
(补充:这里以将访问 172.16.1.1 的 80 端口指向 172.16.1.2 的 80 端口为例)
8.2.3.14 案例十四:将朝向某一个 IP 地址的流量指向另一个 IP 地址
# nft add rule filter input ip saddr 172.16.1.2 tcp sport 80 counter dnat 192.168.1.2
(补充:这里以将访问 172.16.1.2 的所有流量指向 172.16.1.2 为例)
8.2.4 nftiptables 备份和恢复的案例
8.2.4.1 备份 nft 规则
# nft list ruleset > /root/nftables
(补充:这里以将 ruleset 规则备份到 /root/nfttables 文件为例)
8.2.4.2 恢复 nft 规则
# nft -f /root/nftables
(补充:这里以恢复 /root/nftables 文件里的 nft 规则为例)
在所有规则后面添加以下两条规则:
......
# iptables -A INPUT -i -p tcp -j LOG --log-prefix "IPTABLES TCP IN: "
# iptables -A INPUT -i -p tcp -j DROP
(补充:这里以记录进来的数据并将 IPTABLES TCP IN: 作为前缀保存日志为例)
在所有规则后面添加以下两条规则:
......
# iptables -A INPUT -i -p tcp -j LOG --log-prefix "IPTABLES TCP OUT: "
# iptables -A INPUT -i -p tcp -j DROP
(补充:这里以记录进来的数据并将 IPTABLES TCP OUT: 作为前缀保存日志为例)
在所有规则后面添加以下两条规则:
......
# iptables -A INPUT -i -p tcp -j LOG --log-prefix "IPTABLES TCP ICMP: "
# iptables -A INPUT -i -p tcp -j DROP
(补充:这里以记录进来的数据并将 IPTABLES TCP ICMP: 作为前缀保存日志为例)
# cat /log/var/message