我尝试使用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:
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目的:
如果有更简单的解决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拓扑结构:
首先,我设置了Azure:
在我的家庭networking的路由器上,我将以下内容转发到运行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
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。