Во-первых, простая версия моей сетевой топологии.
[ 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
- это Ubuntu VPS, на котором работает сервер OpenVPN со статическим публичным IP-адресом. base
- это брандмауэр pfSense в моем доме, который имеет постоянное местоположение, но переменный IP. Каждый из узлов mr#
является мобильным маршрутизатором, который не имеет согласованного IP-адреса или местоположения и может находиться или не находиться за дополнительным межсетевым экраном NAT. Перечисленные сети CIDR представляют собой суперсети, напрямую подключенные к их маршрутизатору.
Для чтения журналов приведены мои IP-адреса, идентификаторы маршрутизатора и операционные системы:
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
и случайным рабочим столом Linux, который я добавил в VPN для тестирования 3 маршрутизаторов OSPF. Мои маршрутизаторы 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 работает нормально , когда я просто использую Ethernet-каналы (как это происходит, base
, mr1
и mr3
настоящее время совместно используют физическое местоположение), поэтому кажется, что это ограничено использованием OSPF поверх OpenVPN.
РЕДАКТИРОВАТЬ 2018 ЯНВАРЯ 06: В течение всего этого процесса я заметил, что общим знаменателем было то, что каждый работающий маршрутизатор был основан на Linux. Изучив результаты netstat
в миллионный раз, я обнаружил, что в моих боксах pfSense реализован адаптер Tun OpenVPN по-разному: в Linux адрес адаптера tun устанавливается с маской подсети, что позволяет напрямую связываться с узлами, подключенными к VPN, "без" роутер хоп. В FreeBSD адаптер tun отображается как внутренняя точка-точка (как, впрочем, и в Linux), и добавляется маршрут IPv4, который сопоставляется с остальной сетью. Не могу вспомнить, сделал ли я это или это произошло автоматически, но цель, которую я предполагаю, состоит в следующем: а) как мне получить FreeBSD/pfSense для создания адаптера TUN, который будет вести себя как Linux, позволяющий "прямые" соединения, или б) как получить 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 server.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
Сокращенный запуск config на 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