aws(学习笔记第七课)
-
AWS
的私有子网使用NAT
服务器
学习内容:
AWS
的私有子网使用NAT
服务器
1. AWS
的私有子网使用NAT
服务器
在上面的例子的网络构成图中,可能会发现一个问题。就是Private Subnet
的Apache server
无法访问互联网。比如,当需要软件更新的时候,或者访问其他web service
的时候,不能实现互联网访问。那么有实现同时让Apache Server
躲在堡垒机后面(没有公网IP
地址),还能兼顾访问互联网吗,这个解决方案就是NAT
服务。
- 首先学习什么是
NAT
-
学习参考
-
NAT
的概念
网络地址转换(NAT)是一种网络技术,用于在不同网络之间转换IP地址。它主要解决了IPv4地址短缺的问题,同时也可以增强网络安全性和提高网络性能。通过在路由器或防火墙设备上配置NAT,可以实现私有网络和公共网络之间的IP地址转换,从而隐藏内部网络的真实拓扑结构。- 静态
NAT
静态 NAT:一对一映射,将一个私有IP地址映射到一个公共IP地址。 - 动态
NAT
动态分配公共IP地址给私有IP地址,使得多个私有IP地址可以共享少量公共IP地址。
- 静态
-
SNAT
和DNAT
SNAT
SNAT
又称源地址转换。源地址转换是内网地址向外访问时,发起访问的内网ip地址转换为指定的ip地址(可指定具体的服务以及相应的端口或端口范围),这可以使内网中使用保留ip地址的主机访问外部网络,即内网的多部主机可以通过一个有效的公网ip地址访问外部网络。- 数据包从内网发送到公网时,SNAT会把数据包的源地址由私网IP转换成公网IP。
- 当相应的数据包从公网发送到内网时,会把数据包的目的地址由公网IP转换为私网IP。
DNAT
DNAT 又称目标地址转换。将私网中web服务器映射到公网IP,使其公网IP作为目标地址被公网中主机进行访问。- 数据包从外网发送到内网时,DNAT会把数据包的目标地址由公网IP转换成私网IP。
- 当相应的数据包从内网发送到公网时,会把数据包的源地址由私网IP转换为公网IP。
-
AWS
中的NAT
实现- 实现之后的网络结构
在这个结构中,位于私有子网的Apache Server
没有直接访问互联网的路由,如果访问互联网0.0.0.0
的场合,将其路由到公网的NAT Server
,这样经过NAT Server
的网络转换,同样能访问互联网。
- 实现之后的网络结构
-
定义
NAT Server
以及Apache Server
的路由指向-
定义
NAT Server
所在的subnet
"SubnetPublicNAT": { "Type": "AWS::EC2::Subnet", "Properties": { "AvailabilityZone": { "Fn::Select": ["0", { "Fn::GetAZs": ""}]}, "CidrBlock": "10.0.0.0/24", "VpcId": { "Ref": "VPC"} } }, "RouteTablePublicNAT": { "Type": "AWS::EC2::RouteTable", "Properties": { "VpcId": { "Ref": "VPC"} } }, "RouteTableAssociationPublicNAT": { "Type": "AWS::EC2::SubnetRouteTableAssociation", "Properties": { "SubnetId": { "Ref": "SubnetPublicNAT"}, "RouteTableId": { "Ref": "RouteTablePublicNAT"} } }, "RoutePublicNATToInternet": { "Type": "AWS::EC2::Route", "Properties": { "RouteTableId": { "Ref": "RouteTablePublicNAT"}, "DestinationCidrBlock": "0.0.0.0/0", "GatewayId": { "Ref": "InternetGateway"} }, "DependsOn": "VPCGatewayAttachment" }, "NetworkAclPublicNAT": { "Type": "AWS::EC2::NetworkAcl", "Properties": { "VpcId": { "Ref": "VPC"} } }, "SubnetNetworkAclAssociationPublicNAT": { "Type": "AWS::EC2::SubnetNetworkAclAssociation", "Properties": { "SubnetId": { "Ref": "SubnetPublicNAT"}, "NetworkAclId": { "Ref": "NetworkAclPublicNAT"} } }, "NetworkAclEntryInPublicNATHTTP": { "Type": "AWS::EC2::NetworkAclEntry", "Properties": { "NetworkAclId": { "Ref": "NetworkAclPublicNAT"}, "RuleNumber": "100", "Protocol": "6", "PortRange": { "From": "80", "To": "80" }, "RuleAction": "allow", "Egress": "false", "CidrBlock": "10.0.0.0/16" } }, "NetworkAclEntryInPublicNATHTTPS": { "Type": "AWS::EC2::NetworkAclEntry", "Properties": { "NetworkAclId": { "Ref": "NetworkAclPublicNAT"}, "RuleNumber": "110", "Protocol": "6", "PortRange": { "From": "443", "To": "443" }, "RuleAction": "allow", "Egress": "false", "CidrBlock": "10.0.0.0/16" } }, "NetworkAclEntryInPublicNATEphemeralPorts": { "Type": "AWS::EC2::NetworkAclEntry", "Properties": { "NetworkAclId": { "Ref": "NetworkAclPublicNAT"}, "RuleNumber": "200", "Protocol": "6", "PortRange": { "From": "1024", "To": "65535" }, "RuleAction": "allow", "Egress": "false", "CidrBlock": "0.0.0.0/0" } }, "NetworkAclEntryOutPublicNATHTTP": { "Type": "AWS::EC2::NetworkAclEntry", "Properties": { "NetworkAclId": { "Ref": "NetworkAclPublicNAT"}, "RuleNumber": "100", "Protocol": "6", "PortRange": { "From": "80", "To": "80" }, "RuleAction": "allow", "Egress": "true", "CidrBlock": "0.0.0.0/0" } }, "NetworkAclEntryOutPublicNATHTTPS": { "Type": "AWS::EC2::NetworkAclEntry", "Properties": { "NetworkAclId": { "Ref": "NetworkAclPublicNAT"}, "RuleNumber": "110", "Protocol": "6", "PortRange": { "From": "443", "To": "443" }, "RuleAction": "allow", "Egress": "true", "CidrBlock": "0.0.0.0/0" } }, "NetworkAclEntryOutPublicNATEphemeralPorts": { "Type": "AWS::EC2::NetworkAclEntry", "Properties": { "NetworkAclId": { "Ref": "NetworkAclPublicNAT"}, "RuleNumber": "200", "Protocol": "6", "PortRange": { "From": "1024", "To": "65535" }, "RuleAction": "allow", "Egress": "true", "CidrBlock": "0.0.0.0/0" } },
-
定义
NAT Server
"NatServer": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": { "Fn::FindInMap": ["EC2RegionMap", { "Ref": "AWS::Region"}, "AmazonLinuxNATAMIHVMEBSBacked64bit"]}, "InstanceType": "t2.micro", "KeyName": { "Ref": "KeyName"}, "NetworkInterfaces": [{ "AssociatePublicIpAddress": "true", "DeleteOnTermination": "true", "SubnetId": { "Ref": "SubnetPublicNAT"}, "DeviceIndex": "0", "GroupSet": [{ "Ref": "SecurityGroup"}] }], "SourceDestCheck": "false", "UserData": { "Fn::Base64": { "Fn::Join": ["", [ "#!/bin/bash -ex\n", "/opt/aws/bin/cfn-signal --stack ", { "Ref": "AWS::StackName"}, " --resource NatServer --region ", { "Ref": "AWS::Region"}, "\n" ]]}} }, "DependsOn": "VPCGatewayAttachment" },
-
将
Apache Server
的互联网0.0.0.0
的连接路由指向NAT Server
"RoutePrivateApacheToInternet": { "Type"
-
-