配置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 ...
随机推荐
- linux centos7 移动文件到指定目录
2021-08-26 在 centos7 环境下怎么移动一个文件到其他的目录下呢? 使用命令 mv 文件名 指定目录 即可完成该操作. 那么怎么将一个文件夹下的内容移动到另一个文件夹下呢?比如有时 ...
- C++11多线程编程
1. 多线程编程 在进行桌面应用程序开发的时候, 假设应用程序在某些情况下需要处理比较复杂的逻辑, 如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作.这种情况下就需要使用多线程,其中一 ...
- javascript(2)运算符
### js运算符 1.运算符 1.typeof 获取当前变量类型 运算符(特殊) 2.= 赋值运算符 3.== 简要比较运算符(忽略变量的类型) 4.=== 标准比较运算符(严格变量的类型.判断是否 ...
- Python - 3.8 新特性之仅位置参数 & 仅关键字参数
前置知识 Python 函数:https://www.cnblogs.com/poloyy/p/15092393.html 什么是仅限位置形参 仅限位置形参是 Python 3.8 才有的新特性 新增 ...
- 记一次 .NET 某桌面奇侠游戏 非托管内存泄漏分析
一:背景 1. 讲故事 说实话,这篇dump我本来是不准备上一篇文章来解读的,但它有两点深深的感动了我. 无数次的听说用 Unity 可做游戏开发,但百闻不如一见. 游戏中有很多金庸武侠小说才有的名字 ...
- SQL-DELETE触发器练习
&练习一 如下所示三张表( student,grade,student_updata_before ): student表 grade表 Student_update_before表 # 触发 ...
- 博主有偿带徒 《编程语言设计和实现》《MUD游戏开发》《软件破解和加密》《游戏辅助外挂》《JAVA开发》
<考研专题>操作系统原理 理论解答:8K 实战 1.5W CPU设计 理论解答:1W 实战 2.5W <编程语言设计和实现>初窥门径<5K>:编译原理.编译设计小试 ...
- Qt+Python开发百度图片下载器
一.资源下载地址 https://www.aliyundrive.com/s/jBU2wBS8poH 本项目路径:项目->收费->百度图片下载器(可试用5分钟) 安装包直接下载地址:htt ...
- 【第十篇】- Git 远程仓库(Github)之Spring Cloud直播商城 b2b2c电子商务技术总结
Git 远程仓库(Github) Git 并不像 SVN 那样有个中心服务器. 目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作. 你就需要将数据 ...
- Oracle列值拼接
最近在学习的过程中,发现一个挺有意思的函数,它可实现对列值的拼接.下面我们来看看其具体用法. 用法: 对其作用,官方文档的解释如下: For a specified measure, LISTAGG ...