Azure 站点到站点 VPN 带有基于 Linux 的路由器,用于将 VPN 端口桥接到 RRAS 服务器,同时保持其他流量的 NAT

Azure 站点到站点 VPN 带有基于 Linux 的路由器,用于将 VPN 端口桥接到 RRAS 服务器,同时保持其他流量的 NAT

我正在尝试使用 RRAS 启动并运行 Azure 站点到站点 VPN,但需要帮助配置路由器的 iptables,以便在不使用 NAT 的情况下将 VPN 端口和协议桥接到 RRAS 服务器,同时仍允许 NAT 用于所有其他流量。

我已经能够正确配置 Azure 和 VM,并且能够建立连接并运行数据流经链接(并在 Azure 门户中显示为已连接且数据双向流动)。但是,建立的连接不可用,我无法 ping 或似乎无法在 Azure VM 和我的本地计算机之间建立任何形式的连接。

我认为这是由于 Azure 的站点到站点 VPN 要求本地 VPN 网关直接连接到互联网而无需通过 NAT 防火墙(我必须使用 NAT 防火墙,因为这是我的家庭宽带,所以只有一个 IP),因此虽然可以建立连接,但我路由器上的 NAT 会以某种方式改变数据包,这意味着它们一旦到达 RRAS 服务器就无法正确路由。

我尝试过备用的站点到站点 VPN 解决方案(OpenVPN、SoftEther 和 RRAS 本身),但都无法正常工作,并且都出现了同样的问题,即两个 VM 托管 VPN 连接能够连接到所有东西,并且我的家庭网络服务器可以正确路由以连接到 Azure 端,但我相信要么是由于 Azure VM 的限制(只有一个网络适配器并且无法启用混杂模式)要么是 Azure 虚拟网络本身的限制,这意味着尽管添加了通过 VPN 服务器的静态路由或将其添加为附加网关,但没有其他 Azure VM 能够连接到我的家庭网络。

