![Azure 站点到站点 VPN 带有基于 Linux 的路由器,用于将 VPN 端口桥接到 RRAS 服务器,同时保持其他流量的 NAT](https://linux22.com/image/641371/Azure%20%E7%AB%99%E7%82%B9%E5%88%B0%E7%AB%99%E7%82%B9%20VPN%20%E5%B8%A6%E6%9C%89%E5%9F%BA%E4%BA%8E%20Linux%20%E7%9A%84%E8%B7%AF%E7%94%B1%E5%99%A8%EF%BC%8C%E7%94%A8%E4%BA%8E%E5%B0%86%20VPN%20%E7%AB%AF%E5%8F%A3%E6%A1%A5%E6%8E%A5%E5%88%B0%20RRAS%20%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%8C%E5%90%8C%E6%97%B6%E4%BF%9D%E6%8C%81%E5%85%B6%E4%BB%96%E6%B5%81%E9%87%8F%E7%9A%84%20NAT.png)
我正在尝试使用 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
我希望至少有人会觉得这很有用,这个设置花了很长时间,并且没有一个好的完整指南,只有部分有效的解决方案的混合。