问题描述
在建立 xl2tpd 隧道时,会添加一条到对端主机的路由(但非到达某个网络的路由),也就是说我们能够通过 LAC 访问 LNS 主机。
在实际情况中,我们可能会将 L2TP LNS 作为路由器,而希望多个 LAC 间能够相互访问,来构建简单的混合云,即实现各网络互联。
LAN-A <--> Router-A <==== (L2TP-Tunnel) ====> L2TP-LNS || || (L2TP-Tunnel) || || vv Client-01
当 Client-01 连接 L2TP LNS 后,虽然能得到网络地址,但是由于广播域的隔离,它是无法访问 Router A 下属的 LAN-A
解决方案
#1 开启 LNS 转发
首先,开启LNS所在主机的数据包转发(net.ipv4.ip_forward=1),即可实现其路由的功能[1],在中间转发来自各个 LAC 的数据包。
#2 设置 LNS 路由
接下来需要在各个LNS主机上设置路由。这一点可以通过ppp的脚本实现,当连接成功后,执行脚本添加路由。
在CentOS中,修改/etc/ppp/ip-up.local文件,加上如下内容:
#!/bin/sh case "$5" in # 地址172.18.104.1是对端的IP地址,及LNS的IP地址 "172.18.104.1") ip route add 172.18.104.0/24 via 172.18.104.1 ;; esac
这个脚本用于添加默认路由,它会被传入六个参数[2],其中$5是对端地址。不要忘记给脚本执行权限
在Debian中,会有稍微的不同之处,需要在 /etc/ppp/ip-up.d/ 中创建一个可执行文件,然后追加上述脚本。
有关其他的内容可以参考ppp的官方文档「ppp/Documentation」。
#3 建立 L2TP 连接
断开LAC的连接,然后重新连接,然后检查路由表是否正确。
补充说明
动态地址问题(对于复杂的拓扑的解决方案)
原因在于网络地址是 L2TP LNS 随机分配的,并且接口名 pppX 也是顺序生成的。鉴于此,如果下次重连,网络地址、接口名都有可能发生变化,此时脚本将添加错误的路由条目。
解决方案有以下几种:
1)修改 LAC 配置,由 LAC 声明其要使用的 IP Address,而非由 L2TP LNS 随机下发。这样我们就能在脚本中直接使用 IP Address 进行判断,并添加相关路由等等操作(能够安全使用该笔记中介绍的方法)。但是我们没有采用该方案:如果能够固定地址,就意味着我们能够通过配置脚本实现互通,但这种维护方式繁琐(编写脚本、记忆拓扑);当添加新设备节点后(引入新的网段),我们还需要修改各个节点的配置,以当前所有节点能与新节点互通。
2)两端运行 OSPF 协议:虽然地址是变化的,但是网段是固定的。我们只需要将接口囊括其中,让 Router-A 与 L2TP-LNS 互相路由学习。除了解决该问题以外,通过 OSPF 还能实现路由条目自动通告(学习),则新加节点能够快速学习到路由,而无需手动配置、降低维护成本。
3)除了技术手段外,Workaround:通过测试当前 IP Address 提供的服务,来检测当前地址所在的区域。
参考文献