我正在设置防火墙规则,尽管我以为自己理解了 netfilter 和 iptables,但我对确切地当您将 net.ipv4.ip_forward 设置为 1 并制定 MASQUERADE 规则时会发生这种情况。
启用转发是否意味着每个传入的 IP 数据包基本上都会根据路由表重新传输和发送?还是只是在所有网络接口上发送?
MASQUERADE 规则是后路由规则,它匹配发送到互联网接口的所有内容。这似乎表明启用转发会将 IP 数据包发送到每个接口,而此 MASQ 规则会为互联网接口执行一些特殊操作(NAT)。
那么我的下一个问题是,如果所有传入 NAT 路由器的流量都只是在 LAN 接口上传输(尽管使用非工作地址)。这是否意味着我需要在 FORWARD 中制定特殊的 DROP 规则以防止生成不必要的流量?
如果是这样,那么这是否意味着对于每个 PREROUTING 规则我都需要在 FORWARD 中再添加一个?
编辑:附注:我的困惑源于我需要执行的一项任务:我将端口 80 转发到内部服务器。这在我们的网络外部运行良好,但当我尝试从网络内部连接到 WAN IP 时,我无法访问它。我的规则是:
iptables -t nat -A PREROUTING -d WANIP -p tcp -m tcp --dport 80 -m comment --comment "Forward www to <machine>." -j DNAT --to-destination 10.50.0.4
答案1
启用转发功能允许机器将数据包路由到其他主机,并且它会查阅路由表并仅将其发送到正确的接口。禁用转发功能后,所有未发送到此机器的数据包都将被丢弃。
但是,每个系统的每个表只有一个实例,而不是每个接口的表。因此,无论数据包被路由到哪里,Netfilter 都会处理它们,您必须在规则中手动过滤目标接口。
伪装将源 IP 地址替换为传出接口的 IP 地址,这样请求看起来就像来自路由器,而不是来自私有 NAT 地址。它还会跟踪连接状态,这样当回复到达时,它们就可以被定向到原始源主机。
DNAT 发生在 PREROUTING 中,而 SNAT/MASQUERADE 发生在 POSTROUTING 中,因此中间的所有步骤(特别是通过 FORWARD 进行过滤)始终会看到有效的“端到端”地址。您必须编写转发规则,就像 NAT 不存在并且您的私有地址空间是可路由的一样。
您的问题很可能源于您的 FORWARD 规则不允许从局域网转发到局域网(在没有那种内部 NAT 的情况下,这是合理的)。由于 DNAT 发生在 FORWARD 之前,因此当 FORWARD 查看它时,目标地址已经更改为局域网地址。
答案2
我解决了这个问题。简而言之,这是因为你连接的机器的回复直接返回 LAN IP,而不是通过路由器返回。本文解释得很好。
除了上面的规则之外,我还制定了这条规则来解决这个问题:
iptables -t nat -A POSTROUTING -p tcp --source 10.50.0.0/16 --dest 10.50.0.4 --dport 80 -j SNAT --to-source 10.50.0.1
10.50.0.1 是路由器,10.50.0.4 是转发到的机器。