我想重写离开 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 转发的数据包。该地址可以分配给任何内部接口,例如lo
或dummy0
。
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_announce
on是没有用的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