返回

如何在本地服务器上让数据包绕过 NAT 进入预路由钩子?

Linux

如何让本地服务器的数据包绕过 NAT,进入预路由钩子

问题陈述

有一台服务器监听 localhost 上的服务。出于某些原因,它无法或不想监听 0.0.0.0。因此,从服务器内部无法访问此服务,因为来自服务器的数据包直接进入 filter/input 钩子,而来自网络的数据包则进入 nat/prerouting 钩子。

解决方法

为了解决这个问题,我们需要将来自服务器本身的数据包重定向到预路由钩子。可以使用 nftable 规则来实现这一点。

nftable 规则

table inet trace
delete table inet trace

table inet trace {
        chain input {
                type filter hook input priority filter;
                tcp dport 80 meta nftrace set 1;
                ip saddr 192.168.5.19 counter packets 0 bytes 0 drop
        }
        chain prerouting {
                type nat hook prerouting priority -100;
                tcp dport 80 meta nftrace set 1;
                ip daddr 127.0.0.1 counter packets 0 bytes 0 dnat ip to 192.168.5.19
        }
}

在这个 nftable 规则中,我们使用了 inputprerouting 链来跟踪和重定向数据包。

  • input 链: 此链负责丢弃来自服务器本身的数据包。当我们从服务器本身运行 curl localhost 时,数据包直接进入 input 链,并且被丢弃。
  • prerouting 链: 此链负责重定向来自网络的数据包。当我们从网络的另一个位置运行 curl server-ip 时,数据包进入 prerouting 链,并被重定向到服务器的内部 IP 地址(192.168.5.19)。

通过组合这两个规则,我们可以确保来自服务器本身的数据包被重定向到预路由钩子,从而能够访问监听 localhost 的服务。

常见问题解答

Q1:这个解决方案适用于所有类型的网络拓扑吗?

A1:这个解决方案适用于大多数常见的网络拓扑,其中服务器通过 NAT 设备连接到 Internet。

Q2:我需要修改哪些设置才能让这个解决方案生效?

A2:您需要修改 nftable 规则中的 IP 地址和端口号以匹配您的具体网络设置。

Q3:这个解决方案会影响服务器上的其他服务吗?

A3:否,这个解决方案只影响监听 localhost 的特定服务。

Q4:如何验证这个解决方案是否有效?

A4:您可以从服务器内部运行 curl localhost,并检查服务是否正常工作。

Q5:这个解决方案是否与其他防火墙规则兼容?

A5:这个解决方案与大多数其他防火墙规则兼容。但是,确保 nftable 规则的优先级高于其他规则很重要。