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

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

我已经能够正确configurationAzure和虚拟机,并且可以通过链接传输数据(并在Azure门户中显示,与数据双向连接)来启动和运行连接。 然而,build立的连接是不可用的,我不能ping或似乎使Azure虚拟机和我的本地机器之间的任何forms的连接。

我相信这是由于Azure的站点到站点VPN需要本地VPN网关直接连接到互联网,而不需要经过NAT防火墙(因为这是我的家庭宽带,所以只有一个IP),所以虽然可以build立一个连接,我的路由器上的NAT以这种方式改变数据包,这意味着一旦到达RRAS服务器就无法正确路由数据包。

我已经尝试了备用的站点到站点VPN解决scheme(OpenVPN,SoftEther,RRAS本身),但没有一个能正常工作,所有的问题都出现在两个虚拟机的主机VPN连接能够连接到所有设备上,并且我的家庭networking服务器可以正确但是我相信无论是由于Azure虚拟机的限制(只有一个networking适配器,没有启用混杂模式的能力)或Azure虚拟networking本身,这意味着没有其他Azure虚拟机能够连接到我的家networking,尽pipe增加了静态路由去通过VPN服务器或添加它作为一个额外的网关。

我正在使用运行最新的Merlin版本的Asus RT-AC68U路由器,所以我希望能够通过以下方式更改它的iptables规则和networkingconfiguration来使用Azure站点到站点VPN:

  • 现有的iptablesconfiguration大部分保持不变,因此NAT可以继续用于允许我的其他本地服务器和工作站继续连接到互联网,或者将端口转发给他们。
  • 我的家庭networking上的RRAS虚拟机有两个networking适配器,一个使用私有IP,另一个使用私有IP,但根据微软的build议,这将被改为我的公有IP。
  • 最后,我不知道如何完成的部分是将特定的VPN端口和协议(UDP 500,UDP 4500,UDP 1701和ESP(协议#50))从NAT中排除,并直接桥接到networking适配器在现在configuration的虚拟机上使用我的家庭networking的公共IP进行设置。

networking目前看起来像这样:

Azure VM的 – 192.168.1.0/25,使用dynamic路由与公网IP的VPN网关。

家庭networking192.168.0.0/24:

VDSL调制解调器< – PPPOE桥,所以路由器具有公共IP – >华硕路由器< – NAT – > 192.168.0.0.24

所以这就是我想要的,所以RRAS只有公共IP用于VPN目的:

  • VDSL调制解调器< – PPPOE桥,所以路由器有公共IP – >华硕路由器
    • < – VPN端口和协议桥 – > RRAS虚拟机的公共适配器的MAC地址
    • < – 其他地方的NAT – > 192.168.0.0/24

如果有更简单的解决scheme,我愿意接受其他的build议来让站点到站点的VPN工作。

[更新1]

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

我已经将IPv4设置分配给公共IP地址,子网掩码为255.255.255.255,网关与路由器中的ppp0适配器的网关相同。

我在路由器上运行以下命令,试图指示任何stream量尝试通过到VLAN与Azure VPN网关进行通信,因此希望允许它在不使用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它告诉我远程服务器没有响应。

所以我在经过深入研究之后才弄清楚了这一点,我可以在OpenSwan上使用原生的Azure Site-to-Site VPNfunction,在我的家庭networking后面的Linux机器上运行(Raspberry Pi / Arch Linux) NAT路由器。

networking拓扑结构:

  • 192.168.0.0/24 – 家庭networking
  • 192.168.1.0/24 – Azurenetworking
  • 192.168.0.1 – 家庭路由器的私有IP
  • 192.168.0.2 – 作为家庭networking的VPN服务器和网关的Linux机箱

首先,我设置了Azure:

  • 这是正常的远程networking
  • 我的本地networking与VPN地址作为我的公网IP
  • 启用Azurenetworking上的“站点到站点”checkbox,将其链接到本地​​networking
  • 创build一个静态网关,以便使用IKEv1

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

  • UDP 500
  • UDP 4500
  • 第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.secrets:

 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规则占用了大量的时间:

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

 -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虚拟机可以连接到家庭networking上的任何一台机器:

 -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虚拟机可以看到我的家庭networking,所有的家庭networking机器可以看到我的Azure虚拟机。

Azure方面路由正确,对于我的家庭networking,我在路由器中设置了一个静态路由,将192.168.1.0/24发送到192.168.0.2,但是在我的机器上进行testing,我刚刚创build了一个静态路由:

 route -p ADD 192.168.1.0 MASK 255.255.255.0 192.168.0.2 METRIC 100 

我希望至less有人发现这个有用的东西,搞定这个东西需要很长时间,而且没有一个好的完整的指导,只有一部分工作的解决scheme。