You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

两台Ubuntu 20.04服务器GRE隧道无法连通的问题排查及数据包追踪求助

两台Ubuntu 20.04服务器GRE隧道无法连通的问题排查及数据包追踪求助

你好,看了你在两台全新Ubuntu 20.04 VPS上配置GRE隧道后无法互通的情况,已经确认IP转发开启、本地防火墙关闭,配置步骤看起来也没问题,咱们一步步来排查可能的坑,同时教你怎么追踪数据包找到丢包点。

首先排查基础配置的正确性

1. 确认GRE内核模块是否正确加载

虽然你执行了modprobe ip_gre,但还是可以再验证一下:

  • 在两台服务器上分别执行:
    lsmod | grep gre
    
    如果输出里没有ip_gre的相关信息,说明模块加载失败,可以尝试重新执行sudo modprobe ip_gre,部分系统可能需要用sudo modprobe gre,试试不同的命令。

2. 检查GRE隧道接口状态

  • 查看接口是否正常UP:
    ip link show gre1
    
    确认输出里有UP状态标记,没有错误提示。
  • 验证隧道地址配置:
    ip addr show gre1
    
    确认ServerA上10.0.0.1/30、ServerB上10.0.0.2/30的地址已经正确绑定到gre1接口。

3. 检查路由表是否存在隧道路由

配置完隧道地址后,系统应该自动生成针对10.0.0.0/30网段的路由,执行ip route查看,如果找不到这条路由,手动添加:

  • ServerA上:
    sudo ip route add 10.0.0.0/30 dev gre1
    
  • ServerB上:
    sudo ip route add 10.0.0.0/30 dev gre1
    

4. 重点排查VPS服务商的外部安全组

这是绝大多数GRE隧道失败的核心原因!虽然你关闭了本地防火墙,但很多VPS服务商(比如DigitalOcean、AWS、阿里云等)默认会通过外部安全组/防火墙屏蔽GRE协议(对应IP协议号47)。

  • 登录到VPS服务商的控制面板,找到安全组规则,确保添加两条规则:
    • 允许**IP协议47(GRE)**的入站、出站流量
    • 允许10.0.0.0/30网段的ICMP(ping)入站、出站流量

数据包追踪方法:定位丢包位置

如果上面的排查都没问题,就用工具追踪数据包的走向:

方法1:用tcpdump抓包验证GRE包传输

步骤1:在ServerA上抓公网接口的GRE流量

先通过ip addr确认你的公网接口名称(一般是eth0、ens3之类),然后执行:

sudo tcpdump -i eth0 proto gre

接着在ServerA上执行ping 10.0.0.2,看看tcpdump有没有输出GRE包:

  • 如果没有输出:说明ServerA根本没发出GRE包,检查本地隧道配置或内核模块
  • 如果有输出:切换到ServerB,用同样的命令抓公网接口的GRE流量,看是否能收到包
    • 若ServerB没收到:问题出在公网层面,要么是服务商安全组屏蔽,要么是中间路由丢包
    • 若ServerB收到了,但ping还是不通:再在ServerB上抓gre1接口的ICMP流量:
      sudo tcpdump -i gre1 icmp
      
      看是否有来自10.0.0.1的ICMP请求包:
      • 有包但没回包:检查ServerB的IP转发或本地路由
      • 没包:说明GRE包没被正确解封装到gre1接口,可能是隧道配置的本地/远程IP写错了

方法2:用mtrtraceroute追踪隧道内路径

mtrtracert更直观,先安装(如果没装的话):

sudo apt install mtr

然后在ServerA上执行:

sudo mtr -i gre1 10.0.0.2

隧道内理论上只有一跳,如果显示100%丢包,说明数据包根本没进入隧道传输。

方法3:检查IP转发的全局配置

除了/proc/sys/net/ipv4/ip_forward,还要确认其他转发相关的参数:

sysctl -a | grep forwarding

确保net.ipv4.conf.all.forwardingnet.ipv4.conf.gre1.forwarding的值都是1,如果不是,临时设置:

sudo sysctl -w net.ipv4.conf.all.forwarding=1
sudo sysctl -w net.ipv4.conf.gre1.forwarding=1

另外提个小细节:Ubuntu 20.04里推荐用ip tunnel(注意空格)替代旧的iptunnel命令,虽然旧命令也能工作,但可以试试换成新命令重新配置隧道,比如ServerA上:

sudo ip tunnel add gre1 mode gre local 2.2.2.2 remote 3.3.3.3 ttl 255

优先排查服务商安全组的问题,这个是最常见的诱因!

备注:内容来源于stack exchange,提问作者PouJa

火山引擎 最新活动