首先,这是我的网络拓扑的简单版本。
[ 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 似乎工作正常(实际上,、base
和mr1
目前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)分配给点对点接口。
因此,为了解决这个问题,我必须将所有内容重新实现为点对多点系统(耶,学到了新东西)。我得到答案后会更新此答案。