配置Internal Load balancer中VM的外网访问
当在Azure中部署SQL VM时,处于安全考虑,不会配置VM的Public IP,会禁止外网的进出站访问,只允许从内部VNET,或者特定的内部IP访问。特别是当使用Azure Internal Load Balancer(ILB)配置了AlwaysOn AG的侦听器后,我们本意只允许内部访问。但是总有些特别的需求,需要VM能访问Internet。
为什么单机的 Azure SQL VM能访问外网,当加入到使用了ILB的AlwaysOn AG后就不能访问外网了?
这是最近遇到比较多的一个问题。分析这个问题前,我们需要明白 Azure 的 默认出站访问(Default Outbound Access). 当一个VM或者资源没有以下配置时,Azure会通过默认的SNAT为它们创建出站连接:
- 实例级的Public IP
- 出站规则
- NAT 网关
- Load Balancer
当创建单机 SQL VM后,如果没有配置上面的内容,Azure 会提供一个动态的默认出站访问IP用于外网访问。当把VM加入到ILB之后,Azure 就不再为VM提供这种默认出站访问连接。所以就不能再访问外网了。另外,这里的ILB特指standard ILB,因为Basic ILB不提供SLA保证,不支持HA,也不支持Avalability Zone,一般在SQL VM生产环境不建议使用。
实现ILB中VM出站访问
实现方法有很多种:
方法 | 适用生产环境 | 对比 |
---|---|---|
为VM配置Public IP | Yes | OK |
通过出站规则,使用Public LB的前端IP出站访问 | Yes | OK |
直接使用Public LB的前端IP做入站和出站访问 | No | Bad |
分配NAT网关给VM所在subnet实现出站访问 | Yes | Good |
VNet NAT Gateway 是 Azure 推荐的方式,它的可扩展性,可靠性比其它几种要好。下文就介绍一下这种方式的实现方式。
使用 VNet NAT Gateway 实现ILB中VM的仅出站访问
VNET NAT 简化了虚拟网络的仅出站 Internet 连接。 在子网中配置后,所有出站连接将使用指定的静态公共 IP 地址。 无需使用负载均衡器或将公共 IP 地址直接附加到虚拟机,即可建立出站连接。 NAT 是完全托管式的,且具有很高的复原能力。
可为使用 NAT 为每个子网定义出站连接。 同一虚拟网络中的多个子网可以使用不同的 NAT。 也可以通过指定要使用的 NAT Gateway 来配置子网。 任何虚拟机实例中的所有 UDP 和 TCP 出站流都会使用 NAT。
NAT 可以与 Standard Public IP 地址资源和 Public IP Prefix 共用。 NAT 会将所有流量指向到前缀所表示的 IP 地址范围。 在部署中将任何 IP 加入筛选的过程现在都很简单。
NAT 会自动处理子网的所有出站流量,而无需完成任何定制化配置。 不需要指定用户定义的路由。 NAT 优先于其他出站方案,可替代子网的默认 Internet 目标。
如下内容将使用Azure CLI完成配置过程,主要包括:
- 配置VNET和NAT Gateway
- 配置VM和 Standard ILB
配置完成,大概如下图所示:
RG=ILBNAT-RG
# 创建资源组
az group create --name $RG --location chinanorth2
# 创建 NAT Gateway 出站需要使用的 public ip 资源
az network public-ip create -g $RG --name NAT-PIP \
--sku standard --allocation static
# 创建 NAT Gateway资源
az network nat gateway create -g $RG --name myNATgateway \
--public-ip-addresses NAT-PIP --idle-timeout 10
# 创建 VNET及subnet
az network vnet create -g $RG \
--location chinanorth2 --name myVnet \
--address-prefix 10.1.0.0/16 --subnet-name mySubnet --subnet-prefix 10.1.0.0/24
# 配置对应 subnet使用NAT Gateway
az network vnet subnet update -g $RG \
--vnet-name myVnet \
--name mySubnet \
--nat-gateway myNATgateway
# 创建网线安全组(NSG),因为 Standard LB 要求加入的 VM 的 NIC 属于一个NSG
az network nsg create -g $RG --name myNSG
# 为NSG创建规则,这里以80端口为例,SQL可能需要开放1433
az network nsg rule create -g $RG --nsg-name myNSG \
--name myNSGRuleHTTP \
--protocol '*' \
--direction inbound \
--source-address-prefix '*' \
--source-port-range '*' \
--destination-address-prefix '*' \
--destination-port-range 80 \
--access allow \
--priority 200
# 为VM创建 NIC,使用前面的NSG
for i in {1,2}
do
az network nic create -g $RG --name vmnic$i --vnet-name myVNet \
--subnet mySubnet --network-security-group myNSG
done
# 创建 VM,使用前面的NIC
for i in {1,2}
do
az vm create -g $RG \
--name VM$i \
--nics vmnic$i\
--image win2016datacenter \
--admin-username azureuser \
--no-wait
done
# 为VM安装IIS. 注意,这需要确认VM创建成功后才能执行,create vm 时使用了 --no-wait 参数,让操作在后台执行,不会马上创建成功。
az vm list -g $RG --query "[].{vmName:name,vmState:provisioningState}"
for i in {1,2}
do
az vm extension set \
--publisher Microsoft.Compute \
--version 1.8 \
--name CustomScriptExtension \
--vm-name VM$i \
-g $RG --no-wait
--settings '{"commandToExecute":"powershell Add-WindowsFeature Web-Server; powershell Add-Content -Path \"C:\\inetpub\\wwwroot\\Default.htm\" -Value $($env:computername)"}'
done
# 创建ILB
az network lb create -g $RG --name myILB \
--sku Standard --vnet-name myVnet \
--subnet mySubnet --frontend-ip-name myFrontEnd \
--backend-pool-name myBackEndPool
# 创建ILB的health probe rule
az network lb probe create -g $RG \
--lb-name myILB \
--name myHealthProbe \
--protocol tcp \
--port 80
# 创建ILB的负载均衡规则
az network lb rule create -g $RG \
--lb-name myILB \
--name myHTTPRule \
--protocol tcp \
--frontend-port 80 \
--backend-port 80 \
--frontend-ip-name myFrontEnd \
--backend-pool-name myBackEndPool \
--probe-name myHealthProbe \
--idle-timeout 15 \
--enable-tcp-reset true
# 将VM加入到ILB
for i in {1,2}
do
az network nic ip-config address-pool add \
--address-pool myBackendPool \
--ip-config-name ipconfig1 \
--nic-name vmnic$i \
-g $RG --lb-name myILB
done
# 在相同的subnet创建一台VM,并配置 Public IP, 做为零时测试用的跳板机
# 生产环境,RDP和SSH连接可以考虑使用Azure Bastion方案,更安全和可靠
# 创建成功后,会看到返回的Public IP,然后RDP连接
az vm create -g $RG \
--name VMTEST \
--image Win2016Datacenter \
--public-ip-sku Standard \
--vnet-name myVnet --subnet mySubnet \
--admin-username azureuser --admin-password 'Str1ngPa$$w0rd'
# 获取VM的Private IP,用于后续RDP连接
az vm list-ip-addresses -g $RG --query "[].{name:virtualMachine.name,privateip:virtualMachine.network.privateIpAddresses}"
验证VM1和VM2的外网出站IP,是否是NAT的Public IP
# 获取NAT使用Public IP 地址
az network public-ip show -g $RG -n NAT-PIP --query "ipAddress"
先RDP到跳板机VMTEST,在跳板机中再RDP到VM1,然后在IE中打开地址 https://whatsmyip.com/ . 如下图,证明VM的出站访问的外网地址是NAT的外网地址
总结
具体问题解决的总结
环境是China Azure, Azure CLI最新版本
本文内容仅代表个人观点,与任何公司和组织无关
配置Internal Load balancer中VM的外网访问的更多相关文章
- 配置多层NAT和端口映射实现外网访问内网
配置多层NAT和端口映射实现外网访问内网 背景和原理 通过配置NAT可以实现内网中不能直接访问外网的主机通过NAT代理访问内网,配置方法这里不再赘述(前文有介绍).本文以两层的NAT代理做模拟,通过端 ...
- 配置IPv6公网地址DDNS并开放外网访问端口
目前使用三大运营商宽带服务都会下发公网IPv6地址,这样我们想要在外网访问家里的路由.NAS等设备就可以直接通过IPv6地址来访问了.但是每次重新拨号后IPv6地址都会改变,而且IPv6的地址很长,这 ...
- 解决阿里云下server 2008中tomcat不能外网访问
1. 首先这台服务器是别人给到手的服务器, 所有环境跟我讲是全新的, 然后我开始配置tomcat; 开始安装sql 2008 r22. r1安装好之后, 本机内部怎么访问都行( . 和 127.0.0 ...
- Apache2.4.x版wampserver本地php服务器如何让外网访问及启用.htaccess
http://www.jb51.net/article/61193.htm ———————————————————————————————————————————— 这篇文章主要介绍了Apache2. ...
- 在Google的GKE上创建支持Internal Load Balancer的Service
在Google的Kubernetes Engine上发布service,可以采用除On-Promise相同的Cluster IP和NodePort两种方式外,还可以创建LoadBalaner的Serv ...
- Ubuntu下MySQL配置为外网访问
Ububtu安装MySQL后默认外网无法连接,但是很多时候我们想要在外网访问方便管理.在这里,简单叙述一下自己在配置过程中的操作,步骤如下: 以root身份登入mysql mysql -u root ...
- windows server配置ftp服务器以及外网访问
在Server2012打开 服务器管理器,选择 添加角色与功能,添加Web服务下的FTP服务器 安装后. 我们现在C盘创建一个名字为FTP的文件夹,里面创建一个ftp的文件,做测试用,如图 打开服务器 ...
- 外网配置花生壳动态域名解析实现外网访问本地iis及vs实时调试
描述:假如已连外网,具备一台路由器的情况下在路由器设置页面配置花生壳动态域名解析,使得外网可以访问到本地iis 托管的web服务,模拟真实环境调试应用程序. 网络运营商ip的动态分配,通常网络提供商给 ...
- centos7.4安装redis以及配置外网访问
一.安装redis 第一步:下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz [root@VM_34_108_c ...
随机推荐
- mybatis根据表逆向自动化生成代码(自动生成实体类、mapper文件、mapper.xml文件)
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- kafka零拷贝机制
kafka之所以那么快,其中一个很大的原因就是零拷贝(Zero-copy)技术,零拷贝不会kafka的专利,而是操作系统的升级,又比如Netty,也用到了零拷贝. 传统IO kafka的数据是要落入磁 ...
- 自研 Pulsar Starter:winfun-pulsar-spring-boot-starter
原文:自研 Pulsar Starter:winfun-pulsar-spring-boot-starter 里程碑 版本 功能点 作者 完成 1.0.0 支持PulsarTemplate发送消息&a ...
- forEachRemaining
ArrayList<Integer> arrayList=new ArrayList<>(); for (int i = 0; i <10; i++) { arrayLi ...
- 关于notepad++使用的那些事儿
时间:2019-04-11 整理:PangYuaner 标题:Notepad++正则表达式语法 地址:https://www.cnblogs.com/kekec/p/5255475.html 标题:N ...
- kubebuilder实战之七:webhook
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 安装配置Linux Squid代理服务器
1.代理服务器的工作机制 代理服务器的工作机制像生活中的代理商,假设自己的机器为A,想获得的数据由服务器B提供,代理服务器为C,那么连接过程是,A需要B的数据,并直接和C连接:C接受到A的数据请求之后 ...
- Java如何搭建脚手架(自动生成通用代码),创建自定义的archetype(项目模板)
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- C# 给PPT中的图表添加趋势线
本文内容分享通过C#程序代码给PPT文档中的图表添加数据趋势线的方法. 支持趋势线的图表类型包括二维面积图.条形图.柱形图.柱形图.股价图.xy (散点图) 和气泡图中:不能向三维.堆积.雷达图.饼图 ...
- kali linux 的基本命令
Kali Linux 命令集 系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2)uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统 ...