问题描述
在自建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专有网络