web-dev-qa-db-ja.com

OpenVPNネットワークでのQuaggaOSPFの適切な構成

まず、私のネットワークトポロジの単純なバージョンです。

                      [ 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は、静的パブリックIPでOpenVPNサーバーを実行しているUbuntuVPSです。 baseは私の家にあるpfSenseファイアウォールで、場所は一定ですがIPは可変です。各々の mr#ノードは一貫したIPアドレスまたは場所を持たないモバイルルーターであり、追加のNATファイアウォールの背後にある場合とない場合があります。リストされているCIDRネットワークは、ルーターに直接接続されているスーパーネットです。 。

ログを読み取るために、IP、ルーターID、OSを以下に示します。

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

ハブサーバーでは、クライアント間を有効にして、さまざまなクライアントに多くのroutesiroutesをプッシュしています。この設定により、(ファイアウォールルール内で)任意のノードから任意のノードに接続できます。ただし、このセットアップはスケーラブルではなく、ルートが変更されるたびにクライアントとサーバーを再起動する必要があるため、この静的構成をQuaggaOSPFに置き換える作業を行っています。

私の問題は https://serverfault.com/questions/189739/tough-routing-problem-with-linux-quagga-and-openvpn のように見えますが、受け入れられている解決策はすべてを静的にすることでしたルーティング、これは私が避けようとしていることです。

これまでのところ、Linuxルーター間で動的ルーティングが機能しています(mr2)、hub、および3つのOSPFルーターをテストするためにVPNに追加したランダムなLinuxデスクトップ。ぼくの VyOSと LEDEルーターには、この質問とは関係のない理由で問題があります。 (編集:VyOSナイトリーワークス)


今難問のために:

私の2つのpfSenseファイアウォール(1つはbaseで、もう1つは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構成の問題なのか、OS構成の問題なのか、それとも1つ以上のコンポーネントのバグなのかは正直わかりません。 Quaggaは、イーサネットリンクを使用するだけで問題なく動作するようです(たまたま、basemr1、およびmr3は現在、すべて物理的な場所を共有しているため)、これはOpenVPNを介したOSPFの使用に限定されているようです。


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 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/routers.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/routers_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

PfSenseによって生成される、baseでの実行構成の省略形:

...
!
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
computergeek125

編集2018年1月20日17:57CST: grawity が指摘したように(ありがとうございました)、tunの代わりにtapデバイスを使用するだけですべてが修正されます。早く考えるべきだった。

そうは言っても、私はまだそれが可能かどうかを確認するためにtunを使用した解決策を探しています。イーサネットヘッダーからの最大20奇数バイトが実際にDSLリンクにとって重要であるかどうかはわかりません。確かに、すべてのMULTI: Learn:エントリは、IPアドレスではなく仮想MACアドレスになりました。


対照的に、FreeBSDは生のポイントツーポイントインターフェースを公開し、クライアントからクライアントを処理するためのルートをインストールします(クリーンなFreeBSD 11.1-RELEASEでテスト済み)。

さらに、OpenVPNサーバーの内部IPアドレスを変更しても、デフォルトのIPアドレス(範囲内で使用可能な最小のIP)がポイントツーポイントインターフェイスに割り当てられます。

したがって、これを修正するには、すべてをポイントツーマルチポイントシステムとして再実装する必要があります(新しいことを学ぶことはできません)。この回答が得られたら更新します。

0
computergeek125