能实现互通。关键步骤包括:验证两端公网ip双向icmp可达并放行gre协议47;开启ipv4转发及加载ip_gre模块;创建镜像配置的gre隧道接口并分配独立隧道地址;添加静态路由将对方内网流量指向对端隧道ip;最后持久化配置并重点验证内网主机间连通性与路由走向。

直接在两台跨机房的Linux服务器上建GRE隧道加静态路由,就能让两边内网像在一个局域网里一样互通。关键不是“能不能”,而是每一步配置必须对齐:隧道端点IP能通、转发开启、隧道地址不冲突、路由指向隧道接口。
确认基础连通性与系统准备
GRE本身不加密、不校验,依赖底层IP可达。所以第一步不是敲命令,是验证:
- 两台服务器各自的公网IP(或可路由的外网IP)必须双向ICMP可达;如果走NAT或防火墙,需放行协议号47(GRE)
- 执行 echo 1 > /proc/sys/net/ipv4/ip_forward 并写入 /etc/sysctl.conf 中的 net.ipv4.ip_forward=1,然后 sysctl -p
- 加载内核模块:modprobe ip_gre;检查是否生效:lsmod | grep ip_gre
- 关闭或放行iptables/firewalld对隧道接口(如gre1)和协议47的拦截
创建并启用GRE隧道接口
隧道本质是一个虚拟点对点设备,两端配置需严格镜像。假设:
- 服务器A公网IP为 203.0.113.10,内网段为 10.1.1.0/24
- 服务器B公网IP为 203.0.113.20,内网段为 10.1.2.0/24
- 为隧道分配独立小网段 192.168.100.0/30(仅用于隧道两端通信)
在A上执行:
ip tunnel add gre0 mode gre remote 203.0.113.20 local 203.0.113.10 ttl 255<br>ip addr add 192.168.100.1/30 dev gre0<br>ip link set gre0 up
在B上执行:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
ip tunnel add gre0 mode gre remote 203.0.113.10 local 203.0.113.20 ttl 255<br>ip addr add 192.168.100.2/30 dev gre0<br>ip link set gre0 up
完成后,ping 192.168.100.2(从A)和 ping 192.168.100.1(从B)应通——这是隧道通的基础。
添加静态路由使内网流量走隧道
隧道接口通了,但默认路由不会自动把私网流量引过去。需要显式告诉系统:“去对方内网的包,交给gre0发”:
- 服务器A添加:ip route add 10.1.2.0/24 via 192.168.100.2 dev gre0
- 服务器B添加:ip route add 10.1.1.0/24 via 192.168.100.1 dev gre0
注意这里用 via + 对端隧道IP 而非 dev gre0,更符合点对点隧道语义,也避免某些内核版本下ARP问题。执行后,A上的 10.1.1.x 主机应能直接 ping 通 B 上的 10.1.2.x 主机(无需NAT,无额外封装层)。
持久化与验证要点
重启后隧道和路由会丢失,需固化:
- 将 ip tunnel 和 ip route 命令写入网络服务启动脚本(如 /etc/network/if-up.d/ 或 systemd service),或使用 iproute2 的配置文件(如 /etc/sysconfig/network-scripts/ifcfg-gre0,CentOS系)
- 验证时不要只测隧道IP,重点测:从A内网主机ping B内网主机、从B traceroute A内网主机看路径是否经gre0、tcpdump -i gre0 icmp 确认封装包真实发出
- 若不通,优先检查:ip route get 10.1.2.100 是否返回 via 192.168.100.2;ip link show gre0 状态是否 UP;iptables -t raw -L 是否DROP了协议47










