我有一个用例,其中我想根据某些数据包属性(源 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
您提供的配置使用 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 在您的设置中未按预期工作的原因。