ほーりーさんの日記

技術系なぶろぐ

Fortigate で OSPF over IPsec

こんなネットワークを運用したい!

まぁ、天体撮影をするときのステラショットを動かすパソコンで使う話なんですけどね。

望遠鏡につながるパソコン、つまりステラショットを動かすマシンです。ステラショットさえ動けば良いという考え方もあるんですが、そうはいきません。

ステラショットをリモートで使いたいので、RDPします。RDPするためのIPアドレス管理どうする?んなもん、AD任せでしょ!

撮影後のデータは?とーぜんファイルサーバに置かないといけません。

つまり、普段のサーバサービスを受けられる環境にしないといけないのです。

  • 自宅ベランダで使うときは、家庭内LANにつなげばいい
  • 遠征時はモバイルルータ経由で家庭内LANにつなぎたい

これで出てくるのがサテライトネットワークです。

 サテライトネットワーク用のサテライトRouterは、家庭内LANにつないだらLocal Routerとして、モバイルルータにつなげばVPN Routerとして動作するわけです。

 

なお、この設定、すんごーく長くて面倒です。OSPF over IPsecをやりたいという方は覚悟して挑んでください。

Local Routerの設定

Local Routerとしての設定です。なお、サテライトRouterには、FortiWiFiを使ってます。無線が使えた方が便利ですからね。

なお、OSPFしゃべたり、DHCPでアドレスもらったりしますが、そんなのは家庭内LANで動いてて当たり前でしょうから、ここでは省略

インターフェースの設定

config system interface
    edit "wan1"
        set mode dhcp
        set allowaccess ping fgfm auto-ipsec
        set defaultgw enable
    next
    edit "internal"
        set ip 10.B.6.1 255.255.255.0
    next
    edit "wifi"

        set ip 10.B.7.1 255.255.255.0
    next
    edit "lo0"
        set ip 10.A.A.102 255.255.255.255
        set type loopback
    next
end

ポイントは

  • WAN1インターフェースをDHCPクライアントにすること
  • Loopbackインターフェースに有意なアドレスを振ること

Firewallポリシー

config firewall policy
    edit 1
        set srcintf "internal"
        set dstintf "wan1"
        set srcaddr "LAN"
        set dstaddr "all"
        set action accept
        set service "ALL"
    next
    edit 3
        set srcintf "wifi"
        set dstintf "wan1"
        set srcaddr "LAN"
        set dstaddr "all"
        set action accept
        set service "ALL"
    next
end

ここは特にポイントはないかと。サテライトルータの配下から通信を許可してるだけです。

OSPFの設定

config router ospf
        config area
            edit 0.0.0.0
            next
        end
        config network
            edit 1
                set prefix 10.C.C.0 255.255.255.0
            next
        end
        config redistribute "connected"
            set status enable
        end
    set router-id 10.A.A.102
end

これもごくふつーのOSPFの設定です。

Loopback インターフェースに有意なアドレスを振ったのは、OSPFのRouter IDとして使用するためですね。

はい、ここまでは準備

VPNルータとしての設定

さて、本題です。「サテライトRouter」と「VPN Router」間でIPsec VPNを結びます。

なお、IPsec VPNです。L2TP over IPsec はやりません。意味ないですからね。なんか世の中、IPsecはL2TPと組み合わせて使うもんだと思ってる人いるみたいですけど、そんなわけない。IPsecはIPsecだけで使うもんです。

インターフェースの設定

config system interface
    edit "wan2"
        set mode dhcp
        set defaultgw enable
    next
end

これはWAN2にモバイルルータをつなぐだけの話。これはサクッと流しましょう。

IPsecの設定

IPsecに関する設定です。これはPeer感で整合をとらないといけないので、サテライトRouterと、VPN Router両方の設定が必要です。

サテライトRouterの設定

config vpn ipsec phase1-interface
    edit "Satlite"
        set interface "wan2"
        set dhgrp 14
        set mode aggressive
        set proposal aes256-sha256
        set localid "Satlite"
        set remote-gw *.*.*.*
        set psksecret ***********
    next
