Administrator
发布于 2025-10-21 / 7 阅读
0
0

GRE 隧道搭建

在两个 VPC 之间建立 GRE 隧道,能让它们像通过专线一样直接通信。

VPC 专用网络,里面包含很多设备,可以理解为一个内网。

传统专线方案:
VPC A ─── 物理专线 ─── VPC B

GRE隧道方案:
VPC A ─── GRE over Internet ─── VPC B

一、互联网专线(虚拟专线)

场景:物联网卡和云服务器实现互访。普通的定向(非专线)只能单向访问服务器。

需要注意的是:

  • 要和移动对接的技术人员说是【专线直连服务器,没有网关】

  • 确认移动核心侧放通阿里云的 IP

  • 终端(物联网卡)不支持互访

  • 云服务器可以访问终端。实测卡放 pad 上开机可以 ping 通,关机则不通。

基本参数

  • 5G UPF 核心网侧 IP:<A的公网IP>,对等 IP:172.16.0.1/30

  • 客户 GRE IP/专线接口 IP:<B的公网IP>,对等 IP:172.16.0.2

  • 终端地址池(物联网卡)静态 IP:10.6.0.0/22

其中,对等 IP(peer ip),也可以称为隧道内层地址,peer(172.16.0.1)-to-pear(172.16.0.2),配置完成之后,可以通过对等 IP 互相访问。

1、运营商侧配置参考(核心网)

运营商侧一般称为 PGW(PDN Gateway),用 A 指代。云服务器用 B 指代。

ip tunnel add gre-pgw1 mode gre remote <B的公网IP> local <A的公网IP> ttl 255
ip addr add 172.16.0.1/30 dev gre-pgw1
ip link set gre-pgw1 up

# 运营商路由, 我猜测是这样配置的:
# 所有流量发送到 B(default == 0.0.0.0/0)
ip route add default via 172.16.0.2 dev gre-aliyun metric 100

# 添加例外路由:10.6.0.0/22 留在本地(使用更小的 metric 值,优先级更高)
# ip route add 10.6.0.0/22 dev [本地接口] scope link metric 50

# 物联网终端不能互访, 所以不存在上面的例外路由。

2、云服务器配置(CentOS7)

(1)检查 GRE 模块是否已加载

后续 ip tunnel add 命令会自动加载 GRE 模块,不用特别去加载。

modprobe ip_gre   # 加载 GRE 隧道内核模块
lsmod | grep gre  # 检查 GRE 模块是否已加载

(2)详细配置

注意:大多数云厂商采用 SNAT/DNAT,公网 IP 并不直接绑定在服务器网卡上。使用公网 IP 存在问题【ip tunnel add ... local <B的公网IP>】,请使用【B 的私网 IP】。


# 1、清理现有隧道
ip link set gre-pgw1 down 2>/dev/null
ip tunnel del gre-pgw1 2>/dev/null

# 2、配置 GRE 隧道
# 2.1 隧道接口名为 pre-pgw1
ip tunnel add gre-pgw1 mode gre remote <A的公网IP> local <B的私网IP> ttl 255
# ip tunnel add gre-pgw1 mode gre remote <A的公网IP> local <B的公网IP> ttl 255

# 2.2 为隧道接口分配 IP 地址(内层地址)
ip addr add 172.16.0.2/30 dev gre-pgw1
# ip addr add 172.16.0.2 peer 172.16.0.1 dev gre-pgw1  # 或者, 另一种写法。

# 2.3 启动隧道接口
ip link set gre-pgw1 up mtu 1400
#ip link set gre-pgw1 up

# 3、添加静态路由,将目标为PGW1用户地址池的流量,通过隧道发送到对端内层地址
# 这条命令的意思是:要去往 10.6.0.0/22 网段,请通过 gre1 接口发送,下一跳是 172.16.0.1
# metric 请看后面解释,有备用隧道的时候建议加上。

ip route add 10.6.0.0/22 via 172.16.0.1 dev gre-pgw1
ip route add 10.6.0.0/22 via 172.16.0.1 dev gre-pgw1 metric 100  # 二选一,推荐

# 另一种写法(可能存在问题, 用前问 AI)
#ip route add 10.6.0.0/22 dev gre-pgw1

# 如果需要通过特定网关到达远端GRE对端,才需要这样的配置:(一般不用)
# ip route add <A的公网IP>/32 via 120.236.143.209

# 如果有第二条备用的 gre 隧道, 比如 gre-pgw2, 重复上面的配置
# metric 度量值, 越大优先级越低。主备不能一样,不然访问是随机使用主备隧道。
ip route add 10.6.0.0/22 via 172.16.0.9 dev gre-pgw2 metric 200

# 4、MTU 调整(前面启动隧道也能调整)
ip link set gre-pgw1 mtu 1400

# 5、启用 IP 转发
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p

# 6、验证配置
# 显示所有隧道接口信息(一行简略信息)
ip tunnel show

# 显示详细接口信息, state 表示状态, DOWN-停用、UNKNOWN-未知/启用	  
ip addr show gre-pgw1

扩展(路由查看、删除命令):

# 查看路由
ip route show
ip route show | grep gre 

ip route | grep default # 查看 Linux 网关

# 查看出口路径和网卡(看是不是走 gre-pgw1 隧道)
ip route get 172.16.0.1

# 删除路由(show 其中一条路由:10.6.0.0/22 via 172.16.0.1 dev gre-pgw1)
ip route del 10.6.0.0/22 via 172.16.0.1 dev gre-pgw1

3、安全组/防火墙放行

  • 云安全平台,入方向和出方向规则,允许 GRE 协议

    • 放行源 IP 为 <A的公网IP>,协议为 GRE 的流量

    • 不用管内网 IP 段 10.6.0.0/22

  • 使用 iptables 或者 firewalld 在操作系统层面允许 GRE 协议

    • 放行内网 IP 段 10.6.0.0/22(GRE 解封装后,需要经过 iptables 的 INPUT 链的检查)

# 一、iptables
# 1、放行 GRE 协议
iptables -I INPUT -p gre -j ACCEPT
# iptables -I OUTPUT -p gre -j ACCEPT

# 2、放行内网 IP 段
# 如果是两台服务器使用隧道接口通信(对等IP),不用配置防火墙
# A ping B 内网 IP, B 需要放行 A 的内网 IP
iptables -I INPUT -s 10.6.0.0/22 -j ACCEPT

# 2.1 放行对端 IP (实测不需要,属于“防御性编程”思维)
# iptables -I INPUT -s 172.16.0.1 -j ACCEPT

# 3、保存到配置文件(可选)
iptables-save
# gre 协议 47, iptables -L -nv 查看会看到


# 二、firewalld(个人选择 iptables 配置,此处配置不完善)
firewall-cmd --permanent --add-protocol=gre
firewall-cmd --reload

PS:iptables、firewalld 二选一配置,不要同时配置,可能会引起冲突。

4、PING 测试连通性

# 1. 从云服务器 ping PGW1的内层IP
ping 172.16.0.1

# 2. 指定通过隧道接口ping(更准确)
ping -I gre-pgw1 172.16.0.1

对等 IP ping 不通可能的原因:

# ping 运营商侧公网 IP(隧道外层地址)
ping -c 3 <A的公网IP>

# 如果 ping 不通,说明根本问题在这里
traceroute -n <A的公网IP>
tracepath -n <A的公网IP>  # CentOS7 默认安装改为了 tracepath

# 输出如下:
# 1  10.222.104.58  3.268 ms  3.326 ms 10.220.3.58  3.449 ms
# 2  11.73.10.121  3.354 ms 11.73.10.25  3.565 ms 11.73.10.57  3.284 ms
# ...
# 8  211.136.209.42  10.030 ms 211.136.209.38  11.382 ms *
# 9  * * *
# 10  * * *
# 数据包能到达第8跳 <A的公网IP>/42(中国移动网络),从第9跳开始全部超时 (* * *)。
# 结论:目标IP 177.235.xx.68 在网络上不可达或被阻止

二、物理专线

场景:物联网卡定向到客户机房。

1、基本参数

  • 客户 GRE IP/专线接口 IP:183.236.103.78/28、专线网关:183.236.103.65/28,对等 IP:10.2.1.10/30

  • 5G UPF 核心网侧 IP:183.235.54.70,对等 IP:10.2.1.9/30

  • 终端地址池(物联网卡)静态 IP:10.98.0.0/21

2、网络拓扑

本地网络 → 深信服路由器(183.236.103.78) → GRE隧道 → 5G UPF(183.235.54.70)
                                  ↓
                           终端地址池: 10.98.0.0/21

3、路由网关配置

# 一、机房网关侧,配置接口(专线物理 IP)
interface GigabitEthernet0/0/1					# 进入接口配置模式
  ip address 183.236.103.78 255.255.255.240	    # 在接口模式下配置IP地址

# 二、GRE、路由配置
# 配置 GRE 隧道,隧道接口名称 Tunnel0/0/5
interface Tunnel0/0/5							# 进入隧道接口配置模式
    tunnel-protocol gre					        # 设置隧道协议为 GRE
    ip address 10.2.1.10 255.255.255.252		# 配置隧道接口IP
    source 183.236.103.78						# 设置隧道源地址
    destination 183.235.54.70					# 设置隧道目的地址

# 配置路由
# 到UPF公网IP的路由(用于建立GRE隧道)
ip route-static 183.235.54.70 32 183.236.103.65