我正在使用运行最新 Merlin 版本的 Asus RT-AC68U 路由器,因此我希望可以通过以下方式更改其 iptables 规则和网络配置来使用 Azure Site-to-Site VPN:

  • 现有的 iptables 配置基本保持不变,因此可以继续使用 NAT,以允许我的其他本地服务器和工作站继续连接到互联网,或将端口转发给它们。
  • 我的家庭网络上的 RRAS VM 有两个网络适配器,一个具有私有 IP,当前另一个具有私有 IP,但根据 Microsoft 的建议,这将更改为我的公共 IP。
  • 最后,我不知道如何完成的部分是将特定的 VPN 端口和协议(UDP 500、UDP 4500、UDP 1701 和 ESP(协议 #50))排除在 NAT 之外,并直接桥接到现在使用我的家庭网络的公共 IP 配置的 VM 上的网络适配器。

网络目前如下所示:

Azure VM - 192.168.1.0/25,使用具有公共 IP 的动态路由的 VPN 网关。

家庭网络 192.168.0.0/24:

VDSL 调制解调器 <- PPPOE 桥接器,因此路由器具有公共 IP -> Asus 路由器 <- NAT -> 192.168.0.0.24

因此,这就是我想要达到的目的,以便 RRAS 仅具有用于 VPN 目的的公共 IP:

  • VDSL 调制解调器 <- PPPOE 桥接器,因此路由器具有公共 IP -> Asus 路由器
    • <- VPN 端口和协议的桥接 -> RRAS VM 的公共适配器的 MAC 地址
    • <- 其他所有地址均使用 NAT -> 192.168.0.0/24

如果有更简单的解决方案,我愿意接受其他建议以使站点到站点 VPN 正常运行。

[更新 1]

我目前正在考虑以下事项,我已为 RRAS Hyper-V VM 提供了附加网络适配器并将其分配给 VLAN 635,如果出于某种原因它想要更改其 MAC 地址,则启用混杂模式。然后,我禁用了除两个链路层拓扑发现项和 IPv4 之外的所有连接项。

我已为 IPv4 设置分配了公共 IP 地址、子网掩码 255.255.255.255 以及与路由器中 ppp0 适配器相同的网关。

我在路由器上运行了以下命令,尝试将任何尝试与 Azure VPN 网关通信的流量引导至 VLAN,从而希望允许它在不使用 NAT 的情况下进行路由:

/usr/sbin/ip link add link br0 name br0.635 type vlan id 635
/usr/sbin/ip link set dev br0.635 up

/usr/sbin/iptables -I INPUT -i br0.635 -j ACCEPT
/usr/sbin/iptables -I FORWARD -i ppp0 -o br0.635 -s <azure gateway IP> -j ACCEPT
/usr/sbin/iptables -I FORWARD -i br0.635 -o ppp0 -d <azure gateway IP> -j ACCEPT
/usr/sbin/iptables -I FORWARD -i ppp0 -o br0.635 -s <ppp0's gateway> -j ACCEPT
/usr/sbin/iptables -I FORWARD -i br0.635 -o ppp0 -d <ppp0's gateway> -j ACCEPT

不幸的是,这不起作用,当尝试连接 RRAS 时,它告诉我远程服务器没有响应。

答案1

因此,经过大量的研究之后,我终于弄清楚了这一点,我能够将本机 Azure 站点到站点 VPN 功能与 OpenSwan 一起使用,该 OpenSwan 在我的家庭网络的 NAT 路由器后面的 Linux 机器(Raspberry Pi/Arch Linux)上运行。

网络拓扑结构:

  • 192.168.0.0/24 - 家庭网络
  • 192.168.1.0/24 - Azure 网络
  • 192.168.0.1-家庭路由器的私有IP
  • 192.168.0.2-Linux 机箱充当家庭网络的 VPN 服务器和网关

首先,我使用以下方式设置 Azure:

  • 这是正常的远程网络
  • 我的本地网络,以 VPN 地址作为我的公共 IP
  • 在 Azure 网络上启用“站点到站点”复选框,将其链接到我的本地网络
  • 创建了一个静止的因此使用 IKEv1

在我的家庭网络路由器上,我将以下内容转发到运行 Openswan(192.168.0.2)的 Linux 网关:

  • UDP500
  • UDP4500
  • 协议 50 (GRE)

我的 ipsec.conf 如下所示:

version 2.0

config setup
    nat_traversal=yes
    virtual_private=%4:192.168.0.0/24
    protostack=auto
    interfaces="ipsec0=eth0"

conn azure
    authby=secret
    auto=start
    type=tunnel
    left=192.168.0.2
    leftsubnet=192.168.0.0/24
    leftnexthop=192.168.0.1
    right=<azure's VPN gateway IP>
    rightsubnet=192.168.1.0/24
    ike=3des-sha1-modp1024,aes128-sha1-modp1024
    esp=3des-sha1,aes128-sha1
    pfs=no

ipsec.秘密:

192.168.0.2 <azure vpn gateway> : PSK "Azure's PSK"

这样就可以建立并运行链接,以允许站点之间的路由(经过很多挫折之后,双向都可以):

/etc/sysctl.conf:

net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1

在启动时运行的 bash 脚本,用于确保“ipsec verify”正常运行:

#!/bin/bash

for vpn in /proc/sys/net/ipv4/conf/*; do
    echo 0 > $vpn/accept_redirects;
    echo 0 > $vpn/send_redirects;
done

sysctl -p

最后,我的 iptables 规则花费了最多时间修改:

过滤表,这允许家庭网络连接到 Azure 并允许建立连接,但 Azure VM 仍然无法连接到家庭网络服务器:

-A FORWARD -s 192.168.1.0/24 -m policy --dir in --pol ipsec -j ACCEPT
-A FORWARD -s 192.168.0.0/24 -m policy --dir out --pol ipsec -j ACCEPT
-A INPUT -p udp -m udp --dport 500 -j ACCEPT
-A INPUT -p udp -m udp --dport 4500 -j ACCEPT
-A INPUT -m policy --dir in --pol ipsec -j ACCEPT
-A INPUT -p esp -j ACCEPT

nat 表,这允许 Azure VM 连接到我家庭网络上的任何机器:

-A PREROUTING -i eth0 -p udp -m udp --dport 4500 -j DNAT --to-destination <azure public vpn ip>:4500
-A PREROUTING -i eth0 -p udp -m udp --dport 500 -j DNAT --to-destination <azure public vpn ip>:500
-A POSTROUTING -o eth0 -j MASQUERADE

有了这些,我可以双向 ping 和通信,所有 Azure VM 都可以看到我的家庭网络,所有家庭网络机器都可以看到我的 Azure VM。

Azure 端可以自行正确路由,对于我的家庭网络,我在路由器中设置了一条静态路由,将 192.168.1.0/24 发送到 192.168.0.2,但为了在我的计算机上进行测试,我只创建了一条静态路由:

route -p ADD 192.168.1.0 MASK 255.255.255.0 192.168.0.2 METRIC 100

我希望至少有人会觉得这很有用,这个设置花了很长时间,并且没有一个好的完整指南,只有部分有效的解决方案的混合。

相关内容