当在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完成配置过程,主要包括:

  1. 配置VNET和NAT Gateway
  2. 配置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的外网访问的更多相关文章

  1. 配置多层NAT和端口映射实现外网访问内网

    配置多层NAT和端口映射实现外网访问内网 背景和原理 通过配置NAT可以实现内网中不能直接访问外网的主机通过NAT代理访问内网,配置方法这里不再赘述(前文有介绍).本文以两层的NAT代理做模拟,通过端 ...

  2. 配置IPv6公网地址DDNS并开放外网访问端口

    目前使用三大运营商宽带服务都会下发公网IPv6地址,这样我们想要在外网访问家里的路由.NAS等设备就可以直接通过IPv6地址来访问了.但是每次重新拨号后IPv6地址都会改变,而且IPv6的地址很长,这 ...

  3. 解决阿里云下server 2008中tomcat不能外网访问

    1. 首先这台服务器是别人给到手的服务器, 所有环境跟我讲是全新的, 然后我开始配置tomcat; 开始安装sql 2008 r22. r1安装好之后, 本机内部怎么访问都行( . 和 127.0.0 ...

  4. Apache2.4.x版wampserver本地php服务器如何让外网访问及启用.htaccess

    http://www.jb51.net/article/61193.htm ———————————————————————————————————————————— 这篇文章主要介绍了Apache2. ...

  5. 在Google的GKE上创建支持Internal Load Balancer的Service

    在Google的Kubernetes Engine上发布service,可以采用除On-Promise相同的Cluster IP和NodePort两种方式外,还可以创建LoadBalaner的Serv ...

  6. Ubuntu下MySQL配置为外网访问

    Ububtu安装MySQL后默认外网无法连接,但是很多时候我们想要在外网访问方便管理.在这里,简单叙述一下自己在配置过程中的操作,步骤如下: 以root身份登入mysql mysql -u root ...

  7. windows server配置ftp服务器以及外网访问

    在Server2012打开 服务器管理器,选择 添加角色与功能,添加Web服务下的FTP服务器 安装后. 我们现在C盘创建一个名字为FTP的文件夹,里面创建一个ftp的文件,做测试用,如图 打开服务器 ...

  8. 外网配置花生壳动态域名解析实现外网访问本地iis及vs实时调试

    描述:假如已连外网,具备一台路由器的情况下在路由器设置页面配置花生壳动态域名解析,使得外网可以访问到本地iis 托管的web服务,模拟真实环境调试应用程序. 网络运营商ip的动态分配,通常网络提供商给 ...

  9. centos7.4安装redis以及配置外网访问

    一.安装redis 第一步:下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz [root@VM_34_108_c ...

随机推荐

  1. 网络操作系统VyOS之NAT实践

    本文基于 网络操作系统VyOS应用实践(四) 修改,完善了实验细节及1-to-1 NAT部分. NAT NAT即网络地址转换,最常见的就是各种虚拟机工具的NAT模式,让虚拟机以宿主的网络地址与外网通讯 ...

  2. Hopper Disassembler系列之Sublime Text 3 爆破

    https://www.52pojie.cn/thread-793069-1-1.html 当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9. 当参数 ...

  3. 电子设备的使用方法-第5版(佳明智能腕表小米手机联想轻薄笔记本群晖存储)我的腾讯QQ电子邮箱地址是 595076941@qq.com - 2021年9月5日

      电子设备的使用方法-第5版   (佳明智能腕表小米手机联想轻薄笔记本群晖存储) 2021年9月5日 我的腾讯QQ电子邮箱地址是  595076941@qq.com 前言 大家好,我叫徐晓亮,今天我 ...

  4. Redis的配置文件

  5. shell脚本书写

    #!/bin/bash #指定脚本默认使用的命令解释器 第1行 幻数 #!/usr/bin/python #!/bin/awk #!/bin/sed

  6. client-go实战之五:DiscoveryClient

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. Git 系列教程(11)- 分支简介

    前言 很多版本控制系统都有分支这个概念 使用分支意味着可以将日常工作从主线上脱离,从而避免影响主线 Git 鼓励在工作流程中频繁使用分支和合并 Git 是如何保存数据的 Git 保存的不是文件的变化或 ...

  8. 记录一下Vray5中文汉化版本中导出EXR或vrimg多通道文件的那些坑和解决方法

    最近在给一个培训机构代课,学生英语基础差,就安装了Vray5的中文版,噩梦从此开始. 做过合成的都知道,需要输出多通道到NUKE或者AE中进行合成,通常情况下把多个pass分成不同的文件对硬盘反复读写 ...

  9. javascript对象——基本对象

    1.array对象 2.Boolean包装类对象和Date对象   3.Math对象 1到100随机数 4.RegExp对象 4.1 正则规则 如: 4.2 两种创建正则对象方式 /正则表达式/    ...

  10. P1118 [USACO06FEB]Backward Digit Sums G/S

    P1118 [USACO06FEB]Backward Digit Sums G/S 题解:  (1)暴力法.对1-N这N个数做从小到大的全排列,对每个全排列进行三角形的计算,判断是否等于N.  对每个 ...