使用 Linux IPTables 进行一对一 NAT 不起作用

使用 Linux IPTables 进行一对一 NAT 不起作用

我正在尝试在 Linux 机器上实现 1 对 1 NAT。设置非常简单,它有两个接口,eth0 是外部接口,eth1 是内部接口。eth1 后面是隔离的 192.168.100.0/24 网络,而 eth0 连接到 192.168.0.0/24 上的其余网络(此网络无关紧要)。我想要做的是允许隔离网络使用不同网络的外部 IP 地址 192.168.50.0/24 通过 Linux 机器进行通信。因此,基本上 Linux 机器将内部网络的 192.168.100.10 NAT 到从 Linux 机器路由出的 192.168.50.10。我已经设置了路由,将发往 192.168.50.0/24 的流量指向所有外部设备上的 Linux 机器的 eth0 接口。

此时,发往 192.168.50.0/24 的流量到达 Linux 机器的 eth0,但似乎从未转换过,因为我从未在内部 eth1 接口上看到任何发往 192.168.50.10 或 192.168.100.10 的流量。以下是我的基本 NAT 配置。我的问题是,我需要做其他事情吗?我没有费心在 Linux 机器上为 192.168.50.0/24 网络添加路由,因为由于此 NAT 配置,该机器从不路由具有该地址的数据包。

出站规则

-A POSTROUTING -o eth0 -s 192.168.100.10 -j SNAT --to-source 192.168.50.10

入站规则

-A PREROUTING -i eth0 -d 192.168.50.10 -j DNAT --to-destination 192.168.100.10

临时规则允许所有流量

-A INPUT -j ACCEPT
-A FORWARD -j ACCEPT

请注意,默认情况下,所有其他流量也允许通过 iptables,因此这不应该是一个阻塞问题。

答案1

您需要确认已满足以下条件:

  1. 使用以下方法启用 IP 转发:echo 1 > /proc/sys/net/ipv4/ip_forward或者通过设置中的相应行/etc/sysctl.conf
  2. 允许流量通过该框,根据您的描述应该没问题。
  3. 按照你的描述设置所需的 NAT 规则就可以了。
  4. 如果路由 IP 属于不直接连接到 Linux 路由器的子网,则设置所需的路由(静态或动态)。根据您的描述,这也应该没问题。

看来你只剩下第一点了!

答案2

这可能是 ARP 问题。请参阅Shorewall 一对一 Nat注释。对于此类事情,我倾向于使用像 Shorewall 这样的防火墙构建工具。

相关内容