杏泉网络:OSPF篇
前情提要:
如何搭建自己的『暗网』
杏泉网络:DNS篇
只能说最近真的忙坏了,要准备实习,准备考试,还得考虑专升本的事情(是的,笔者专科在读),前两天还有招聘会要参加,虽然说忙点好,但是主要还是在于...可能是时间分配不太合适?
算了,还是抽空更一下文章吧
前言
其实笔者对于OSPF的『感情』——如果可以这么叫的话——算是比较深厚的了,从最开始研究169网络(最近有计划稍微聊聊和这个有关的)的时候接触OSPF,到后来看到有人折腾梯子分流也用到OSPF,然后就是课上老师教的也是OSPF。现在搭建杏泉网络,自然也少不了OSPF的戏份。
关于动态路由协议,其实没什么好说的,本质上就是通过各种方式让路由器能协商一条最优路由,实现数据高效传输——反正你要翻书基本上也能得到这个结论,所以笔者在这里就不多提了。
就实际应用而言,OSPF分为三个版本,『早就不知道飞哪去/怀疑甚至有没有出现过』的OSPFv1,目前常用的用于IPv4的OSPFv2(通常简称OSPF指的就是他),以及更新的支持IPv6的OSPFv3(也有些地方会叫做OSPF6)。为了便于叙述起见,下文提到OSPF,一般都是指OSPFv2。至于OSPFv3....就叫做OSPFv3咯,还能叫啥。
敬请注意
必须要提的一点是,笔者花了很长时间去搭建整个OSPF结构,导致补丁极多,目前的状态是:两台机器已经可以正常进行OSPF和OSPFv3通信,能正常交换路由信息,也能互通。但是笔者穷,手头机器就这俩,没有别的链路,也没有别的路由协议可以对接(不是很想加入DN42之类的网络),所以没办法确认下面这份(拼凑出来的)配置会有什么隐藏的bug存在,只是通了而已,也没有做什么Stub区域什么别的区域,顶多就是加了个被动口,所以在模仿之前请三思,也不要把这篇文章作为正式教程。
安装FRRouting
一般而言,想要在Linux机器上实现各类动态路由协议,方法之一就是使用FRRouting,性能不错,基本上可以满足我们的需求。这玩意的配置语法比较类似于思科系的软件,所以如果玩过思科或者锐捷设备的朋友应该比较熟悉....笔者就惨了,学校教的是华为设备,淦。
在安装之前,首先删除之前设定好的静态路由,避免冲突
# 1.us.xq
ip r d 198.18.4.0/24
ip -6 r d fd04:17:1:1::/48
# 1.hk.xq
ip r d 198.18.3.0/24
ip -6 r d fd04:17:1:0::/48
然后就可以直接安装FRRouting
apt update
apt install frr
# 装好后不要忘记关闭rp_filter
echo "net.ipv4.conf.default.rp_filter=0" >> /etc/sysctl.conf
echo "net.ipv4.conf.all.rp_filter=0" >> /etc/sysctl.conf
sysctl -p
接着,编辑/etc/frr/daemons
,修改以下内容,启用OSPF协议
# 在文件的第18和19行
ospfd=yes
ospf6d=yes
修改完之后不要忘记使用systemctl restart frr
重启FRR
此时理论上就可以直接修改/etc/frr/frr.conf
来调整配置了。
配置FRRouting
好了,问题就出在这里了。
因为OSPF和OSPFv3的那些破事,笔者翻阅了各种文档,各种案例,各种查询,各种论坛(尤其是v3,配置案例跟没有一样),最后综合各个来源,才让这个软件可以开始交换路由。
讲辛酸史之前,首先,先贴配置,塞进去/etc/frr/frr.conf
就行。这份配置是1.us.xq的,对于1.hk.xq大同小异,注意宣告的网段和所需接口就行
frr version 8.4.4
frr defaults traditional
hostname 1.us.xq
service integrated-vtysh-config
!
ip router-id 198.18.3.1
!
interface wgxqnet-hk-1
ipv6 ospf6 area 0
ipv6 ospf6 network point-to-point
no ip ospf passive
exit
!
interface lo
ipv6 ospf6 area 0
ipv6 ospf6 passive
exit
!
router ospf
ospf router-id 198.18.3.1
redistribute connected route-map adv-to-ospf
redistribute static
passive-interface default
network 198.18.0.0/31 area 0
exit
!
router ospf6
ospf6 router-id 198.18.3.1
exit
!
access-list 0 remark fd04:17::
!
route-map adv-to-ospf permit 10
match interface lo
exit
!
配置接口的时候不要忘了,我们用的是点对点链路,而且WireGuard被设计为默认不启用多播,所以一定要设置接口为点对点类型,否则可能链路起不来。
此外,OSPF是可以用network命令来宣告网段,但是OSPFv3取消了这个命令,一般是把某个地址段搞到接口上之后,直接在接口视图下把这个接口宣告进去。如果你这个接口直接接终端(例如本例中VPN接入),那么在这个接口配被动(passive)就行。
此外,OSPF很看重掩码(应该OSPFv3也是),如果一个接口地址前缀长度是/32
(V6就是/128
),那么OSPF一般情况下是不会把他宣告进去的,除非你强制指定redistribute connected
。但是直接重分发直连接口可能会引起问题(主要是他会把公网口也搞进去),所以这份配置在宣告OSPF的时候,用的是redistribute connected
+ route-map过滤的方式筛选具体的接口。
综合以上乱七八糟的说法,在上面那份配置的基础上,如果我现在有某个接口想要接入到网络中,一般来说会这么操作:假如1.hk.xq有个dummy口叫做du,地址是172.28.94.100/24
+ fd88::8888:8888/64
(反正你实际操作也是一样的,比如这个口接的是WireGuard,流量送过去也是WireGuard来操作)那么推断出来基本上就是:
# vtysh
1.hk.xq# conf t
1.hk.xq(config)# route-map adv-to-ospf permit 20
1.hk.xq(config-route-map)# match int du
1.hk.xq(config-route-map)# q
1.hk.xq(config)# int du
1.hk.xq(config-if)# ipv6 ospf6 area 0
1.hk.xq(config-if)# ipv6 ospf6 passive
1.hk.xq(config-if)# q
1.hk.xq(config)# q
1.hk.xq# q
# 退回到Linux下
然后对端就可以正常看到路由推送过来了:
1.us.xq# show ip ospf route
.....
============ OSPF external routing table ===========
N E2 172.28.94.0/24 [10/20] tag: 0
via 198.18.0.1, wgxqnet-hk-1
1.us.xq# show ipv6 ospf6 route
.....
*N IA fd88::/64 fe80::2 wgxqnet-hk-1 00:02:57
1.us.xq# ping 172.28.94.100
PING 172.28.94.100 (172.28.94.100) 56(84) bytes of data.
64 bytes from 172.28.94.100: icmp_seq=1 ttl=64 time=150 ms
64 bytes from 172.28.94.100: icmp_seq=2 ttl=64 time=152 ms
.....
配完以后笔者头都大了,你头大了吗?
写在最后
还是那句话,这篇不是正式的教程,也不保系统能稳健运行。
如果你觉得自己玩不动,不要犹豫,直接上静态路由!
当然也欢迎并感谢各位大佬在评论区指点小弟一二。
(完)