如何将 linux box 连接到 azure 点到站点网关?

Kur*_*son 7 linux-networking azure-networking point-to-site-vpn

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

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

kay*_*kay 12

可以使用 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
Run Code Online (Sandbox Code Playgroud)

如果你libstrongswan-extra-plugins在 Ubuntu 16.04 中安装包,它会破坏 strongSwan。这个包包含af-alg,ctrgcryptplugins 并且它们与openssl插件冲突。在这种情况下,您必须删除libstrongswan-standard-plugins包含openssl插件的包,或禁用openssl插件:

sudo sed -i 's/\sload =.*/ load = no/g' /etc/strongswan.d/charon/openssl.conf
Run Code Online (Sandbox Code Playgroud)

af-alg,ctrgcrypt插件:

sudo sed -i 's/\sload =.*/ load = no/g' /etc/strongswan.d/charon/{af-alg,ctr,gcrypt}.conf
Run Code Online (Sandbox Code Playgroud)

生成密钥和证书

您必须先生成自己的 CA,然后需要生成带有X509v3 主题备用名称(SAN) 扩展名 ( strongSwan FAQ ) 的用户证书,该扩展名应与证书主题的通用名称 (CN) 相对应。即带有CN=client主题的证书必须包含DNS:clientSAN。这将允许您CN=在 strongSwan 中指定不带前缀的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}"
Run Code Online (Sandbox Code Playgroud)

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

配置客户端

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

sudo unzip -j downloaded.zip Generic/VpnServerRoot.cer -d /etc/ipsec.d/cacerts
Run Code Online (Sandbox Code Playgroud)

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

openssl x509 -inform der -in /etc/ipsec.d/cacerts/VpnServerRoot.cer -text -noout
Run Code Online (Sandbox Code Playgroud)

然后提取VPN服务器DNS:

$ unzip -p downloaded.zip Generic/VpnSettings.xml | grep VpnServer
  <VpnServer>azuregateway-00112233-4455-6677-8899-aabbccddeeff-aabbccddeeff.cloudapp.net</VpnServer>
Run Code Online (Sandbox Code Playgroud)

对于使用VpnServer值right值和rightid值前缀%ipsec.conf下面。

然后将用户的 p12 bundle 复制到对应目录:

sudo cp client.p12 /etc/ipsec.d/private/
Run Code Online (Sandbox Code Playgroud)

使用以下/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
Run Code Online (Sandbox Code Playgroud)

/etc/ipsec.secrets内容:

: P12 client.p12 'password' # key filename inside /etc/ipsec.d/private directory
Run Code Online (Sandbox Code Playgroud)

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

sudo ipsec restart
sudo ipsec up azure
Run Code Online (Sandbox Code Playgroud)

MTU/MSS 问题

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

mss = 1350
mtu = 1350
Run Code Online (Sandbox Code Playgroud)

并重新启动隧道:

sudo ipsec restart
sudo ipsec up azure
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这是解决原始工具问题的唯一答案。我还必须将私钥添加到 ipsec.d/private 文件夹,并在 ipsec.secrets 中引用它:RSA client.key。有趣的是,在使用此解决方案建立连接后,我还可以使用 GUI 与生成的 clientcert.pem 和 clientkey.pem 建立 VPN 连接。只需遵循原始的 Microsoft 文档(https://docs.microsoft.com/en-us/azure/vpn-gateway/point-to-site-vpn-client-configuration-azure-cert#installlinux),但使用生成的证书. (2认同)

小智 0

当连接到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
Run Code Online (Sandbox Code Playgroud)

ICS主机通过VPN客户端地址池的IP地址与Azure进行通信,但是ICS主机无法使用该IP共享网络,因此我们无法通过这种方式使用Azure P2S VPN。

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

我也无法找到任何支持必要协议的 Linux VPN 软件。

目前,Azure P2S VPN 支持仅限Windows操作系统

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