在 OpenVPN 网络上正确配置 Quagga OSPF

在 OpenVPN 网络上正确配置 Quagga OSPF

首先,这是我的网络拓扑的简单版本。

                      [ hub ]
                         |
                      OpenVPN
                         |
10.77.1.0/24--[ base ]---|---[ mr0  ]--10.77.2.0/24
10.77.3.0/24--[ mr1  ]---|---[ mr2  ]--10.77.5.0/24
10.77.5.0/24--[ mr3  ]---| ...

hub是运行 OpenVPN 服务器的 Ubuntu VPS,具有静态公共 IP。 base我家的 pfSense 防火墙位置固定,但 IP 可变。每个mr#节点都是一个移动路由器,没有一致的 IP 地址或位置,可能位于也可能不位于其他 NAT 防火墙后面。列出的 CIDR 网络是直接连接到其路由器的超网。

为了读取日志,以下是我的 IP、路由器 ID 和操作系统:

host  ip           ospf id        os
hub   10.77.0.254  10.77.255.254  ubuntu
base  10.77.0.253  10.77.255.253  pfsense
mr0   10.77.0.252  10.77.255.252  lede
mr1   10.77.0.251  10.77.255.251  pfsense
mr2   10.77.0.250  10.77.255.250  centos
mr3   10.77.0.249  10.77.255.249  vyos

在中心服务器上,我启用了客户端到客户端,并将大量routes数据iroutes推送到各个客户端。使用此设置,我可以从任何节点连接到任何节点(在防火墙规则内)。但是,此设置不可扩展,每次路由更改时我都必须重新启动客户端和服务器,因此我正在努力用 Quagga OSPF 替换此静态配置。

我的问题类似于https://serverfault.com/questions/189739/tough-routing-problem-with-linux-quagga-and-openvpn然而,他们接受的解决方案是使所有内容都静态路由,而这正是我试图避免的。

到目前为止,我的 Linux 路由器 ( mr2)、hub和我添加到 VPN 以测试 3 个 OSPF 路由器的随机 Linux 桌面之间有动态路由。我的VyOS 和LEDE 路由器出现问题,原因与此问题无关。(编辑:VyOS 夜间运行正常)


现在来看看难题:

我的两个 pfSense 防火墙(一个是base,另一个是mr1)都发送类似的日志消息:

2017/12/31 13:14:55 OSPF: Packet[DD]: Neighbor 10.77.255.250: Initial DBD from Slave, ignoring.
2017/12/31 13:15:00 OSPF: Packet[DD] [Slave]: Neighbor 10.77.255.254 packet duplicated.
2017/12/31 13:15:00 OSPF: *** sendmsg in ospf_write failed to 10.77.0.254, id 0, off 0, len 72, interface ovpnc1, mtu 1500: Network is unreachable
2017/12/31 13:15:00 OSPF: *** sendmsg in ospf_write failed to 10.77.0.254, id 0, off 0, len 108, interface ovpnc1, mtu 1500: Network is unreachable
2017/12/31 13:15:00 OSPF: Packet[DD]: Neighbor 10.77.255.250: Initial DBD from Slave, ignoring.
2017/12/31 13:15:00 OSPF: *** sendmsg in ospf_write failed to 10.77.0.250, id 0, off 0, len 52, interface ovpnc1, mtu 1500: Network is unreachable
2017/12/31 13:15:05 OSPF: Packet[DD] [Slave]: Neighbor 10.77.255.254 packet duplicated.

由于 pfSense 盒无法发送其 OSPF 回复,因此网络处于这种状态:

hub# sh ip os ne

    Neighbor ID Pri State           Dead Time Address         Interface            RXmtL RqstL DBsmL
10.77.255.250     1 Full/Backup       37.090s 10.77.0.250     tun0:10.77.0.254         0     0     0
10.77.255.251     0 ExStart/DROther   31.661s 10.77.0.251     tun0:10.77.0.254         0     0     0
10.77.255.253     0 ExStart/DROther   31.648s 10.77.0.253     tun0:10.77.0.254         0     0     0

