如何将 Linux 机器连接到 Azure 点到站点网关?

如何将 Linux 机器连接到 Azure 点到站点网关?

我最初的尝试是尝试使用互联网连接共享并专用一台机器作为 Linux 机器的前端(只需转发大量端口),但连接到 azure VPN 时连接共享似乎不起作用(到目前为止我已经尝试过 Windows 10 和 Win2008R2)。

我还找不到任何支持必要协议的 Linux 版 VPN 软件。

答案1

可以使用 strongSwan (IKEv2) 将 Linux 连接到 Azure P2S。微软根本不关心这个问题,而是坚持采取“不支持 Linux 的 P2S”的做法(这就是他们在支持票中回答我的方式)。以下是如何根据证书的身份验证配置 IKEv2。

安装依赖项

以下是 Ubuntu 所需的软件包:

apt-get install strongswan-ikev2 strongswan-plugin-eap-tls
# in Ubuntu 16.04 install libstrongswan-standard-plugins for p12 keypair container support
apt-get install libstrongswan-standard-plugins

如果您libstrongswan-extra-plugins在 Ubuntu 16.04 中安装软件包,它将破坏 strongSwan。此软件包包含af-alg和插件,它们与插件冲突。在这种情况下ctr,您必须删除包含插件的软件包,或禁用插件:gcryptopenssllibstrongswan-standard-pluginsopensslopenssl

sudo sed -i 's/\sload =.*/ load = no/g' /etc/strongswan.d/charon/openssl.conf

或者af-algctr插件gcrypt

sudo sed -i 's/\sload =.*/ load = no/g' /etc/strongswan.d/charon/{af-alg,ctr,gcrypt}.conf

生成密钥和证书

您必须先生成自己的 CA,然后需要使用X509v3 主体备用名称(SAN)扩展(strongSwan 常见问题解答),该名称应与证书主体的通用名称 (CN) 相对应。即,具有主体的证书CN=client必须包含DNS:clientSAN。这将允许您在 strongSwan 中指定不CN=带前缀的 EAP 身份。默认情况下,strongSwan 将完整证书主体传输为 EAP 身份,但 Azure VPN 网关不支持这一点。您可以阅读有关 CN 与 SAN 历史的更多信息:http://unmitigatedrisk.com/?p=381

# Generate CA
ipsec pki --gen --outform pem > caKey.pem
ipsec pki --self --in caKey.pem --dn "CN=VPN CA" --ca --outform pem > caCert.pem
# Print CA certificate in base64 format, supported by Azure portal. Will be used later in this document.
openssl x509 -in caCert.pem -outform der | base64 -w0 ; echo

# Generate user's certificate and put it into p12 bundle.
export PASSWORD="password"
export USERNAME="client"
ipsec pki --gen --outform pem > "${USERNAME}Key.pem"
ipsec pki --pub --in "${USERNAME}Key.pem" | ipsec pki --issue --cacert caCert.pem --cakey caKey.pem --dn "CN=${USERNAME}" --san "${USERNAME}" --flag clientAuth --outform pem > "${USERNAME}Cert.pem"
# Generate p12 bundle
openssl pkcs12 -in "${USERNAME}Cert.pem" -inkey "${USERNAME}Key.pem" -certfile caCert.pem -export -out "${USERNAME}.p12" -password "pass:${PASSWORD}"

然后打开 Azure 门户,找到您的“虚拟网络网关”,并在其上点到站点配置页面进入根证书部分粘贴上面打印的 base64 编码的 CA。

配置客户端

寻找下载 VPN 客户端网关的点到站点配置页面上的按钮,然后VpnServerRoot.cer从下载的 ZIP 存档中解压缩 CA:

sudo unzip -j downloaded.zip Generic/VpnServerRoot.cer -d /etc/ipsec.d/cacerts

您可以使用以下命令进行验证:

openssl x509 -inform der -in /etc/ipsec.d/cacerts/VpnServerRoot.cer -text -noout

然后提取VPN服务器DNS:

$ unzip -p downloaded.zip Generic/VpnSettings.xml | grep VpnServer
  <VpnServer>azuregateway-00112233-4455-6677-8899-aabbccddeeff-aabbccddeeff.cloudapp.net</VpnServer>

