iptables:如果目标地址匹配,则更改本地源地址

eli*_*zka 9 linux 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),但想看看当前配置中是否有解决方案。

提前感谢您的任何建议。

sou*_*ake 11

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

1. 使用iptables

该SNAT靶iptables可为您请求的源地址进行修改。iptables-extensions的手册页有这样的说法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
Run Code Online (Sandbox Code Playgroud)

2. 使用静态路由

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

$ ip route add <destination>/32 via <gateway> src <alias>
Run Code Online (Sandbox Code Playgroud)

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

$ ip route add 10.0.0.1/32 via <gateway> src 10.0.0.160
Run Code Online (Sandbox Code Playgroud)

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

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