三步搭建VPC专有网络NAT网关,配置SNAT和DNAT规则
搭建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就行,如果没有这一条,手动加进去。
保存退出,然后使用 sysctl -p 命令使上面的修改生效。
第二步:设置VPC路由条目
这一部需要在阿里云控制台操作,添加一条VPC的路由条目
找不到在哪的可以参考视频教程https://help.aliyun.com/video_detail/54653.html
在VPC的路由表中,添加如下一条路由条目。
其中目标网段一定要填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
然后重启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转发规则:
前后端口映射不一致怎么办?简单啊,在/etc/sysconfig/iptables内的目标IP后面直接加特定的端口号就行
也是同样的,最后重启iptables使规则生效:
systemctl restart iptables.service
测试正常。
如果不生效,请检查是否是同一VPC内,iptables规则是否有冲突。如果ECS内安装了docker,docker自带的nat转发规则会有影响,需要合理的网段规划和路由规划。
DONE!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
常用命令集合
# dd if=/dev/zero of=/dev/null zero源源不断的产生数据到黑洞null # dd if=/dev/zero of=/data/a.tgz bs=1M count=100 zero产生100M的数据到/data/a.tgz Shift trl T 打开新的终端页面 # echo 123 | passwd --stdin root 开机默认修改root密码 # cat /etc/services | less 查看端口号 # convmv -f GB2312 -t utf8 -r --notest 目录 乱码转换工具convmv # cp /etc/vsftpd/vsftpd.conf{,.bak} 快速备份 # cp /etc/vsftpd/vsftpd.conf{.bak,} 备份覆盖 # yum search elinks // # yum provides "*/elinks" 查询软件包名 # ps aux | grep httpd 查看进程 最小安装rhel图形界面: # yum -y groupinstall "Desktop" "Fort" ...
- 下一篇
Docker实战(二)之操作Docker容器
容器是Docker的另外一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统系统(包括内核,应用运行态环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立的一个或一组应用,以及它们所必需的运行环境。 1.创建容器 (1)新建容器 docker create -it ubuntu:latest 通过docker ps -a命令可以查看所有容器 使用docker create命令新建的容器处于停止状态,可以使用docker start命令启动它。 (2)启动容器 docker start CONTAINER ID(容器ID) docker ps 命令可以查看一个运行中的容器 (3)新建并启动容器 除了创建容器后通过start命令来启动,也可以直接新建并启动所有容器。所需要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。 下面示例: 这跟在本地直接执行/bin/echo 'hello world'几乎感...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Hadoop3单机部署,实现最简伪集群
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境