logo NodeSeekbeta

分享 Azure 动态 IPv4 虚拟机通过另一台静态 IPv6 虚拟机实现双栈网络

根据 Azure 的公告,Basic SKU IP 在今年10月之后就停用,其中就包括动态 IPv4,所以再不发的话就不用发了 xhj024

目前还能通过 Azure CLI 来创建动态 IPv4,不过应该很快就不行了。

基本情况

动态 IPv4 属于 Basic SKU,AZ100 每月有 1500 小时的免费额度。

Standard SKU 的静态 IPv6 完全免费,但无法与属于 Basic SKU 的动态 IPv4 共存,所以无法直接实现双栈网络。

使用 Standard SKU 的静态 IPv4 + IPv6 可以直接实现双栈网络,但是静态 IPv4 收费。

不考虑使用其他免费的公共 IP 作为出口。

方案

创建2台虚拟机,在免费的3个机型 B1s B2ats_v2 B2pts_v2 里3选2,由于 B1s 性能稍弱,故只选后面2个。

虚拟机A使用动态 IPv4,虚拟机B使用静态 IPv6,添加到同一个内网,这样虚拟机A就可以通过内网连接上虚拟机B并通过 WireGuard 添加其 IPv6 作为虚拟网卡,实现双栈网络。

实现

创建虚拟机A的过程省略,和普通的创建无区别。注意是动态 IPv4 的地址。

在创建虚拟机B时,把虚拟机B加入到虚拟机A所在的 VNET,并且网络是静态 IPv6 的地址。我之前有简单提到过 IPv6 Only

一般 Azure 创建的第一台虚拟机内网地址是 10.0.0.4,第二台就是 10.0.0.5,所以使用这2个内网地址互通。

系统使用 Debian 12,所以安装 wireguard-tools,它和 wireguard 的区别主要是有预配置 systemd,开关方便:

sudo apt install wireguard-tools
wg genkey | tee privatekey_server | wg pubkey > publickey_server
wg genkey | tee privatekey_client | wg pubkey > publickey_client

这里虚拟机A是客户端,通过服务端虚拟机B获取到B的 IPv6 出口

虚拟机A的配置 /etc/wireguard/wg-client.conf

[Interface]
PrivateKey = 填入privatekey_client的值
Address = fd00:1234:5678::2/128

PostUp = ip -6 route add ::/0 dev wg-client
PostDown = ip -6 route del ::/0 dev wg-client

[Peer]
PublicKey = 填入publickey_server的值
Endpoint = 10.0.0.5:13579
AllowedIPs = ::/0

虚拟机B的配置 /etc/wireguard/wg-server.conf

[Interface]
PrivateKey = 填入privatekey_server的值
Address = fd00:1234:5678::1/64
ListenPort = 13579

PostUp = ip -4 rule add from 10.0.0.5 lookup main prio 18
PostUp = ip6tables -t nat -A POSTROUTING -s fd00:1234:5678::/64 -o eth0 -j MASQUERADE
PostUp = sysctl -w net.ipv6.conf.all.forwarding=1

PostDown = ip -4 rule del from 10.0.0.5 lookup main prio 18
PostDown = ip6tables -t nat -D POSTROUTING -s fd00:1234:5678::/64 -o eth0 -j MASQUERADE
PostDown = sysctl -w net.ipv6.conf.all.forwarding=0

[Peer]
PublicKey = 填入publickey_client的值
AllowedIPs = fd00:1234:5678::2/128

运行

先在虚拟机B运行命令 sudo systemctl start wg-quick@wg-server

然后在虚拟机A运行命令 sudo systemctl start wg-quick@wg-client

这里虚拟机A的配置里,理论上无需加路由,但很奇怪我启动了后并没有自动加路由,所以只能在配置里加上了。

Azure 默认的防火墙是只打开 TCP 22 端口的,所以记得放行 WG 的 UDP 端口。

在虚拟机A测试是否能够连接 WG 内网的虚拟机:

ping fd00:1234:5678::1

能通的话,测试是否能够连上 IPv6,用 CF 的 DNS 测试:

ping 2606:4700:4700::1001

最后可以考虑设置为 IPv6 优先,在虚拟机A的 /etc/gai.conf 添加 label 2002::/16 2,这样就完成了。

一般免费机型可以有2块网卡,所以虚拟机B可以再加多一块网卡,也就是再加一个免费 IPv6,这样虚拟机A可以再多一个 IPv6 的出口地址(没什么用就是了)

  • 關鍵是我的 Azure 100 沒了,所以玩不到了

  • 技术贴,必须支持!!! xhj005 xhj005 xhj005

  • @Testcharon #2 az200也可以玩,只是超出免费额度后会直接扣钱 ac01

  • 加鸡腿

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有60580位seeker

🎉欢迎新用户🎉