GRE配置详解和路由黑洞及检测机制

linux GRE隧道搭建完成后内网服务器互通配置 gre隧道配置实例_缺省路由

基本路由配置先省略,直接上GRE配置:
合肥:

int tunnel 0/0/1
 //创建隧道
 ip add 192.168.13.1 24
 //给隧道口ip地址,没有地址怎么传输?
 tunnel-pro gre
 //隧道的模式
 so 12.0.0.1 
 //牌照的源ip
 dest 23.0.0.3 
 //牌照的目的ip

在公网上跑,私网地址是会被丢弃的,所以需要公网地址的牌照
隧道建立好之后还有一个问题,怎么把数据包送到隧道上呢?

有两种方法,针对不同的网络类型:

1. 网段较少的拓扑

可以通过静态路由来实现
ip route-static 192.168.20.0 24 tunnel 0/0/1

下一跳必须是隧道口的地址或者隧道接口,否则,数据包还是会和之前一样,从缺省路由转发出去。

2. 网段教多的拓扑

如果接入的主机很多,一条一条写静态太麻烦了,而且有去就必须有回,double的麻烦,所以这里可以通过ospf来宣告,GRE支持组播技术

ospf 1 router-id 1.1.1.1
 a 0
 net 192.168.10.0 0.0.0.255
 net 192.168.13.0 0.0.0.255
 //一定要宣告隧道地址,不然路由器不知道从哪转发

但是,这里能不能也宣告公网地址呢?多宣告多知道些路由不是更好吗?

物极必反,不一定

假如把12.0.0.0和23.0.0.0 网段宣告进去
查看路由表会发现多了一条从tunnel口出去的路由:

Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface
        0.0.0.0/0   Static  60   0          RD   12.0.0.2        GigabitEthernet
0/0/1
       23.0.0.0/24  OSPF    10   1563        D   192.168.13.2    Tunnel0/0/1

本来GRE将通行证拿好之后,应该通过缺省路由从g0/0/1口转发出去,通过ISP的路由到达对端,但是,这里多了一条ospf路由,根据路由匹配原则,肯定先匹配ospf,

于是数据包刚从tunnel里出来,又得回去了。回去又得打牌照,反反复复GRE就傻掉了

并且这时候的ospf邻居从down到full,full了又down

linux GRE隧道搭建完成后内网服务器互通配置 gre隧道配置实例_缺省路由_02

就变成了路由黑洞
其实在一开始配置的时候,比较粗心,在接口绑定nat时把接口写错了,导致GRE的protocol一直是down的状态:

那么,让tunnel的protocol成up的机制是什么呢?

其实只要路由没有问题,protocol就是up的状态,即使对端没有配置,tunnel也感受不到,如果公司到分部做了两个隧道,主备实现,如果主有故障,比如对端路由有问题,或者运营商路由故障,这时需要切换到备份隧道,但是tunnel没有感知到,依旧是up,数据包就会丢失,

解决方法:

GRE有keepalive检测机制,配置后GRE会发送keepalive报文,并且对端超过3次没有恢复,tunnel就会自动变成down状态
配置后GRE会默认5S发一次

下面是完整配置(包括路由等):
合肥:

sys
sys HF
dhcp en
int g0/0/0
ip add 192.168.10.254 24
dhcp select inter
int g0/0/1
ip add 12.0.0.1 24
ip route-static 0.0.0.0 0 12.0.0.2 24
acl 2000
rule 5 per so 192.168.10.0 0.0.0.255
int g0/0/1
nat out 2000
int tunnel 0/0/1
ip add 192.168.13.1 24
tunnel-pro gre
so 12.0.0.1 
dest 23.0.0.3
keepalive
//ip route-static 192.168.20.0 24 tunnel 0/0/1
ospf 1 router-id 1.1.1.1
a 0
net 192.168.10.0 0.0.0.255
net 192.168.13.0 0.0.0.255

上海:

sys
sys SH
dhcp en
int g0/0/0
ip add 23.0.0.3 24
int g0/0/1
ip add 192.168.20.254 24
dhcp select inter
ip route-static 0.0.0.0 0 23.0.0.2
acl 2000
rule 5 per so 192.168.20.0 0.0.0.255 
int g0/0/1
nat out 2000
int tunnel 0/0/1
ip add 192.168.13.2 24
tunnel-pro gre
dest 12.0.0.1 
so 23.0.0.3
keepalive
//ip route-static 192.168.10.0 24 tunnel 0/0/1
ospf 1 router-id 2.2.2.2
a 0
net 192.168.20.0 0.0.0.255
net 192.168.13.0 0.0.0.255