杏泉网络: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
.....

配完以后笔者头都大了,你头大了吗?

写在最后

还是那句话,这篇不是正式的教程,也不保系统能稳健运行。
如果你觉得自己玩不动,不要犹豫,直接上静态路由!

当然也欢迎并感谢各位大佬在评论区指点小弟一二。

(完)


木头箱子脆脆,但是这样正好

如无特殊声明,本站内容均遵循 CC BY-NC-SA 4.0 协议

转载请注明出处并保留作者信息,谢谢!

none
最后修改于:2025年05月21日 00:41

添加新评论

提醒:站长手头紧,没有配备『评论回复邮件提醒』功能
评论后,劳烦您隔一段时间回到本页面查看站长回复(一般都会回)