由于无法发送任何内容,pfSense 节点卡住了:

base# sh ip os ne

Neighbor ID     Pri State           Dead Time Address         Interface            RXmtL RqstL DBsmL
10.77.255.250     1 ExStart/Backup    36.505s 10.77.0.250     ovpnc1:10.77.0.253       0     0     0
10.77.255.251     0 2-Way/DROther     37.276s 10.77.0.251     ovpnc1:10.77.0.253       0     0     0
10.77.255.254     1 Exchange/DR       37.763s 10.77.0.254     ovpnc1:10.77.0.253       1     0     0

说实话,我不确定这是 OpenVPN 配置问题、Quagga 配置问题、操作系统配置问题,还是一个或多个组件中的错误。当我只使用以太网链路时,Quagga 似乎工作正常(实际上,、basemr1目前mr3都共享一个物理位置),因此似乎仅限于使用 OSPF over OpenVPN。


编辑于 2018 年 1 月 6 日:在此过程中,我注意到共同点是每个正常工作的路由器都是基于 Linux 的。我反复检查netstat结果,发现我的 pfSense 盒子以不同的方式实现了 OpenVPN 的 tun 适配器:在 Linux 中,tun 适配器的地址使用子网掩码设置,从而允许直接与 VPN 连接的节点“无需”路由器跳转即可联系。在 FreeBSD 中,tun 适配器作为内部点对点公开(即使在 Linux 中也是如此),并添加了映射到网络其余部分的 IPv4 路由。不记得是我这样做的还是它自动发生的,但我猜现在的目标是:a) 如何让 FreeBSD/pfSense 创建一个行为类似于 Linux 的 TUN 适配器,允许“直接”连接,或者 b) 如何让 Quagga 允许路由其数据包?

pfSense:

[root@base ~]# ifconfig ovpnc1
ovpnc1: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
    options=80000<LINKSTATE>
    inet6 fe80::20c:29ff:feac:faf4%ovpnc1 prefixlen 64 scopeid 0x16
    inet 10.77.0.253 --> 10.77.0.225  netmask 0xffffffe0
    nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
    groups: tun openvpn
    Opened by PID 27659
[root@base ~]# netstat -nr4 | grep -e ovpnc1 -e link#22
10.77.0.224/27     10.77.0.225        UGS      ovpnc1
10.77.0.225        link#22            UH       ovpnc1
10.77.0.253        link#22            UHS         lo0
...
[root@base ~]# ping -r -c 2 10.77.0.254
PING 10.77.0.254 (10.77.0.254): 56 data bytes
ping: sendto: Network is unreachable
ping: sendto: Network is unreachable

--- 10.77.0.254 ping statistics ---
2 packets transmitted, 0 packets received, 100.0% packet loss

Linux:

[root@mr2 ~]# ip a sh dev tun0
18: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
    link/none
    inet 10.77.0.250/27 brd 10.77.0.255 scope global tun0
       valid_lft forever preferred_lft forever
[root@nl3-mr2 ~]# ip ro | grep tun0
10.77.0.224/27 dev tun0 proto kernel scope link src 10.77.0.250
...
[root@mr2 ~]# ping -r -c 2 10.77.0.254
PING 10.77.0.254 (10.77.0.254) 56(84) bytes of data.
64 bytes from 10.77.0.254: icmp_seq=1 ttl=64 time=51.1 ms
64 bytes from 10.77.0.254: icmp_seq=2 ttl=64 time=51.2 ms

--- 10.77.0.254 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 51.117/51.199/51.281/0.082 ms

OpenVPN 服务器.conf:

port 1194
management localhost 1194
proto udp
dev tun

ca ca.crt
cert server.crt
dh dh2048.pem
tls-auth ta.key 0
key-direction 0