end
config vpn ipsec phase2-interface
    edit "Satlite"
        set auto-negotiate enable
        set phase1name "Satlite"
        set dst-subnet 10.0.0.0 255.0.0.0
        set src-subnet 10.0.0.0 255.0.0.0
    next
    edit "Multicast-inbound"
        set auto-negotiate enable
        set phase1name "Satlite"
        set dst-subnet 10.0.0.0 255.0.0.0
        set src-subnet 224.0.0.0 255.0.0.0
    next
    edit "Multicast-outbound"
        set auto-negotiate enable
        set phase1name "Satlite"
        set dst-subnet 224.0.0.0 255.0.0.0
        set src-subnet 10.0.0.0 255.0.0.0
    next
end
config system interface
    edit "Satlite"
        set vdom "root"
        set ip 10.B.5.2 255.255.255.255
        set type tunnel
        set remote-ip 10.B.5.1
        set interface "wan2"
    next
end

※ SPFパラメータ等を省略してます。必要なパラメータは随時足してください。多分GUIで設定すれば入ります

さて、この設定にはいくつかポイントがあります。

  • Aggressiveモードをつかう
  • NAT Traversalを有効にする(上記Configには表れてませんが)
  • DPDを有効にする(上記Configには表れてませんが)
  • Phase-II に3個のルールを設定する
  • メイントラフィックを担うルールは 0.0.0.0/0 で設定しない
  • コマンドラインで操作するときは、トンネルインターフェースはIPsecの設定を行ったあとでしか設定できない

サテライト側をモバイルルータでつなぐんですから、当然アドレスは不定。なんで当然のようにAggressiveモード、NAT-Tを使わないといけないんですが・・・・

なぜか世の中には、ダイナミックアドレスなのに、Mainモードを使わせる製品があるんですよね。RFC読んで出直してこい。

 

VPN Routerの設定

config vpn ipsec phase1-interface
    edit "VPN"
        set type dynamic
        set keylife 1800
        set mode aggressive
        set proposal aes256-sha256
        set dpd on-idle
        set dhgrp 14
        set peerid "Satlite"
        set psksecret ***********
        set dpd-retryinterval 60
    next
end
config vpn ipsec phase2-interface
    edit "VPN"
        set phase1name "VPN"
        set src-subnet 10.0.0.0 255.0.0.0
        set dst-subnet 10.0.0.0 255.0.0.0
    next
    edit "outbound"
        set phase1name "VPN"
        set src-subnet 10.0.0.0 255.0.0.0
        set dst-subnet 224.0.0.0 255.0.0.0
    next
    edit "inbound"
        set phase1name "VPN"
        set src-subnet 224.0.0.0 255.0.0.0
        set dst-subnet 10.0.0.0 255.0.0.0
    next
end
config system interface
    edit "VPN"
        set vdom "root"
        set ip 10.B.5.1 255.255.255.255
        set type tunnel
        set remote-ip 10.B.5.2 255.255.255.255
    next
end

VPNセンタールータとしての設定ですね。

サテライト側に対応する設定です。

 

ちょっと解説

VPN関連はポイントがあるので、ちょこっと解説。

OSPF over IPsecをやりたいわけですから、当然ながらOSPFパケットをIPsecトンネル内を通します。OSPFはマルチキャストで通信するので、OSPFのマルチキャストアドレス 224.0.0.5 宛のパケットが飛び交います。

ここで注意しないといけないのが、IPsecの設定にあるアドレスセレクター。アドレスセレクタに 10.0.0.0/8 <--> 10.0.0.0/8 を設定すればわかりやすいのですが、アドレスの値としてみれば、マルチキャストアドレスは対象外になります。

