使用 nftables 查看 NAT 连接

Tom*_*ato 4 nat nftables

如何使用 nftables 跟踪 nat 传出连接。只需要查看 nat 统计信息,即或多或少使用了哪些输出地址。

root@nat-1:~# nft list table nat
table ip nat {
    chain post {
            type nat hook postrouting priority 100; policy accept;
            ip saddr 10.0.0.0/8 oif "bond0.926" snat to 19.246.159.1-19.246.159.7
    }

    chain pre {
            type nat hook prerouting priority -100; policy accept;
    }
}
Run Code Online (Sandbox Code Playgroud)

netstat-nat 适用于 iptables,但不再适用于 nftables。

netstat-nat -S
Could not read info about connections from the kernel, make sure netfilter is enabled in kernel or by modules.
Run Code Online (Sandbox Code Playgroud)

我当然可以使用 tcpdump,但应该有一些更好的实用程序;-)

A.B*_*A.B 8

iptablesnftables不执行 NAT:netfilter执行此操作。iptablesnftables使用挂钩到netfilter来发出一些“命令”来创建新的 NAT 状态。完成后,所有这些都由netfilter直接处理(这就是为什么对于iptablesnftables来说,只看到 nat 表/类型的第一个数据包)。所以最终 NAT 状态守护者是 netfilter 及其 conntrack 子系统。

现在,netstat-nat使用内核提供的文件/proc/net/nf_conntrack来显示 conntrack 信息。如果此文件不可用(例如:没有完整的 root 权限、在不映射这部分的容器中运行/proc等),您可能会收到错误。我不知道为什么不是,但无论如何,这是特定的 conntrack 后端工具:(conntrack来自conntrack-tools)它完全依赖于较新的 API ( netlink ) 而不是/proc. 从其联机帮助页来看,等效的命令(当然具有完全不同的输出)将是:

conntrack -L -n
Run Code Online (Sandbox Code Playgroud)

命令
[...]
-L --dump
    列出连接跟踪或期望表
[...]
-E, --event
    显示实时事件日志。
[...]

过滤参数
[...]
-n, --src-nat
    过滤源 NAT 连接。

您甚至可以使用事件模式实时跟踪源 NAT 状态:

conntrack -E -n 
Run Code Online (Sandbox Code Playgroud)