端口1433上的TCP通信被NAT规则阻塞

我们有一个在AWS上托pipe的SQL服务器,SQL服务器不能在互联网上直接访问,它依靠一个NAT盒来将stream量路由到它。

我们试图从这个服务器到另外一个AWS之外build立一个Linked SQL服务器,这就要求两个SQL服务器在端口1433 TCP上相互交谈。

从iptable的相关部分看起来像这样:

目标prot源的目的地

DNAT udp在任何地方udp dpt:ms-sql -m到:172.10.10.10:1434

DNAT tcp随处可用tcp dpt:ms-sql -s to:172.10.10.10:1433

从我们自己的testing中我们知道,我们可以将任何服务器连接到AWS上的服务器,而不是相反。

有什么看起来不对? 当我们的intfra工程师“删除并添加了相同的规则时,问题就开始发生了”有没有什么线索呢? 是命令相关?

使用tracetcp我们发现了以下内容:

在aws sql server“tracetcp.exe 183.23.53.22 1433”上执行这个命令,其中ip是另一个外部托pipe的服务器的ip,它将在1跳中到达目的地,但是它也会执行相同的任意随机我们试过的IP地址。

在这里输入图像说明

就好像我们做了同样的命令,但在1433以外的其他端口上,它会首先打到NAT盒子,然后做很多跳

在这里输入图像说明

检查您的iptables规则与iptables-save并重新发布它们。 validation您的DNAT规则是否有排除networking内部stream量的方法,例如-i <extif> ! -i <intif> ,或! -s 172.10.10.10 ! -s 172.10.10.10 。 我强烈怀疑这是重新发送您的数据包回到内部原始服务器。

可能是因为你在1433端口上有一个正在运行的代理,这可能会导致你所描述的行为。 代理服务器立即接受到内部机器的连接,这就是为什么你得到2ms这么短的时间响应。

此外,一个很好的指标,你的数据包不离开你的局域网是这么短的回复时间(1-4毫秒)。 如果不小心启动任何代理进程,请尝试检查NAT框,如果不是,请尝试禁用端口1433(tcp)的DNAT规则以查看问题是否仍然存在。

此外,这个声明“不能直接在互联网上访问,它依赖于一个NAT盒来路由stream量”是矛盾的,因为机器可以在互联网上访问,但在特定的端口,通过它进行NAT转换, 对?

如果你真的想保护你的服务,也许考虑某种VPN可能是一个聪明的想法? 或者,如果您想要一个更简单的解决scheme(但不像VPN那么安全),您可能只允许从已知的远程IP地址访问该NATed端口(在某些情况下攻击者可以伪造)。