ここでFortigateの仕様が関係してきます。Fortigateはアドレスセレクタから外れたパケットは遮断してしまうようです。何を当たり前のことを?と思う方もいらっしゃるでしょうが、これ、ルータの仕様によって動作が違います。アドレスセレクタから外れたパケットを投げ込んだ場合、遮断する製品、透過させる製品、通したいパケットに応じてPhase-IIネゴシエーションを開始する製品。しかも、こういう詳しい仕様はドキュメント化されてないことがほとんどです。Fortigateは遮断してしまうようです。

なので、メインのトラフィックを通すルール、マルチキャストのInbound / Outboundを各々通すルール、合わせて3個のルールが必要になります。

「じゃあ、0.0.0.0/0でルール作って、ルーティングで制御すりゃいいだろ」その通りと言いたいのですが、残念ながらそれもできません。これもFortigateの仕様ですが、FortigateのIPsecはSAが確立すると、セレクタに応じた静的経路を自動登録します。つまり、Default Routeを書き換えられてしまい、ISAKMPパケット、ESPパケットの通信経路が変わってしまいます。

Firewallポリシーの設定

config firewall policy
    edit 6
        set srcintf "wifi"
        set dstintf "Satlite"
        set srcaddr "LAN"
        set dstaddr "LAN"
        set action accept
        set service "ALL"
    next
    edit 8
        set srcintf "internal"
        set dstintf "Satlite"
        set srcaddr "LAN"
        set dstaddr "LAN"
        set action accept
        set service "ALL"
    next
    edit 9
        set srcintf "Satlite"
        set dstintf "internal"
        set srcaddr "LAN"
        set dstaddr "LAN"
        set action accept
        set service "ALL"
    next
end

サテライトRouter側のFirewallポリシー設定です。トンネル用のインターフェースを作ったんだから、新たなルールが必要です。Fortigate使ってるんだから、当たり前だろ?と思うんですが、これも注意ポイントの一つ。

このポリシーは必ず必要です。いや、そりゃそーだろって話なんですが、そうじゃなくて

IPsecの設定したら、まずはIPsecが繋がるかを試験して、それからポリシー設定しようか、って思いますよね。そうするとハマります。

これもFortigateの仕様っぽいんですが、FortigateはIPsecを設定しても、IPsecを通した通信が許可されるようFirewallが設定されてないと、ISAKMPのネゴシエーションが失敗します。その時にデバッグ画面で記録されるエラーがこれ。

ike Negotiate ISAKMP SA Error: ike 0:***************/0000000000000000:537: no SA proposal chosen

ちょっとまて、なんで no SA proposal chosen なんだよ!

そのエラーは、SAプロポーザルが食い違ってるときに出すもんだろ?!暗号アルゴリズムも、HASアルゴリズムも、DHグループも、SA寿命もいくら見直しても間違ってない。なのに、no proposal chosenと言われる。訳が分からないよ!!と叫びたい。

 OSPFの設定

最後にOSPFの設定。といっても、この記事がOSPF over IPsecをやる。って話なんで、これが本丸なんですが。

サテライトRouter

config router ospf
        config network
            edit 2
                set prefix 10.B.5.0 255.255.255.0
            next
        end
        config ospf-interface
            edit "OSPF-Satlite"
                set interface "Satlite"
                set mtu 1400
            next
        end
end

OSPFの設定を、ネットワークとインターフェース両方に対して入れないとダメみたいです。インターフェースはトンネルインターフェースがあるので、それを設定すればいいんですが、ネットワークも必要です。なので、トンネルインターフェースをNumberdで作って、そのアドレスに対してOSPFを設定する必要があります。

あと、ポイントが MTU の設定をすること。

OSPFはネゴシエーションの中でMTUを交換して、値があってないとネゴシエーションが進みません。OSFPのステータスが Exchange から進まない場合は、MTUがあってない可能性があります。

本来であれば、トンネルインターフェースのMUTを設定したいところですが、FortigateのトンネルインターフェースはMTU設定ができないようです。なので、OSPFのインターフェースでMTUを設定します。

以上!

長かった・・・・

 

0