Pau*_*aul 4 iptables rras site-to-site-vpn bridge azure
我正在尝试使用 RRAS 启动并运行 Azure 站点到站点 VPN,但需要帮助配置我的路由器的 iptables,以便在不使用 NAT 的情况下将 VPN 端口和协议桥接到 RRAS 服务器,同时仍允许 NAT 用于所有其他流量.
我已经能够正确配置 Azure 和 VM,并且我可以通过链接上的数据建立并运行连接(并且在 Azure 门户中显示为与双向数据连接)。但是,设置的连接不可用,我无法 ping 或似乎在 Azure VM 和我的本地计算机之间建立任何形式的连接。
我相信这是由于 Azure 的 Site-to-Site VPN 要求本地 VPN 网关直接连接到 Internet 而无需通过 NAT 防火墙(我必须使用它,因为它是我的家庭宽带,因此只有一个 IP)所以同时可以建立连接 我的路由器上的 NAT 以某种方式更改数据包,这意味着它们一旦到达 RRAS 服务器就无法正确路由。
我已经尝试了替代的站点到站点 VPN 解决方案(OpenVPN、SoftEther、RRAS 本身),但没有一个能正常工作,都表现出相同的问题,即两个 VM 的托管 VPN 连接能够连接到所有内容,并且我的家庭网络服务器可以正确路由以连接到 Azure 端,但我相信要么是由于 Azure VM 的限制(只有一个网络适配器并且无法启用混杂模式)或 Azure 虚拟网络本身,这意味着没有其他 Azure VM 能够连接到我的家尽管添加了静态路由以通过 VPN 服务器或将其添加为附加网关。
我正在使用运行最新 Merlin 版本的 Asus RT-AC68U 路由器,所以我希望我可以通过以下方式更改它的 iptables 规则和网络配置来使用 Azure Site-to-Site VPN:
目前的网络是这样的:
Azure VM - 192.168.1.0/25,使用动态路由和公共 IP 的 VPN 网关。
家庭网络192.168.0.0/24:
VDSL 调制解调器 <- PPPOE 网桥,因此路由器具有公共 IP -> 华硕路由器 <- NAT -> 192.168.0.0.24
所以这就是我想要达到的目的,因此 RRAS 具有仅用于 VPN 目的的公共 IP:
如果有更简单的解决方案,我愿意接受其他建议,以使 Site-to-Site VPN 正常工作。
[更新1]
我目前正在考虑以下问题,我已为 RRAS Hyper-V VM 提供了额外的网络适配器并将其分配给 VLAN 635,如果出于某种原因想要更改其 MAC 地址,则会启用混杂模式。然后,我禁用了除两个链路层拓扑发现项和 IPv4 之外的所有连接项。
我已经为 IPv4 设置分配了公共 IP 地址、子网掩码 255.255.255.255 以及与路由器中 ppp0 适配器的网关相同的网关。
我在路由器上运行了以下命令,以尝试将试图与 Azure VPN 网关通信的任何流量通过 VLAN 引导至 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
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用,当尝试在 RRAS 中连接时,它告诉我远程服务器没有响应。
因此,经过大量挖掘后,我设法弄清楚了这一点,我能够将本机 Azure 站点到站点 VPN 功能与 OpenSwan 一起使用,该功能在我的家庭网络后面的 linux 机器(Raspberry Pi/Arch Linux)上运行NAT路由器。
网络拓扑结构:
首先,我使用以下命令设置 Azure:
在我家庭网络的路由器上,我将以下内容转发到运行 Openswan (192.168.0.2) 的 Linux 网关:
我的 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
Run Code Online (Sandbox Code Playgroud)
ipsec.secrets:
192.168.0.2 <azure vpn gateway> : PSK "Azure's PSK"
Run Code Online (Sandbox Code Playgroud)
这使链接启动并运行,以允许站点之间的路由(经过很多挫折后的两种方式):
/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
Run Code Online (Sandbox Code Playgroud)
在启动时运行的 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
Run Code Online (Sandbox Code Playgroud)
最后,我的 iptables 规则花费了最多的精力:
filter 表,这允许家庭网络连接到 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
有了这一切,我可以双向 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
Run Code Online (Sandbox Code Playgroud)
我希望至少有人觉得这很有用,这个设置花了很长时间,而且没有一个很好的完整指南,只有部分有效的解决方案的混合。