使用 iptables 重写 TCP 回复中的源 IP

使用 iptables 重写 TCP 回复中的源 IP

我想重写离开 Redhat 机器的 TCP/514 流量上的源 IP,以用于不是从该机器发起的连接。

机器在接口(例如 10.10.0.20)上接收 TCP/514 流量,然后我想返回流量,就好像回复来自 10.10.0.15(未分配给机器)。

如果我正在启动连接,那么我可以使用 nat 表,并且:

iptables -A POSTROUTING -t nat -p tcp --sport 514 -j SNAT --to=10.10.0.15

..但是由于我正在回复传入流量,因此我无法使其到达 nat 表(据我所知)。忽略原因为什么我需要这样做,我怎样才能做到这一点?

更多背景:

它是一台 Redhat 7 机器,位于 Netscaler VIP 后面,通过 TCP(不是 UDP)接收系统日志流量。我在 VIP 上使用客户端 IP 直通。由于防火墙看到来自系统日志服务器 IP 的返回流量,而不是 VIP 的 IP,因此防火墙正在丢弃流量,因此我想重写来自系统日志服务器的 TCP 回复,以便它们来自 VIP 的 IP 地址。由于流量不是来自后端服务器,我似乎无法使用 nat 表(因此无法使用-j SNAT)。

我现在看到的是:

13:13:45.439683 IP 10.10.0.8.31854 > 10.10.0.20.514: Flags [S], seq 544116376, win 8190, options [mss 1460], length 0
13:13:45.439743 IP 10.10.0.20.514 > 10.10.0.8.31854: Flags [S.], seq 4163333198, ack 544116377, win 14600, options [mss 1460], length 0

我想看到的是:

13:13:45.439683 IP 10.10.0.8.31854 > 10.10.0.20.514: Flags [S], seq 544116376, win 8190, options [mss 1460], length 0
13:13:45.439743 IP 10.10.0.15.514 > 10.10.0.8.31854: Flags [S.], seq 4163333198, ack 544116377, win 14600, options [mss 1460], length 0

答案1

DSR法

最有效的方法是在 Netscaler 上正确配置直接服务器返回模式,其中 Netscaler 执行基于 MAC 的转发到系统日志服务器,且目标 VIP 地址不变 (10.10.0.15)。

系统日志服务器还需要具有该 VIP 地址才能接收从 Netscaler 转发的数据包。该地址可以分配给任何内部接口,例如lodummy0

ip addr add 10.10.0.15/32 dev lo

而且你必须在传入接口上设置一些sysctls(这里我假设eth0)以避免VIP 的 ARP 问题(看6.7.治愈方法:2.6.x 内核 - arp_ignore/arp_announce)。添加以下内容/etc/sysctl.conf并运行sysctl -p

net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2

arp_ignore请注意,设置/ arp_announceon是没有用的lo

DNAT法

如果 Netscaler 对传入流量进行 DNAT,那么 syslog 服务器肯定也应该将返回流量转发到 Netscaler,以便它可以释放连接跟踪资源。这是完成地址转换的最自然的方式。

在这种情况下,您可能希望利用系统日志服务器上的策略路由。通过此功能,您可以在特定条件下将特殊的路由表应用于数据包,例如“从端口 514 传出的 TCP 数据包”。

有关于 Linux 高级路由的 HOWTO 文档,如下所示。我建议您阅读后面的迷你 HOWTO 以理解以下说明。

VIP首先,定义以任意 ID命名的特殊路由表/etc/iproute2/rt_tables

1 VIP

将到 VIP (10.10.0.15) 的默认路由添加到此VIP表中:

ip route add default via 10.10.0.15 table VIP

在 iptablesmangle表中添加一个条目以标记1从端口 514 发出的 TCP 数据包:

iptables -t mangle -A OUTPUT -p tcp --sport 514 -j MARK --set-mark 1

添加一条规则来查找VIP带有 mark 的数据包的路由表1

ip rule add from all fwmark 1 table VIP

您可以看到迄今为止由 定义的规则ip rule list。规则按照优先级值的升序进行处理(0 是最高优先级)。

# ip rule list
0:  from all lookup local 
32765:  from all fwmark 0x1 lookup VIP 
32766:  from all lookup main 
32767:  from all lookup default 

您可以像这样检查每个路由表的内容:

# ip route ls table local
# ip route ls table VIP
# ip route ls table main

相关内容