V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
minsheng
V2EX  ›  Linux

阿里云服务器与办公室内网无法通信,目测防火墙问题,该如何排查故障

  •  
  •   minsheng · 2021-02-24 12:22:50 +08:00 · 4432 次点击
    这是一个创建于 1369 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题描述:

    • 阿里云上同一个 VPC 内,有两台 ECS 服务器,其中一台为自己搭的 VPN 网关
    • 办公室路由器通过 WireGuard 连接阿里云的 VPN 网关
    • 家里路由器亦通过 WireGuard 连接阿里云的 VPN 网关
    • 阿里云的网关 ECS 可以与办公室、家里的内网设备正常通信:
      • 可互 ping
      • 可互相访问 HTTP 服务、SSH 服务
      • 因此我判断路由表设置应该都是正确的。
    • 另一台 ECS 无法访问办公室内网设备。
    • 两台 ECS 处于同一 VPC 内,两个可用区,可互相通信。
    • 在 VPC 路由表内设置了办公室和家庭网络的内网地址块,下一跳设置为网关 ECS 。
    • 在另一台 ECS 内可以 ping 办公室的设备。
    • 办公室的设备不可以 ping ECS 的服务器。
    • 无法在 ECS 和 办公室设备内建立任何 TCP 连接。
    • 网关 ECS 的 iptables,FORWARD 表默认 ACCEPT,除了 Docker 也没有其他条目了。

    两件比较离奇的事情:

    • 我在网关服务器上的 Docker 里开了一个子网,里面的 curl 可以访问另外一台 ECS 。
    • 在今天之前,办公室其实是可以和另一台 ECS 通信的。但是,上一次 setup 也曾经短暂出现过类似的现象,只不过在 VPC 路由表里添加了办公室路由条目后,过了几分钟自己就解决了。
    • 在出问题之前,我今天刚刚第一次购买了 RDS 实例一份,不知道有没有关系。

    完全不懂 Linux 的小白一枚,想问问有没有什么办法可以排查故障?

    17 条回复    2021-02-24 18:07:13 +08:00
    minsheng
        1
    minsheng  
    OP
       2021-02-24 12:23:52 +08:00
    在办公室的路由器上 tracepath,能连接到网关服务器,拿到的是 VPN 里的地址,然后就统一 no reply 了。
    Qetesh
        2
    Qetesh  
       2021-02-24 12:51:24 +08:00 via iPhone
    这种网络架构建议考虑 nat 或者在其他 ecs 启用 wireguard
    minsheng
        3
    minsheng  
    OP
       2021-02-24 12:56:12 +08:00
    @Qetesh 是有在考虑 NAT 了,不过还是想先排查一波问题。只有网关服务器有公网访问(最外面放了阿里云的 NAT 网关),所以每个 ECS 塞一个 WireGuard 感觉不太现实……
    saytesnake
        4
    saytesnake  
       2021-02-24 13:14:26 +08:00
    AIFNI45Mdxn
        5
    AIFNI45Mdxn  
       2021-02-24 13:32:57 +08:00
    排查方向:
    1 、首先需要对两端的网络环境检查下,是否有网段冲突,如果两段的网络有重叠,这个肯定是不行的。
    2 、第一个情况排除后,需要检查 两端 充当网关设备配置的路由是否 ok 。
    3 、两端的路由正常的话,一般就没有什么大问题的,就需要具体问题具体看了。

    两台同 VPC 的 ECS,一台创建了 Docker,容器内可以访问另外一台主机,这个是因为 ECS 之间路由、ECS 与容器的路由都是有的,肯定就可以通信。
    minsheng
        6
    minsheng  
    OP
       2021-02-24 13:52:14 +08:00
    @AIFNI45Mdxn
    谢谢。
    1. 网段全部都是我自己分配的,没有任何问题,阿里云是 172.X,公司是 10.X 。
    2. 公司端路由目测是没有问题,因为家里部署了一摸一样的系统,通过阿里云中转,家里和公司互相通信成功。阿里云里的网关本身的程序也可以访问公司内部。目前阿里云网关跑了一个 GitLab,在公司有一个 GitLab Runner,正常使用。以及两边都用 cURL 跑过,可以访问。
    3. 所以就难受了……

    关于 Docker,其实我是因为比较确信路由都是对的,所以才试了一下,但也不能说明什么。
    minsheng
        7
    minsheng  
    OP
       2021-02-24 14:04:48 +08:00
    我犯了一个错,我没有在 VPC 的路由表里添加 WireGuard 客户端的网段。我画一次我的网络拓扑图吧😂:

    [阿里云内部设备] <--> [阿里云的 WireGuard 网关] <--WireGuard--> [公司路由器] <--> [公司设备]

    我添加了 WireGuard 的网段之后,公司路由器和设备可以全部访问阿里云 VPC 内部设备了,阿里云网关依旧可以随意访问公司内部,但是阿里云内部设备依然不行。
    minsheng
        8
    minsheng  
    OP
       2021-02-24 14:05:51 +08:00
    现在阿里云内部设备可以访问公司的路由器了,算是进步
    huangmingyou
        9
    huangmingyou  
       2021-02-24 14:51:55 +08:00
    一层一层的 tcpdump 抓包
    podel
        10
    podel  
       2021-02-24 15:12:25 +08:00
    阿里云 VPC 设置静态路由表。 本地内网网段指向 VPN 网关。
    podel
        11
    podel  
       2021-02-24 15:15:05 +08:00
    我给我们公司就是这么配置的
    阿里云 VPC <-> VPN 网关(ECS,使用 OpenVPN Server) <-> 本地服务器(OpenWrt 系统,使用 OpenVPN Client)

    其中阿里云 VPC 需要设置 静态路由。 本地局域网设置静态路由。
    podel
        12
    podel  
       2021-02-24 15:19:02 +08:00
    对了 另外 使用的是 OpenVPN 的 TAP 设备做二层转发。 之前 TUN 设备路由上死活弄不过去。
    ECS 上面也要设置好 指向本地内网 静态路由。
    zyzll1234
        13
    zyzll1234  
       2021-02-24 15:39:16 +08:00
    因为公司防火墙上只能用 symetiric NAT 吧
    minsheng
        14
    minsheng  
    OP
       2021-02-24 17:20:08 +08:00 via iPhone
    @podel 我之前就是这么干的。我刚刚才发现一个问题,就是公司路由器不知道为什么自动的做了一次 NAT,我明明没有配置 NAT 。总之我的问题在把 VPN 网段(不是内网网段)加进 VPC 路由后得到了解决。但是不知道为什么阿里云非 VPN 服务器依然无法连接公司内网设备,虽然可以 ping 通。还要再试试。
    minsheng
        15
    minsheng  
    OP
       2021-02-24 17:26:02 +08:00
    Okay,公司内部的 NAT 我破案了,我是直接用 systemd-networkd 配置的,VPN + 路由,然后在对应的 LAN 网络上我直接开启了 IPMasquerade = true,也就是 SNAT 模式了。


    @podel 你说的 TAP 、TUN 、二层转发我还看不太懂,我自己再摸索摸索。
    minsheng
        16
    minsheng  
    OP
       2021-02-24 17:47:08 +08:00
    @saytesnake 谢谢老哥,最终懒得折腾了,还是走你的双 NAT 道路……😂
    minsheng
        17
    minsheng  
    OP
       2021-02-24 18:07:13 +08:00
    所以,大致破案了,总结一下。我的网络架构是:

    * 阿里云 VPC,公司内网路由到网关服务器 A ;
    * 网关服务器 A 通过 WireGuard 连接到公司 /家庭路由器;
    * 公司 /家庭路由器,对 LAN 的全部设备做了一层 NAT,NAT 背后是公司 /家庭的设备。这是通过 systemd-networkd 设置的,并没有根据目标地址 /设备选择性关闭。

    我犯了两个错误:

    * 我没有把 WireGuard 的网段添加到 VPC 的路由表里,导致从公司内部发出的被 NAT 的包(用的是 WireGuard 的 IP ),找不到回传的地址,所以无法建立从公司到 VPC 的连接。
    * 我没有对来自 VPC 的非网关服务器的包做 NAT 。我不知道为什么这会导致问题,但是反正它就是不能 work😂……一直以来我都是可以从网关服务器直接访问内网的。我猜跟 WireGuard 实现有关,导致从隧道另一头过来的包不需要过 iptables,于是访问一切正常。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1232 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:48 · PVG 07:48 · LAX 15:48 · JFK 18:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.