使用 VpnServer 值作为right值,并使用下面的rightid前缀作为值。%ipsec.conf

然后将用户的 p12 包复制到相应的目录中:

sudo cp client.p12 /etc/ipsec.d/private/

使用以下/etc/ipsec.conf配置:

config setup

conn azure
  keyexchange=ikev2
  type=tunnel
  leftfirewall=yes
  left=%any
  leftauth=eap-tls
  leftid=%client # use the DNS alternative name prefixed with the %
  right=azuregateway-00112233-4455-6677-8899-aabbccddeeff-aabbccddeeff.cloudapp.net # Azure VPN gateway address
  rightid=%azuregateway-00112233-4455-6677-8899-aabbccddeeff-aabbccddeeff.cloudapp.net # Azure VPN gateway address, prefixed with %
  rightsubnet=0.0.0.0/0
  leftsourceip=%config
  auto=add

/etc/ipsec.secrets内容:

: P12 client.p12 'password' # key filename inside /etc/ipsec.d/private directory

然后重新启动 ipsec 以重新读取配置并启动隧道:

sudo ipsec restart
sudo ipsec up azure

MTU/MSS 问题

IPsec VPN 客户端可能会遇到连接问题,因为 MTU/MSS 值较高,并且IKE 分片。要解决此问题,您必须在kernel-netlinkstrongSwan 的charon配置中明确设置 MTU/MSS 的值为 1350(此配置仅适用于 strongSwan 版本 >= 5.2.1)。在配置文件中设置mtumss/etc/strongswan.d/charon/kernel-netlink.conf

mss = 1350
mtu = 1350

并重新启动隧道:

sudo ipsec restart
sudo ipsec up azure

答案2

连接到 Azure VPN 时,连接共享似乎不起作用(到目前为止我已经尝试过 Windows 10 和 Win2008R2)。

我们不能以这种方式使用 Azure P2S VPN。

ICS 将 TCP/IP 数据包从小型 LAN 路由到 Internet。ICS 将本地计算机的各个 IP 地址映射到 TCP/IP 堆栈中未使用的端口号。由于NAT,本地计算机上的 IP 地址在 Internet 上是不可见的。所有离开或进入 LAN 的数据包都是从 ICS 主机上的外部适配器的 IP 地址发送或发送到该 IP 地址。

Azure P2S VPN,用于从单个客户端计算机创建到 Azure 虚拟网络的安全连接。连接 Azure VPN 后,ICS 主机将接收您在配置中指定的点到站点 VPN 客户端地址池中的地址的 IP 地址。结果应该类似于以下内容:

 PPP adapter VNet1:
     Connection-specific DNS Suffix .:
     Description.....................: VNet1
     Physical Address................:
     DHCP Enabled....................: No
     Autoconfiguration Enabled.......: Yes
     IPv4 Address....................: 172.16.201.3(Preferred)
     Subnet Mask.....................: 255.255.255.255
     Default Gateway.................:
     NetBIOS over Tcpip..............: Enabled

ICS 主机通过 VPN 客户端地址池的 IP 地址与 Azure 通信,但 ICS 主机不能使用此IP来共享网络,所以我们不能以这种方式使用Azure P2S VPN。

如果您希望所有计算机都连接到 Azure,我们可以使用 P2S VPN 连接它们,并在它们上创建 VPN 连接。

我还找不到任何支持必要协议的 Linux 版 VPN 软件。

目前,Azure P2S VPN 支持有限仅有的视窗操作系统。

如果要通过Linux连接到Azure虚拟网络,我们可以使用一些基于Linux的软件,这里有一篇关于如何通过linux连接Azure虚拟网络的博客,请参考

答案3

是的,OpenVPN 成功了。由于外部数据包无法穿越 Azure 网络,我无法以传统方式将 OpenVPN 用作 Azure 端的网关。我所做的是在每个 VM 上安装 OpenVPN 客户端,并使用 OpenVPN 的客户端到客户端功能,以便它们都可以看到彼此。虽然不是最理想的,但它在我们等待与 Azure 的 IPsec ExpressRoute 连接时适用于我们的测试网络。最好的部分是它只需要 TCP 上的端口 443,这样就可以毫无问题地穿越所有内容。

相关内容