为什么入口数据包无法通过 nftables 获得 DNAT 'edin NAT PREROUTING 链?

问题描述 投票:0回答:1

我有一个用例,其中我想根据某些数据包属性(源 IP、目标端口、协议、入口接口名称等)更改入口数据包的目的地 IP。

这是我的配置:

table inet raw {prerouting hook }
    chain PREROUTING {
        type filter hook prerouting priority -300; policy accept;
        iifname "vnfh0" tcp dport { 21053 } notrack counter packets 413936 bytes 24836160
    }
}

table ip nat {
    chain PREROUTING {
        type nat hook prerouting priority -100; policy accept;
        iif "vnfh0" counter packets 0 bytes 0 tcp dport { 21053 } dnat to 192.168.255.1
    }
}

table ip filter {
    chain INPUT {
        type filter hook input priority 0; policy accept;
        ip saddr 192.168.255.254 ip daddr 192.168.255.253 tcp dport 21053 counter packets 302318 bytes 18139080
        ip saddr 192.168.255.254 ip daddr 192.168.255.1 tcp dport 21053 counter packets 0 bytes 0
    }
}

我们希望 NAT 表中的规则能够更改接收到的数据包的目标 IP 地址。

然而,在 INPUT 链(钩子输入)中,我们看到数据包的目标 IP 仍然是旧的 (192.168.255.253),我们希望在 DNAT 后将其更改为 192.168.255.1。

上述配置需要做哪些修改?

其他详细信息:

vnfh0 是 Linux 主机上的一个接口,它从另一个 lxc-container 接收数据包

=================================================================
    |HOST (root container)                                  |
        |      --------------------------------        |
    |    |                |        |
    |    |    lxc-container        |        |
    |    |    eth0 192.168.255.254    |        |
    |    ------------|--------------------        |
    |        vnfh0    (192.168.255.253)        |
    |          |                    |
    |        ethlmp0 (192.168.255.1)            |
    |                                                |
    |                            |
    |    daemon(192.168.255.1:981)            |
    =========================================================
cd ~
brctl show

输出:

bridge name     bridge id               STP enabled     interfaces
vnfh0           8000.02404380100f       no
  1. 我们尝试通过放置计数器来跟踪网络过滤器中的数据包,但通过跟踪 INPUT 链中的数据包,我们了解到数据包尚未经过 DNATed。
linux firewall lxc netfilter nftables
1个回答
1
投票

您提供的配置使用 nftables 在 Linux 主机上进行数据包处理,旨在在某些条件下更改传入数据包的目标 IP。根据您的描述,nat 表的 PREROUTING 链中的 DNAT 规则确实应该修改符合指定条件的数据包的目标 IP。但是,在 INPUT 链中检查时,您会发现目标 IP 保持不变。

让我们检查一下您的配置并确定潜在问题或必要的说明:

原始表和Notrack:您使用原始表为特定数据包设置notrack。这会阻止对这些数据包的连接跟踪,这可能就是 DNAT 未按预期应用的原因。 DNAT 依靠连接跟踪来修改数据包的目的地并在连接期间维护此映射。如果为数据包设置了 notrack,则 DNAT 规则不会更改其目的地,因为连接跟踪被绕过。

table inet raw {
    chain PREROUTING {
        type filter hook prerouting priority -300; policy accept;
        iifname "vnfh0" tcp dport { 21053 } notrack counter packets 413936 bytes 24836160
    }
}

如果您希望应用 DNAT,您可能需要重新考虑对这些数据包使用 notrack。

NAT 表和 DNAT 规则:您的 nat 表和 PREROUTING 链似乎已正确配置 DNAT。但是,请确保没有其他规则无意中绕过此 DNAT 规则或与此规则发生冲突。

table ip nat {
    chain PREROUTING {
        type nat hook prerouting priority -100; policy accept;
        iif "vnfh0" counter packets 0 bytes 0 tcp dport { 21053 } dnat to 192.168.255.1
    }
}

过滤表和输入链:INPUT 链显示端口 21053 上发往 192.168.255.253 和 192.168.255.1 的数据包的计数器。如果 DNAT 正常工作,您应该看到 192.168.255.1 的计数器递增。由于这种情况没有发生,这进一步表明 DNAT 没有按预期应用。

table ip filter {
    chain INPUT {
        type filter hook input priority 0; policy accept;
        ip saddr 192.168.255.254 ip daddr 192.168.255.253 tcp dport 21053 counter packets 302318 bytes 18139080
        ip saddr 192.168.255.254 ip daddr 192.168.255.1 tcp dport 21053 counter packets 0 bytes 0
    }
}

建议更改:

审查 Notrack:重新评估 notrack 语句对于您的用例是否是必要的。如果需要应用 DNAT,您应该删除或调整 notrack 的使用。

调试:使用nft list规则集全面了解所有nftables规则。仔细查看规则的顺序和特殊性,以确保不存在意外的影子或优先级冲突。

监控和日志:增加 nftables 日志的详细程度或使用 tcpdump 等工具来监控数据包流并验证数据包在何处被丢弃或未按预期更改。

测试隔离:暂时删除 notrack 规则并测试 DNAT 在没有它的情况下是否工作。这可以帮助确定问题是 DNAT 本身还是与 notrack 的交互。

通过解决这些问题,您应该更容易确定 DNAT 在您的设置中未按预期工作的原因。

© www.soinside.com 2019 - 2024. All rights reserved.