auth SHA256
cipher AES-256-CBC

mode server
tls-server
topology subnet
push "topology subnet"
ifconfig 10.77.0.254 255.255.255.224
push "route-gateway 10.77.0.254"
client-to-client
config ccd/routes.conf
push "route 10.77.4.0 255.255.255.0 10.77.0.254 250"
client-config-dir ccd

user nobody
group nogroup

persist-key
persist-tun

status openvpn-status.log

verb 4

示例 ccd 文件(此文件用于base):

config ccd/routes_push.conf
ifconfig-push 10.77.0.253 255.255.255.224
iroute 10.77.1.0 255.255.255.0

ccd/routes.conf:

route 10.77.1.0 255.255.255.0 10.77.0.253 250
route 10.77.2.0 255.255.255.0 10.77.0.252 250
route 10.77.3.0 255.255.255.0 10.77.0.251 250
route 10.77.5.0 255.255.255.0 10.77.0.250 250
route 10.77.6.0 255.255.255.0 10.77.0.249 250

ccd/routes_push.conf:

push "route 10.77.1.0 255.255.255.0 10.77.0.253 250"
push "route 10.77.2.0 255.255.255.0 10.77.0.252 250"
push "route 10.77.3.0 255.255.255.0 10.77.0.251 250"
push "route 10.77.5.0 255.255.255.0 10.77.0.250 250"
push "route 10.77.6.0 255.255.255.0 10.77.0.249 250"

缩写运行配置hub

...
!
service advanced-vty
service password-encryption
!
debug ospf event
!
...
!
interface tun0
 description grandcentral-hub
 ip ospf network broadcast
 ipv6 nd suppress-ra
 no link-detect
!
router ospf
 ospf router-id 10.77.255.254
 log-adjacency-changes
 network 10.77.0.224/27 area 0.0.0.0
 network 10.77.4.0/24 area 0.0.0.0
 network 172.17.0.0/16 area 0.0.0.0
 area 0.0.0.0 range 10.77.4.0/24
!
ip forwarding
ipv6 forwarding
!
line vty
!
end

缩写的运行配置base,由 pfSense 生成:

...
!
interface ovpnc1
 ip ospf network broadcast
 ip ospf priority 0
!
...
!
router ospf
 ospf router-id 10.77.255.253
 log-adjacency-changes detail
 passive-interface em0.1
 network 10.77.0.224/27 area 0.0.0.0
 network 10.77.1.0/27 area 0.0.0.0
 network 10.77.1.192/26 area 0.0.0.0
 network 192.168.254.0/24 area 0.0.0.0
!
ip forwarding
ipv6 forwarding
!
line vty
!
end

答案1

编辑于 2018 年 1 月 20 日 17:57 CST:重力指出(非常感谢),只需使用 tap 设备而不是 tun 即可解决所有问题。应该早点想到这一点。

话虽如此,我仍在寻找使用 tun 的解决方案,看看是否可行。我不知道以太网报头中大约 20 个奇数字节是否真的对 DSL 链路有影响,而且可以肯定的是,由于所有条目现在都是虚拟MULTI: Learn:MAC 地址而不是 IP 地址,因此日志记录更加不透明。


看来我想做的事情无法直接用 tun 实现。OpenVPN 本质上是一个点对点接口,而 Linux 的 OpenVPN/TUN 实现允许客户端到客户端的通信隐藏在网络堆栈中。

相比之下,FreeBSD 公开原始的点对点接口并安装路由来处理客户端到客户端(在干净的 FreeBSD 11.1-RELEASE 上测试)。

此外,当您更改 OpenVPN 服务器的内部 IP 地址时,它仍会将默认 IP 地址(范围内最低的可用 IP)分配给点对点接口。

因此,为了解决这个问题,我必须将所有内容重新实现为点对多点系统(耶,学到了新东西)。我得到答案后会更新此答案。

相关内容