我有一台 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
。