场景概述

公司计划在阿里云云上部署一套微服务应用,在规划资源布局时,云服务资源排布是必经之路。因此,作为运维要为企业成本考虑之一,即是砍掉云服务器公网EIP地址,实现分布式内网互通,统一网关出口的策略。

  • 搭建NAT网关就是为了实现在相同VPC内,没有公网IP的ECS借助有公网的ECS访问外网,或者是外网通过端口映射访问到内网服务器。
    SNAT:实现没有公网IP的ECS实例借助有公网的ECS访问外网,但是外网无法访问到内网IP;
    DNAT:实现外网通过端口映射访问到内网服务器,但是不能实现内网ECS访问到外网。SNAT,DNATP逻辑示意图

示意图,仅供参考

一、在具有公网EIP的ECS服务器操作,开启ECS的IP转发功能

[root@data ~]# vim /etc/sysctl.conf
或者
# 开启转发
[root@data ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# 刷新生效
[root@data ~]# sysctl -p

修改net.ipv4.ip_forward = 1        //确保值为1,如若没有这一条,手动加保存

云服务无公网EIP基于IPtables配置SNAT,DNAT实现内外网访问(图1)

二、设置阿里云VPC路由规则

此步骤在阿里云VPC管理界面操作,地址如下:https://vpc.console.aliyun.com/vpc/cn-qingdao/route-tables,单机路由实例即可进入下图界面,其中目标网段一定要填0.0.0.0/0,ECS实例选择具有公网IP的那个实例

云服务无公网EIP基于IPtables配置SNAT,DNAT实现内外网访问(图2)

三、配置Iptables 的NAT转发规则

1、设置SNAT规则转发规则

#执行生效
[root@data ~]# iptables -t nat -I POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 172.16.107.49
#永久生效,保存配置文件
[root@data ~]# service iptables save

注解:iptables -t nat -I POSTROUTING -s 【VPC的IP段】 -j SNAT --to-source 【有公网IP的ECS内网IP】

2、查看规则状态

查看iptables配置文件,就会发现多了一条nat表的snat转发规则

[root@data ~]# cat /etc/sysconfig/iptables
云服务无公网EIP基于IPtables配置SNAT,DNAT实现内外网访问(图3)

重启iptables服务

[root@data ~]# systemctl restart iptables.service

至此,无公网IP的阿里云ECS服务器可以访问外网了。

四、设置DNAT规则

1、配置DNAT规则,两条命令

[root@data ~]# iptables -t nat -I PREROUTING -p tcp --dport 443 -j DNAT --to 172.16.16.16
[root@data ~]# iptables -t nat -I POSTROUTING -p tcp --dport 443 -j MASQUERADE
#永久生效,保存配置文件
[root@data ~]# service iptables save

注解
iptables -t nat -I PREROUTING -p tcp --dport 【有公网IP的ECS端口号】 -j DNAT --to 【目标内网ECS的内网IP】
iptables -t nat -I POSTROUTING -p tcp --dport 【有公网IP的ECS端口号】 -j MASQUERADE

此示例中,是把有公网IP的ECS 443端口映射到了172.16.16.16这个内网实例的443端口

如果需要前后端口映射不同端口,配置如下vim /etc/sysconfig/iptables内的目标IP后面直接加特定的端口号就行

[root@data ~]# vim /etc/sysconfig/iptables

修改无公网IP服务器的内网地址后加端口号,重启即可
云服务无公网EIP基于IPtables配置SNAT,DNAT实现内外网访问(图4)

2、查看规则状态

查看iptables配置文件,就会发现多了一条nat表的dnat转发规则

[root@data ~]# cat /etc/sysconfig/iptables
云服务无公网EIP基于IPtables配置SNAT,DNAT实现内外网访问(图5)

重启iptables服务

[root@data ~]# systemctl restart iptables.service


验证如果不生效,请检查是否是同一VPC内,iptables规则是否有冲突。如果ECS内安装了docker,docker自带的nat转发规则会有影响,需要合理的网段规划和路由规划。

3、常见问题汇总

  • 配置完SNAT后,如果不成功答:输入命令iptables -S 检查下有公网ip的服务器,如果是 -P FORWARD DROP 的话,执行命令 iptables -P FORWARD ACCEPT 改成 -P FORWARD ACCEPT 就可以了。
  • 系统是ubuntu16.04。实测到第3步,只需要到service iptables save即可。而且service iptables save在ubuntu上会报错,改成iptables-save即可。之后同vpc下的ecs/eci直接能访问外网。
  • 怎么安装iptables?答:
service iptables status         #检查是否安装了iptables 
yum install -y iptables         #安装iptables 
yum update iptables             #升级iptables 
yum install iptables-services   #安装iptables-services 
systemctl disable iptables      #禁止iptables服务 
systemctl stop iptables         #暂停服务 
systemctl enable iptables       #解除禁止iptables 
systemctl start iptables        #开启服