以下是实现 动态 IP 白名单 的完整方案,涵盖主流云平台(Azure、GCP、AWS)的自动化配置方法,支持动态更新 IP 地址列表,适用于远程访问、VPN 或弹性服务的场景!
实现 动态 IP 白名单 的完整方案
一、核心思路
动态 IP 白名单通过 自动化脚本 或 云服务 实现,核心步骤:
- 获取当前 IP:通过 DDNS、内网 DHCP 或 API 获取动态 IP。
- 更新安全组规则:调用云平台 CLI 或 API 动态添加/删除 IP 规则。
- 定时任务:使用 Cron、CloudWatch 或 Task Scheduler 定期执行更新。
二、实现方案
方案 1:基于脚本 + 定时任务
步骤 1:获取动态 IP
• 方法 A:通过外部服务(如 DDNS)
# 示例:使用 dig 查询 DNS 记录(如 No-IP)
CURRENT_IP=$(dig +short example.ddns.net @resolver.example.com)
• 方法 B:获取公网 IP
# Azure VM
CURRENT_IP=$(az vm show --resource-group my-rg --name my-vm | jq -r '.networkInterfaces[0].properties.privateIpAddress')
# GCP VM
CURRENT_IP=$(gcloud compute instances describe my-vm --zone us-central1-a --format json | jq -r '.networkInterfaces[0].accessConfigs[0].externalIp')
步骤 2:更新 Azure NSG 规则
# 删除旧规则(假设规则名包含 IP)
OLD_RULE_NAME="allow-ssh-${CURRENT_IP//./-}"
az network nsg rule delete --resource-group my-rg --nsg-name my-nsg --name $OLD_RULE_NAME
# 添加新规则
az network nsg rule create \
--resource-group my-rg \
--nsg-name my-nsg \
--name allow-ssh-dynamic \
--protocol tcp \
--direction inbound \
--priority 100 \
--source-address-prefix $CURRENT_IP/32 \
--destination-port-range 22/22 \
--access allow
步骤 3:设置定时任务(Linux)
# 每 10 分钟执行一次更新
* * * * * sleep 10; /path/to/update_ip.sh >> /var/log/dynamic_ip.log 2>&1
方案 2:云函数触发器(无服务器架构)
以 Azure Function 为例
-
编写函数代码(Python):
import azure.mgmt.network from azure.identity import DefaultAzureCredential def main(req): current_ip = req.params.get('ip') # 通过 API 请求传递当前 IP credential = DefaultAzureCredential() client = azure.mgmt.network.NetworkManagementClient(credential, "my-subscription-id") # 删除旧规则 client.network_security_groups.delete_rule( resource_group_name="my-rg", network_security_group_name="my-nsg", rule_name=f"allow-ssh-{current_ip}" ) # 添加新规则 rule_params = { 'protocol': 'tcp', 'direction': 'inbound', 'priority': 100, 'source_address_prefix': f"{current_ip}/32", 'destination_port_range': '22/22', 'access': 'allow' } client.network_security_groups.create_or_update_rule( resource_group_name="my-rg", network_security_group_name="my-nsg", rule_name=f"allow-ssh-{current_ip}", rule_params )
-
触发方式:
• 通过 HTTP 触发器 调用函数(如每 5 分钟通过外部服务 POST 当前 IP)。
• 集成 Azure Event Grid 监听 IP 变化事件。
方案 3:使用云服务托管 DDNS
AWS EC2 Instance Connect
• 自动更新:EC2 实例 connect 服务会自动管理 SSH 白名单,无需手动配置。
• 配置步骤:
- 在 EC2 控制台启用 Instance Connect。
- 用户通过 AWS Systems Manager (SSM) 临时访问,IP 白名单自动更新。
三、高级场景:动态 IP 池
如果需要同时支持多个动态 IP(如团队成员的居家 IP),可使用 IP 池 动态扩容:
# Azure NSG 批量添加 IP 池
IPS=("192.168.1.100" "192.168.1.101" "192.168.1.102")
for ip in "${IPS[@]}"; do
az network nsg rule create \
--resource-group my-rg \
--nsg-name my-nsg \
--name allow-ssh-pool-${ip} \
--protocol tcp \
--direction inbound \
--priority 100 \
--source-address-prefix $ip/32 \
--destination-port-range 22/22 \
--access allow
done
四、监控与日志
-
启用日志记录:
• Azure NSG:az network nsg set-log-validation --resource-group my-rg --nsg-name my-nsg --enable true
• GCP Firewall:
gcloud compute firewall-rules set-logging \ --project my-project --network my-vpc --name allow-ssh \ --enable true --log-config destination=cloud-storage,bucket=my-log-bucket
-
分析日志:
# Azure 日志查询(PowerShell) Get-AzNetworkSecurityGroupLogEntry -ResourceGroupName my-rg -Name my-nsg -StartTime "2023-10-01"
五、常见问题排查
- 规则冲突:
• 确保动态规则的priority
优先级高于其他规则。 - IP 变化未触发更新:
• 检查定时任务或触发器的执行频率。 - 权限问题:
• 确认 CLI 或 API 凭证具有Microsoft.Network/securityGroups/write
权限。
六、工具推荐
• IP Lookup:curl ifconfig.me
(快速获取公网 IP)
• Azure CLI:az network nsg
(管理 NSG 规则)
• GCP CLI:gcloud compute firewall-rules
(管理 GCP 防火墙)
• 自动化平台:Ansible、Terraform(声明式配置安全组)
通过上述方案,你可以实现安全、高效的动态 IP 白名单管理,适用于远程办公、自动化部署等灵活场景!🌐