AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 627637
Accepted
Paul
Paul
Asked: 2014-09-11 10:11:25 +0800 CST2014-09-11 10:11:25 +0800 CST 2014-09-11 10:11:25 +0800 CST

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

  • 772

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

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

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

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

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

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

网络目前看起来像这样:

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

家庭网络 192.168.0.0/24:

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

所以这就是我想要达到的目的,因此 RRAS 的公共 ip 仅用于 VPN 目的:

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

如果有更简单的解决方案,我愿意接受其他建议以使 Site-to-Site VPN 正常工作。

[更新1]

我目前正在考虑以下问题,我已为 RRAS Hyper-V VM 提供了额外的网络适配器并将其分配给 VLAN 635,如果由于某种原因它想要更改其 MAC 地址,则启用混杂模式。然后,我禁用了两个 Link-Layer Topology Discovery 项和 IPv4 以外的所有连接项。

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

我在路由器上运行了以下命令,以尝试将尝试通过 VLAN 与 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 中连接时,它告诉我远程服务器没有响应。

iptables
  • 1 1 个回答
  • 5657 Views

1 个回答

  • Voted
  1. Best Answer
    Paul
    2014-09-16T13:55:36+08:002014-09-16T13:55:36+08:00

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

    网络拓扑结构:

    • 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 网关:

    • 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
    

    一个在启动时运行以保持“ipsec verify”满意的 bash 脚本:

    #!/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
    

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

    • 6

相关问题

  • OpenVPN 的 Linux IP 转发 - 正确的防火墙设置?

  • iptables 单个规则中的多个源 IP

  • 存储 iptables 规则的规范方法是什么

  • 使用 iptables 和 dhcpd 进行端口转发

  • 根据 Apache 日志数据自动修改 iptables 以阻止行为不良的客户端

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve