在两个 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/213、路由网关配置
# 一、机房网关侧,配置接口(专线物理 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 permit5、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隧道的意义就在于它将复杂的、应用层的“端口映射”问题,简化为了一个网络层的“路由”问题,从而带来了管理、兼容性和安全上的巨大优势。