nftables 重要规则进行日志记录,并配置日志切割、nftables 规则固定到文件,保证重启不丢失。
最后更新时间:2021/7/13
根据官方 wiki 中Logging traffic[1]这篇文章的说明:从 Linux 内核 3.17 开始提供完整的日志支持。如果您运行较旧的内核,则必须 modprobe ipt_LOG 以启用日志记录。从 nftables v0.7 开始,支持 log 标志。
那么我们的内核是5.13.0-1.el7.elrepo.x86_64
,nftables 版本是nftables v0.8 (Joe Btfsplk)
,应该不需要手动加载内核模块。
前置条件:
openvpn 网卡 tun0、openvpn 用户虚拟 IP 网段为 10.121.0.0/16;
wireguard 网卡 wg0、wireguard 虚拟 IP 网段 10.122.0.0/16;
1. nftables 规则创建及测试
我这边需要在这台 VPN 中枢服务器进行路由转发和控制,并且需要监控哪个 VPN 用户访问了哪些服务的日志;
1.1. 简单测试-权限粒度从 ip 到目的 ip.端口
首先测试确定的用户虚拟 IP 到确定的服务器的控制转发规则:
## 添加单条规则如下:
nft add rule ip nat POSTROUTING oifname eth0 ip saddr 10.121.6.6 ip daddr 192.168.5.71 counter log masquerade
nft add rule ip nat POSTROUTING oifname eth0 ip saddr 10.121.6.6 ip daddr 10.10.210.9 counter log masquerade
## 查询到的规则如下
table ip filter {
chain INPUT {
type filter hook input priority 0; policy accept;
counter packets 248456 bytes 62354809 ## handle 4
}
chain FORWARD {
type filter hook forward priority 0; policy accept;
iifname "wg0" counter packets 97 bytes 6924 accept ## handle 5
oifname "wg0" counter packets 121 bytes 7776 accept ## handle 6
}
chain OUTPUT {
type filter hook output priority 0; policy accept;
}
}
table ip nat {
chain PREROUTING {
type nat hook prerouting priority 0; policy accept;
}
chain INPUT {
type nat hook input priority 0; policy accept;
}
chain OUTPUT {
type nat hook output priority 0; policy accept;
}
chain POSTROUTING {
type nat hook postrouting priority 0; policy accept;
counter packets 76584 bytes 5488498 ## handle 7
oifname "eth0" ip saddr 10.121.6.6 ip daddr 192.168.5.71 counter packets 1 bytes 60 log masquerade ## handle 27
oifname "eth0" ip saddr 10.121.6.6 ip daddr 10.10.210.9 counter packets 0 bytes 0 log masquerade ## handle 28
}
}
openvpn 客户端 ping 10.10.210.9 和 192.168.5.71 测试,查看日志 tail -100f /var/log/nftables.log,需要先做第二步骤的日志设置
值得注意的是,短时间内再次 ping 同一个 IP 的话,不会出现新的记录,conntrack -E
看也是一样的,有网友说可能是按照比例输出的日志,后面根据生产经验看其实日志是有的,只不过 tail 没全部展现。
Jul 9 17:32:12 test-openvpn kernel: IN=tun0 OUT=eth0 MAC= SRC=10.121.6.6 DST=10.10.210.9 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=59753 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=716
Jul 9 17:32:17 test-openvpn kernel: IN=tun0 OUT=eth0 MAC= SRC=10.121.6.6 DST=192.168.5.71 LEN=60 TOS=0x00 PREC=0x00 TTL=127 ID=36231 PROTO=ICMP TYPE=8 CODE=0 ID=1 SEQ=720
1.2. 权限粒度控制到网段
若要对用户以及目的地址进行批量配置和控制用户可以目的地址的粒度
需要新增VPN 用户虚拟 IP 集合、目的服务集合(粒度到端口)、目的服务器(粒度服务器或网段);
然后用三条规则控制这样的处理流程。以下是三个集合的创建和新增规则过程【只需要关注 nat 表的 POSTROUTING 链即可】:
我们需要将刚才的表删掉nft delete table filter
、nft delete table nat
,并从头创建覆盖范围更广的通用规则:
## -i参数进入交互模式 从头开始创建表filter、nat以及链和新增规则
nft -i
add table ip filter
add chain ip filter INPUT { type filter hook input priority 0; policy accept; }
add chain ip filter FORWARD { type filter hook forward priority 0; policy accept; }
add chain ip filter OUTPUT { type filter hook output priority 0; policy accept; }
add table ip nat
add chain ip nat PREROUTING { type nat hook prerouting priority 0; policy accept; }
add chain ip nat INPUT { type nat hook input priority 0; policy accept; }
add chain ip nat OUTPUT { type nat hook output priority 0; policy accept; }