共计 6569 个字符,预计需要花费 17 分钟才能阅读完成。
更新记录
2023-09-07
Azure变更了虚拟子网类型,现在 VPN 所用的子网需要单独创建 GatewaySubnet
前言
多云是大型企业选择云提供商的发展趋势。各家不同的云提供商,均具备独特的优势。例如AWS的大而全,华为云的低廉的价格,Azure在此次AI浪潮中的先发优势等。针对不同的优势,公司在选型提供商时并不会局限于独家,而是会根据不同的业务诉求,将资源托管在不同的提供商。例如AWS的cdn边缘节点在海外覆盖最为全面;AI相关的业务,GCP和Azure的一站化更为出色。
而我司为了更好的使用openai,计划引入微软云。作为SRE,需要先于业务出发,确保基础架构稳定可拓展。此篇文章会详述如何在Azure使用site to site VPN,联通其他云提供商的VPC,拓展IDC的网络边界。
实操
业务既然上云,那么在部署服务时就会有不同的选择,即可以选择iaas,仅使用云提供的vm,服务自行在vm部署;也可以选择saas,直接利用云已经封装集成的商用产品。
通常来说,iaas运维成本高,资源成本低。而saas运维成本低,资源成本高。
本文会综合两种方式进行配置,即Azure上使用saas(site to site vpn),而本地网络
使用iaas(strongswan vpn)。
本地网络
:可以泛指任意网络,例如公司网络/IDC网络/其他云厂上的VPC网络。此处的本地网络为华为云的VPC。
费用
Azure
选用VpnGw1,价格约173$/月。价格并不高。
资源信息
后文中,资源准备章节所创建的资源信息汇总于此。
Azure
虚拟网络
- 资源组: sre-test
- 名称: eu-sre-test-vnet-1
- 区域: 欧洲西部 West Europe
- IPv4 地址空间: 10.33.0.0/16
- 子网名称: eu-sre-test-vsubnet-1
- 子网地址空间: 10.33.0.0/24
虚拟网络网关
即VPN网关
- 名称:eu-sre-test-vgw-1
- IP-1:108.143.150.131 (eu-sre-test-vgw-eip-1)
虚拟机
用于测试网络是否能够联通
- 名称:eu02-sre-test-0001
- 内网IP:10.33.0.4
- 公网IP:20.56.158.61
华为云
虚拟私有云
- 名称:hk-sre-test-vpc-1
- IPV4 CIDR:10.32.0.0/24
- 子网名称:hk-sre-test-subnet-1
-
子网IPV4 CIDR:10.32.0.0/24
虚拟机
用于部署VPN
- 名称:hk01-sre-vpn-test-0001
- 内网IP:10.32.0.129
- 公网IP:119.8.30.76
虚拟IP
用于高可用
- 名称:hk01-sre-vpn-test-0001
- 内网IP:10.32.0.200
- 公网IP:159.138.8.237
资源准备
Azure
创建资源组
Azure的资源管理层级,由上至下,分别是
- 管理组
- 订阅
- 资源组
- 资源
任意资源都需要具备上述层级才可进行创建,而管理组和订阅在创建账号时已经进行分配,此处只需要创建资源组。
创建虚拟网络
创建虚拟子网
需要创建两种类型的子网
- 普通子网,用于虚拟机 / LB / RDS 等资源的 IP 分配
- 网关子网,用于 托管VPN 的IP 分配
创建 VPN 网关
此处需要注意的是,VPN网关会使用虚拟网络vnet下的子网,使用的是 GatewaySubnet
创建本地网络网关
本地网络网关,在本文中即Azure的对端,也就是华为的VPN网关IP和所需联通的IPV4 CIDR.
创建 VPN 连接
华为云
创建虚拟私有云
创建虚拟机用于部署strongswan
关闭 源/目的检查
创建虚拟IP并绑定虚拟机网卡
此处并非必选项,而是因为选择自行部署strongwan后,单机部署就可能存在单点故障的隐患。
华为云可以提供虚拟IP,那么我们即可以选择多机部署,在华为云上将虚拟IP绑定所有部署了strongwan vm的网卡,在通过keepalived实现高可用。
创建虚拟IP
给虚拟IP绑定EIP
将虚拟IP绑定至虚拟机
操作系统内给网卡绑定虚拟ip
nmcli connection
:查看并记录需要绑定虚拟IP的网卡及对应连接。
nmcli connection modify "System eth0" ipv4.addresses 10.32.0.200
:在目标连接中添加虚拟IP。
nmcli connection up "System eth0"
:使配置生效。
[root@hk01-sre-vpn-test-0001 ~] # nmcli connection
NAME UUID TYPE DEVICE
System eth0 5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 ethernet eth0
System eth1 9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04 ethernet --
System eth2 3a73717e-65ab-93e8-b518-24f5af32dc0d ethernet --
System eth3 c5ca8081-6db2-4602-4b46-d771f4330a6d ethernet --
System eth4 84d43311-57c8-8986-f205-9c78cd6ef5d2 ethernet --
[root@hk01-sre-vpn-test-0001 ~] # nmcli connection modify "System eth0" ipv4.addresses 10.32.0.200
[root@hk01-sre-vpn-test-0001 ~] # nmcli connection up "System eth0"
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@hk01-sre-vpn-test-0001 ~] # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether fa:16:3e:70:50:d1 brd ff:ff:ff:ff:ff:ff
inet 10.32.0.200/32 brd 10.32.0.200 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 10.32.0.129/24 brd 10.32.0.255 scope global noprefixroute dynamic eth0
valid_lft 107999993sec preferred_lft 107999993sec
inet6 fe80::f816:3eff:fe70:50d1/64 scope link
valid_lft forever preferred_lft forever
[root@hk01-sre-vpn-test-0001 ~] # ping 10.32.0.200
PING 10.32.0.200 (10.32.0.200) 56(84) bytes of data.
64 bytes from 10.32.0.200: icmp_seq=1 ttl=64 time=0.022 ms
64 bytes from 10.32.0.200: icmp_seq=2 ttl=64 time=0.017 ms
^C
--- 10.32.0.200 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1017ms
rtt min/avg/max/mdev = 0.017/0.019/0.022/0.005 ms
答疑 为什么不用ELB?
一般来说云厂我们都会选择使用Elastic Load Balance,即弹性负载均衡器来实现服务高可用。
此处不选择的原因是,部署了strongswanVPN并提供通信的IP,会作为VPC路由表中的下一跳地址,将对远端网段的流量路由到strongwan。而华为云路由表中,下一跳并不支持选择ELB。
strongswan部署和配置
部署
# yum install strongswan -y
配置
密钥配置文件:/etc/strongswan/ipsec.secrets
格式为:[本机公网IP] [远端公网IP] : PSK “密钥”
此处本机公网IP
应写虚拟IP的EIP,远端公网IP
写Azure VPN提供的公网IP
[root@hk01-wpscloud-sre-vpn-0001 /etc/strongswan] # cat ipsec.secrets
# ipsec.secrets - strongSwan IPsec secrets file
159.138.8.237 90.84.42.7 : PSK "123456testpass"
隧道配置文件:/etc/strongswan/ipsec.conf
[root@hk01-wpscloud-sre-vpn-0001 /etc/strongswan] # cat /etc/strongswan/ipsec.conf
config setup
conn %default
auto=start
type=tunnel
compress=no
authby=psk
ikelifetime=86400s
lifetime=3600s
keyexchange=ikev2
ike=aes128-sha256-modp2048!
esp=aes128-sha256-modp2048!
dpddelay=15
dpdtimeout=45
dpdaction=restart
conn huawei_hk_to_azure_eu
leftid=159.138.8.237
left=10.32.0.200
leftsubnet={,10.32.0.0/24}
rightsubnet={,10.31.0.0/24}
rightid=114.119.172.224
right=114.119.172.224
安全组
安全组放行Azure的子网和VPN IP
虚拟网络
虚拟网络
- 资源组: sre-test
- 名称: eu-sre-test-vnet-1
- 区域: 欧洲西部 West Europe
- IPv4 地址空间: 10.33.0.0/16
- 子网名称: eu-sre-test-vsubnet-1
- 子网地址空间: 10.33.0.0/24
虚拟网络网关
虚拟网络网关
即VPN网关
- 名称:eu-sre-test-vgw-1
- IP-1:108.143.150.131 (eu-sre-test-vgw-eip-1)
路由
在华为云的VPC路由表下,配置到Azure 子网 10.33.0.0/24的路由,下一跳为 虚拟IP
测试和验证
华为云虚拟机
- 名称:hk01-sre-vpn-test-0001
- 内网IP:10.32.0.129
- 公网IP:119.8.30.76
华为云VPN EIP
- 名称:hk01-sre-vpn-test-0001
- 内网IP:10.32.0.200
- 公网IP:159.138.8.237 (300Mbps)
AWS虚拟机
- 名称:eu02-sre-test-0001
- 内网IP:10.33.0.4
- 公网IP:20.56.158.61
ping
测试从 hk01-sre-vpn-test-0001 –> eu02-sre-test-0001ping
[root@hk01-sre-vpn-test-0001 /etc/strongswan] # ping 10.33.0.4
PING 10.33.0.4 (10.33.0.4) 56(84) bytes of data.
64 bytes from 10.33.0.4: icmp_seq=1 ttl=64 time=191 ms
********
64 bytes from 10.33.0.4: icmp_seq=52825 ttl=64 time=190 ms
^C
--- 10.33.0.4 ping statistics ---
52826 packets transmitted, 52735 received, 0% packet loss, time 52864723ms
rtt min/avg/max/mdev = 187.536/190.242/642.411/20.297 ms
结论
- 平均延时:190.242ms
- 丢包率:0%
端口连通性
[root@hk01-sre-vpn-test-0001 /etc/strongswan] # nc -vz 10.33.0.4 22
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 10.33.0.4:22.
Ncat: 0 bytes sent, 0 bytes received in 0.20 seconds.
结论
tcp端口可正常通信
文件传输
[ansible@hk01-sre-vpn-test-0001 /tmp] $ dd if=/dev/zero of=bigfile bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 0.751271 s, 1.4 GB/s
[ansible@hk01-sre-vpn-test-0001 /tmp] $ scp bigfile 10.33.0.4:/tmp
The authenticity of host '10.33.0.4 (10.33.0.4)' can't be established.
ECDSA key fingerprint is SHA256:T4n58SecFgBNyQp3xvHO237b30raJQGN6TlH/kjYmm0.
ECDSA key fingerprint is MD5:d2:d6:75:99:5a:e2:89:0b:82:dc:91:c3:32:58:19:6d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.33.0.4' (ECDSA) to the list of known hosts.
bigfile 100% 1024MB 7.1MB/s 02:23
结论
传输1GB文件,平均传输速率7.1MB/s。
华为的EIP带宽限制为300Mbps,Azure的VpnGw1带宽限制为650Mbps。
即从华为香港到Azure欧洲,在国际公网环境下,网络吞吐达不到VPN的上限。
总结
架构的设计应在成本可控的情况下,保证可维护性和高可用性。一般而言,云厂托管的解决方案更佳。
本文之所以在本地网络(华为香港)采用自部署strongswan VPN,而在Azure选择托管VPN,理由如下:
- 不同云之间的托管VPN,可能存在兼容性问题。曾经测试过华为和AWS的托管VPN无法正常协商打通隧道。咨询过双方的技术人员,却互相推诿是对方有问题。
- strongswan是一个社区流行的软件定义网络解决方案。云托管VPN,一般会对自建strongswan VPN保证兼容性。
实际的业务架构中,华为的新加坡为枢纽,联通国内和海外的IDC机房。枢纽为了保障最大的兼容性,采取strongswan而不是托管VPN是最合适的选择。
而作为最远端的业务region,例如本文中的Azure欧洲,亦或是AWS美国。直接采用托管VPN可降低维护成本,也具备更好的稳定性。