# 到终端地址池的路由(通过GRE隧道)
# 图形界面如果要配置下一跳,就是 10.2.1.9
ip route-static 10.98.0.0 21 Tunnel0/0/5

# 三、备用 GRE 配置
# 一般有主备两条 GRE 隧道,第二条配置重复上面第二部分的配置
# 主备的终端地址池是一样的,备用一定要降低优先级(默认 60,越小优先级越高)
# 备用是等主隧道出问题时用的,如果优先级一样会随机使用隧道
ip route-static 10.98.0.0 21 Tunnel0/0/6 preference 70

4、安全策略放行(未测试、仅供参考)

# 一、入方向规则
security-policy
 # 放行从UPF进入的GRE隧道流量
 rule name permit_gre_in
  source-zone untrust
  destination-zone trust
  source-address 183.235.54.70 32
  destination-address 183.236.103.78 32
  service protocol gre
  action permit
 
 # 放行通过隧道进入的业务流量
 rule name permit_tunnel_data_in
  source-zone trust
  destination-zone trust
  source-address 10.98.0.0 21
  destination-address any
  action permit

5、PING 测试连通性

# 1、ping 核心网侧 IP
ping 183.235.54.70

# 2、测试隧道连通性
ping 10.2.1.9

# 3、ping 终端 IP 
ping 10.98.0.2

三、云服务器间 GRE 连接

于两台阿里云服务器间配置 GRE 隧道,其配置与【互联网专线】部分基本相同。

同云服务商的服务器可以考虑【VPC 对等连接】,不想付费买服务或者跨云服务商才考虑自行搭建 GRE 隧道。

对等 IP:在 GRE 隧道中,对等IP(即隧道两端的点对点IP)可以自行定义,但需要确保它们在同一个网段,并且不能与 VPC 内已有的私有网络重复。

阿里云 A 参数:

  • 公网 IP:11.23.146.4

  • 内网 IP:172.18.99.162

  • 对等 IP:172.16.0.1/30

阿里云 B 参数:

  • 公网 IP:4.107.101.8

  • 内网 IP:172.18.141.169

  • 对等 IP:172.16.0.2/30

1、配置(CentOS 7)

# 1、检查 gre 模块开启、清除旧的隧道(参考互联网专线配置)

# 2、阿里云 A 配置
ip tunnel add tun1 mode gre remote 4.107.101.8 local 172.18.99.162 ttl 255
ip link set tun1 up mtu 1400
ip addr add 172.16.0.1/30 dev tun1
# 开启 ipv4 转发(参考互联网专线配置)

# 2、阿里云 B 配置
ip tunnel add tun1 mode gre remote 11.23.146.4 local 172.18.141.169 ttl 255
ip link set tun1 up mtu 1400
ip addr add 172.16.0.2/30 dev tun1
# 开启 ipv4 转发(参考互联网专线配置)

# 3、安全组/防火墙(参考互联网专线配置)
# 4、测试连通性(参考互联网专线配置)

四、GRE 的优势及意义

(1)透明的端到端IP通信

  • 云服务器看到的就是终端的真实IP 10.6.1.100。网络连接是完全透明的,就像它们在一个大的局域网里一样。

(2)简化管理和配置

  • 一条路由解决所有问题:ip route add 10.6.0.0/22 via 172.16.0.1 dev gre1 这一条命令,就为整个 10.6.0.0/22 网段(最多1022个IP)的所有服务、所有端口提供了连通性。

  • 无需维护映射表:新增终端、新增服务,完全不需要修改网络设备(PGW和云服务器)的配置。

(3)完美的应用兼容性

  • 所有基于IP的协议都能无缝工作,因为它们使用的是标准端口和标准的IP通信模型。

(4)精准的安全控制

  • 云服务器上的防火墙可以精确地设置规则。例如:

    • iptables -A INPUT -s 10.6.1.100 -p tcp --dport 3306 -j ACCEPT (只允许特定终端访问MySQL)

    • iptables -A INPUT -s 10.6.2.0/24 -j DROP (禁止整个子网访问)

一个生动的比喻:

  • 没有GRE(端口映射):就像一个大公司只有一个总机号码(公网IP)。你想找法务部的张三(终端),得先拨总机,然后告诉接线员(PGW):“请转接到分机号10022(映射端口)”,接线员再帮你转到张三的座机。

  • 有GRE隧道:就像公司给每个部门都拉了直拨电话线。你想找法务部的张三,直接拨打他的内部直拨号码(私有IP 10.6.1.100)就行了。

因此,GRE隧道的意义就在于它将复杂的、应用层的“端口映射”问题,简化为了一个网络层的“路由”问题,从而带来了管理、兼容性和安全上的巨大优势。

五、参考与致谢


评论