三步搭建VPC专有网络NAT网关

参考链接 https://developer.aliyun.com/article/607330?spm=5176.smartservice_service_robot_chat_new.0.0.76533cdaL0De0p

重启有公网的ecs之后 需要执行 iptables -t nat -I POSTROUTING -s 172.16.0.0/16 -j SNAT –to-source 172.16.2.9

搭建NAT网关就是为了实现在相同VPC内,没有公网IP的ECS借助有公网的ECS访问外网,或者是外网通过端口映射访问到内网服务器。

SNAT:实现没有公网IP的ECS实例借助有公网的ECS访问外网,但是外网无法访问到内网IP;

DNAT:实现外网通过端口映射访问到内网服务器,但是不能实现内网ECS访问到外网。

一共三个步骤:

第一步:开启ECS的ip转发功能

这步只在有公网的ECS上操作:

vi /etc/sysctl.conf

找到 net.ipv4.ip_forward = 1 这一条,确保后面的值为1就行,如果没有这一条,手动加进去。

697c983cf08a99f21a04bbb74bb40608e7e09acb

保存退出,然后使用 sysctl -p 命令使上面的修改生效。

fd431fe987f4d1f303c83716f1190942f33f0f3a

第二步:设置VPC路由条目

这一部需要在阿里云控制台操作,添加一条VPC的路由条目

找不到在哪的可以参考视频教程https://help.aliyun.com/video_detail/54653.html

在VPC的路由表中,添加如下一条路由条目。

5883cab1fee276485c56cd343d14c40e14b8a819

其中目标网段一定要填0.0.0.0/0

ECS实例选择有公网IP的那个实例。

第三步:设置iptables 的NAT转发规则

1、设置SNAT规则

就一条命令搞定,别直接复制啊,需要根据你的实际情况改一下IP地址:

iptables -t nat -I POSTROUTING -s 172.16.0.0/16 -j SNAT –to-source 172.16.107.49

可以这样理解 iptables -t nat -I POSTROUTING -s VPC的IP段 -j SNAT –to-source 有公网IP的ECS内网IP
回车执行后要永久生效,还需要保存在iptables配置文件中:

service iptables save

如果使用vi /etc/sysconfig/iptables命令查看iptables配置文件,就会发现多了一条nat表的snat转发规则:

5d3d6c2fa0c6dd70d0503b055bf0adcfc0026154

然后重启iptables使规则生效:

systemctl restart iptables.service

现在没有内网的ECS就可以访问公网了。

2、设置DNAT规则

DNAT需要两条命令:

同样不要照搬复制,需要根据你的实际情况修改下IP

iptables -t nat -I PREROUTING -p tcp –dport 80 -j DNAT –to 172.16.93.38
iptables -t nat -I POSTROUTING -p tcp –dport 80 -j MASQUERADE
可以这样理解:

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 80端口映射到了172.16.93.38这个内网实例的80端口。

回车执行后要永久生效,还需要保存在iptables配置文件中:

service iptables save

同样的,如果使用vi /etc/sysconfig/iptables命令查看iptables配置文件,就会发现多了两条nat表的dnat转发规则:

134a528b2498f19649be73759e665a323a83607e

前后端口映射不一致怎么办?简单啊,在/etc/sysconfig/iptables内的目标IP后面直接加特定的端口号就行

ea43d78175c870d40dbf4c1709a51dc73e5b888f

也是同样的,最后重启iptables使规则生效:

systemctl restart iptables.service

测试正常。

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


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!