RouterOS在一端动态IP情况下配置GRE over IPSec VPN

IPSec有两种模式:transport和tunnel。Transport模式双方仍然使用各自的公网IP互联,只不过传送的数据会被自动加密,必须两端的IP固定(否则服务器端也要动态更新客户端IP),tunnel模式则是建立一个类似VPN的点对点通道,需要给通道分配内网IP,在公网IP的要求上则相对比较宽松(只需要客户端更新自己的IP),缺点是浪费20MTU,传输效率稍低。本文讲解如何配置IPSec tunnel连接,以及在其上配置一个GRE隧道。

配置IPSec

这里我们统一把固定IP的一侧叫做服务端,动态IP的一侧叫做客户端。需要准备两组IP地址:

  • 服务端的公网IP
  • 客户端当前的公网IP
  • 服务端的隧道内网IP
  • 客户端的隧道内网IP(如果你有多个客户端,在服务器那侧可以填写一个IP段;而对于每台客户端需要填写准确IP)

注:请不要把这里所述隧道内网IP段加入OSPF等动态路由协议的网段。如果需要跑动态路由协议,可以在GRE隧道上另配一组IP。

在建立完IPSec隧道以后,两台设备就可以使用这里规定的内网IP互相通信(即建立VPN)了。

服务端

客户端

完成以上两部分设置以后,在任意一侧的IPSec Policies里应该可以看到一条连接,PH2 state为established,表示IPSec握手成功。

注:

  • 如果你使用图形界面方式来设置的话,在添加policy时protocol请填入数字47(GRE协议号);
  • 如果你在配置之前已有对该内网网段的NAT规则并且有设备尝试连接过该IP,NAT规则可能已被conntrack缓存;此时会出现IPSec Policy显示established但是GRE隧道不通的情况。清空conntrack缓存或者重启路由器即可解决。

客户端动态更新IP

把以下脚本作为你PPPoE拨号端口对应PPP Profile的On Up触发脚本。

建立GRE隧道

刚才的IPSec隧道只是点对点连接。如果我们要把点对点以外的流量也路由到隧道那头,就需要GRE协议的帮助。

因为已经建立了IPSec隧道,GRE隧道的配置就变得很简单:

服务端

客户端

然后,你就可以把路由表里面的部分条目指向这个GRE隧道啦。

注:这边写死了MTU,你可以试试不填让路由器自动协商或者自己去算一个更优的值。


感谢LTY在撰写本文的过程中提供的帮助。

参考:

发表评论