防火墙规则接受首地址和末地址,例如 192.168.0.200 到 192.168.0.255,而路由不接受。一条路由只能容纳网络和掩码,这意味着连续范围必须先变成一个或多个对齐的前缀,然后 OpenVPN 才能安装它。把 route-nopull 与未对齐区间配在一起的配置文件,正是故障通常藏身之处,因为文件能解析,却没有路由匹配。把块算对,故障就会在一条命令里显现。

误解:范围就是路由

路由表保存网络和掩码的组合,并选择最长匹配,因此有起点和终点的区间无处安放。一个覆盖 256 个地址的前缀覆盖 .0 到 .255,一半大小覆盖 .0 到 .127,只有与这些边界对齐的范围才能一步映射。其余都必须切成块。更小的路由仍然意味着原来的区间。

没有与前缀对齐的范围不是压缩路由。它是另一类对象,把它当作路由,正是静默故障开始的地方。

对齐是算术,不是风格

块的大小由前缀长度决定。/29 只能从能被 8 整除的地址开始,/28 从能被 16 整除的地址开始,/27 从能被 32 整除的地址开始。把块挪离边界,掩码覆盖的地址集合就会与你的本意不同。

从低端往上加。每一步取不超过范围末端的最大的对齐块,然后从它之后的第一个地址继续。块之间不会重叠,因为每一块都从上一块停下的地方开始。

两个人手算应该得到同一结果。出现分歧,说明有人允许了未对齐的起点。

走一遍 200 到 255

StepStartBlock that fitsLine for the profile
1.200, multiple of 8/29, 8 addresses192.168.0.200 255.255.255.248
2.208, multiple of 16/28, 16 addresses192.168.0.208 255.255.255.240
3.224, multiple of 32/27, 32 addresses192.168.0.224 255.255.255.224

范围从 .200 开始,它是 8 的倍数,所以第一块是从 .200 到 .207 的 /29。这八个地址之后,第一个空闲值是 .208,它能被 16 整除,所以 /28 取 .208 到 .223。剩下的是 .224 到 .255,三十二个地址,起点是 32 的倍数,所以是 /27。这三行就是全部分解。

把它们写成路由行,而不是散文。只保留第一行的配置只覆盖八个地址,其余都留在隧道之外。

route-nopull
route 192.168.0.200 255.255.255.248
route 192.168.0.208 255.255.255.240
route 192.168.0.224 255.255.255.224

最后一块需要边界检查。在 192.168.0.224/27 内,.224 是网络地址,.255 是广播地址,所以必须在 .255 上应答的主机被前缀覆盖,却仍然不可达。把那台主机移走,或者换一种方式切分范围,而不是把块路由出去然后指望它。

route-nopull 对整幅图的影响

只有在服务器推送的路由不受欢迎时才加 route-nopull。没有这条指令时,推送的路由和这些行共存,最长前缀获胜。加上它之后,推送的 DNS 和 DHCP 选项也会消失,因此内部名称解析需要自己的配置。这个副作用会让为了修路由问题而加指令的人吃惊。

按正确的理由加,而不是当作条件反射。去掉推送的路由是一个有 DNS 后果的策略决定。如果服务器能推送同样的三个前缀,就让它推,并删掉客户端的副本,让列表只有一个主人。

能抓住常见错误的检查

检查每个掩码都是连续的一比特。255.255.255.248 通过,255.255.255.200 不通过,不连续的掩码会被拒绝或误读。然后确认每个块里一个地址的路径。

ip route get 192.168.0.205
ip route get 192.168.0.220
ip route get 192.168.0.240

每个应答都应该点名隧道接口。结果点名物理适配器,说明那行从未安装,这常常发生在配置文件连接后桌面网络管理器重写路由表的时候。

给列表选一个主人。当服务器能推送同样的前缀时,就推送它们,并删除客户端的修改。单一主人意味着拼写错误只有一个落脚处,客户端和服务器也不会对哪些地址在隧道内产生分歧。

相关文章