自建SNAT策略后网络不通

问题描述

在自建SNAT策略后,经常会出现访问资源不通的情况。

问题原因

  • 没有开启内核路由转发。

  • VPC上的VRoute路由配置问题。

  • timestamps的原因。

  • 安全组的原因。

  • SNAT网关上IPtables FORWARD链的问题。

  • MTU的问题。

解决方案

没有开启内核路由转发

在网关上开启ip_forward后,到达网关的请求才会被iptables转发出去。所以一定要先开启ip_forward。执行如下命令,如果返回1说明已开启。

more /proc/sys/net/ipv4/ip_forward

VPC上的VRoute路由配置问题

在网关上自建SNAT策略后,在网络访问过程中,先由客户端ECS发起请求,然后需要把这个请求转发到网关的ECS上。所以需要在VPC上的VRoute上配置相应的路由指向到这台网关的ECS上。如下图所示。

timestamps的原因

根据tcp_timestamps选项的特性。

  • 当Server端tcp_tw_recycle和tcp_timestamps的值都是1的时候,在60秒内检查收到数据包TCP选项字段中的timestamp值。

  • 当同一个IP地址后来的数据包中TCP选项字段如果有timestamp,且比前面的数据包中的timestamp小,则Server不做ACK响应。

所以会造成Ping正常。Telnet端口不通的现象。并且是同一个SNAT作用域下,部分机器能通,部分机器不通。

解决办法如下所示:

  • 客户端关闭tcp_timestamps。

  • 服务端关闭tcp_tw_recycle。

根据实际情况关闭其中一端即可,无需服务端和客户端同时关闭。

安全组的原因

自建SNAT策略的网关是通过ECS搭建,所有客户端ECS的请求会到达该网关ECS上,所以要保证客户端ECS和网关ECS之间网络通信正常。因此在ECS层面,如果不在同个安全组下,需要安全组之间互相打通。

SNAT网关上iptables的FORWARD链的问题

iptables的内部转发原理,如下图所示。 根据该图可得如下结论:

  • 当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中可以修改数据包的目的IP,然后内核的路由模块根据数据包目的IP以及内核中的路由表判断是否需要转送出去。

  • 如果数据包的目的IP是本机的网口IP,数据包就会到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。

  • 本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROTING链输出。

  • 如果数据包的目的IP地址不在当前子网中,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

所以在网关上的iptales的FORWARD链尽量默认允许访问。

MTU的问题

在某些情况下,如果客户端ECS和网关ECS对MTU设置不同,也可能会出现网络不通的情况。所以请保证两端MTU的值一致。

适用于

  • VPC专有网络