1.使用iptables

1.使用iptables

我有一台 Linux 机器 (RHEL 6.7),在单个 NIC (eth1) 上配置了 2 个 IP。主地址(即所有流量似乎来自的地址)是 10.0.0.23。另一个是10.0.0.160。

我正在寻找一种使用 iptables 根据数据包的目标地址更改源 IP 的方法。通常情况下,流量将在 10.0.0.23 上“流出”,但假设我的数据包的目的地是 10.0.0.1,我希望该数据包在 10.0.0.160 上“流出”。

原因是网络上的防火墙不受我的控制。有规则允许从 10.0.0.160 到 10.0.0.1 的流量,但不允许从 10.0.0.23 到 10.0.0.1 的流量。

我不希望所有流量都源自 10.0.0.160,只希望发往 10.0.0.1 的流量。

我正在考虑使用 nat 表,也许还有预路由规则,但没有找到更改源地址的方法。如果有帮助的话,我可以为 eth1 创建一个别名(这样就会有 eth1 和 eth1:0),但想看看当前配置中是否有解决方案。

预先感谢您的任何建议。

答案1

以下是实现所需行为的两种不同方法:

1.使用iptables

SNAT中的目标允许iptables根据您的要求修改源地址。的手册页iptables 扩展有这样的说法SNAT

该目标仅在 nat 表、POSTROUTING 和 INPUT 链以及仅从这些链调用的用户定义链中有效。它指定应修改数据包的源地址(并且此连接中的所有未来数据包也将被破坏),并且应停止检查规则。

根据您的问题,以下规则将更改发往 的数据包的源10.0.0.1地址10.0.0.160

$ iptables -t nat -A POSTROUTING --destination 10.0.0.1/32 -j SNAT --to-source 10.0.0.160

2. 使用静态路由

或者,不使用iptables规则,而是使用以下语法将目标主机的静态路由添加到路由表中:

$ ip route add <destination>/32 via <gateway> src <alias>

根据您提供的信息,您将使用:

$ ip route add 10.0.0.1/32 via <gateway> src 10.0.0.160

替换<gateway>为网关的实际 IP 地址,因为您的问题中未提供此地址。

目的地的流量10.0.0.1现在将源自10.0.0.160。任何其他流量均采用源自 的默认路由10.0.0.23

相关内容