我们正处于这种不寻常的情况,我们正试图连接到 AWS 中的 Kafka Broker,但无法直接通过我们的 DC 访问它们。但我们可以使用一个端点(将代理置于 NLB 后面),该端点可以从我们的 DC 前往 AWS。
我们的想法是,我们可以以某种方式修改 IPtables,并在有人试图访问代理 ip 时将流量重定向到该端点。从高层次上讲,我们位于具有两个外部地址的内部 DC 中:addr1:port1 和 addr2:port2,我们可以访问/telnet 到第二个,因此我们希望将所有流量从 addr1:port1 重定向到该端点。
我们尝试了以下 PREROUTING 和 POSTROUTING 规则:
iptables -t nat -A PREROUTING -d addr1 -p tcp -m tcp --dport 9094 -j DNAT --to-destination addr2:36379 iptables -t nat -A POSTROUTING -p tcp -d addr2 --dport 36379 -j SNAT --to-source addr1:9094
但是没有成功,我们是不是遗漏了什么?完成此转发配置后,我们应该能够远程登录到第一个地址 (addr1),不是吗?
答案1
您无法在两个不同的系统旁边进行双向 TCP 通信,如果两者都位于 NAT 之后,那么您就无法控制它,而且它也对您没有帮助。
这是因为设置 TCP 端口通常是在某个配置文件中为某个程序提供一个 IP 和一个端口值。将传入的数据包转发到另一个 ip/端口很容易。
然而,就 TCP 而言,还发生了更多的事情:
- 发送连接请求数据包
- 服务器用另一个数据包确认
- 客户端发送第一个数据
因此,虽然 TCP 通信是对称的,但 TCP 握手不是。因此,简单的数据包修改/转发无法将传出的 TCP 请求转换为传入的请求。不仅没有用于此目的的 iptables 模块,而且即使按照协议也不可能。
请注意,AWS 机器的防火墙通常并非完全无法配置,只是看起来比较难。
连接两个系统均位于 NAT 后面的问题在各种对等协议的开发中首次出现。例如,许多 bittorrent 客户端能即使双方都在 NAT 后面,也可以相互通信。这是您将来可能的研究方向。
然而,商业解决方案可能是以下之一:
- 配置他们的防火墙(是的,我知道,我所有的客户都需要经过一番努力才能最终做到这一点。有时他们只有删除整台机器才能做到这一点。但这是可以完成的。)
- 通过 VPN 将两者连接到第三台机器。
- 不使用 AWS 等(我个人更喜欢这样,但通常我们需要适应)