云服务器无公网EIP基于NAT网关配置SNAT,DNAT公网访问
场景概述
公司计划在阿里云云上部署一套微服务应用,在规划资源布局时,云服务资源排布是必经之路。因此,作为运维要为企业成本考虑之一,即是砍掉云服务器公网EIP地址,实现分布式内网互通,统一网关出口的策略。
- 搭建NAT网关就是为了实现在相同VPC内,没有公网IP的ECS借助有公网的ECS访问外网,或者是外网通过端口映射访问到内网服务器。
SNAT:实现没有公网IP的ECS实例借助有公网的ECS访问外网,但是外网无法访问到内网IP;
DNAT:实现外网通过端口映射访问到内网服务器,但是不能实现内网ECS访问到外网。
示意图,仅供参考
一、在具有公网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,如若没有这一条,手动加保存
二、设置阿里云VPC路由规则
此步骤在阿里云VPC管理界面操作,地址如下:https://vpc.console.aliyun.com/vpc/cn-qingdao/route-tables,单机路由实例即可进入下图界面,其中目标网段一定要填0.0.0.0/0,ECS实例选择具有公网IP的那个实例
三、配置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
重启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服务器的内网地址后加端口号,重启即可
2、查看规则状态
查看iptables配置文件,就会发现多了一条nat表的dnat转发规则
[root@data ~]# cat /etc/sysconfig/iptables
重启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 #开启服
云服务器无公网EIP基于NAT网关配置SNAT,DNAT公网访问
https://cn.10691.cn//archives/10021