2つのLinuxボックスを構成して、通信が必要なときにトランスポートレベルのIPSec接続を自動的に使用するようにしました。構成は、X509認証とbundle_complex
オプションがon
に設定されたRacoon、および2つのボックス間にESPとAHの両方を必要とするポリシーに基づいています。
構成が機能している間、一般的に言えば、最初のいくつかのパケットは常に失われます。例:
$ ping -c 3 A.B.C.D
PING A.B.C.D (A.B.C.D) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
64 bytes from A.B.C.D: icmp_req=3 ttl=64 time=0.497 ms
たとえば、IPSecトランスポートがネゴシエートされるまでパケットを「遅延」させることによって、これを防ぐ方法はありますか?
最初のパケット(およびネゴシエーションが完了するまでの他のすべてのパケット)は常に破棄されます。
これは、私が扱ったすべてのISAKMP実装に当てはまります。破棄されているパケットをバッファリングできなかった理由が必ずしもあるとは思いません。むしろ、それはすべきではありません。
これは、インターネットのルーティングインフラストラクチャ全体で使用される意識的な設計決定の拡張です:パケットを保持しない。
インターネット上のルーティングシステムは、パケットを(ほぼ)すぐにルーティングできない場合、遅延するのではなく、常にパケットを破棄します。インターネット全体でのパケット損失は、パケットを余裕ができるまでバッファリングしておくだけで、はるかに低いレベルに簡単に減らすことができます。しかし、そこに問題があります。先入れ先出しキューで200ミリ秒遅れて実行されている過負荷のルーターは、すべてのパケットをその200ミリ秒遅延させます。
これをISAKMPの状況に戻します。パスがそれらを伝送する準備ができるまで2、3のpingを保持することは素晴らしいことですが、それが数十万のUDPパケットの一定のストリームである場合はどうでしょうか。また、リモートシステムにアクセスできない場合、ISAKMPはそこに座って、ISAKMPネゴシエーションメッセージ2を60秒間待機します。
これらは克服できないエンジニアリングの問題ではありませんが、インターネットエンジニアリングコミュニティの一般通念は、主にTCPなどの損失耐性のあるプロトコルを使用することで、クライアントシステムにパケット損失の問題を処理させる方がはるかに簡単で簡単であるというものです。
トラフィックが流れ始める前にIPSECトンネルを自動開始できます(通常、最初にドロップされたパケットがIKEネゴシエーションを開始します)。これをStrongSwanで行う方法は次のとおりです。
auto = ignore | add | route | start
what operation, if any, should be done automatically at IPsec
startup; currently-accepted values are add, route, start and
ignore (the default). add loads a connection without starting
it. route loads a connection and installs kernel traps. If
traffic is detected between leftsubnet and rightsubnet , a con‐
nection is established. start loads a connection and brings it
up immediatly. ignore ignores the connection. This is equal to
delete a connection from the config file. Relevant only
locally, other end need not agree on it (but in general, for an
intended-to-be-permanent connection, both ends should use
auto=start to ensure that any reboot causes immediate renegotia‐
tion).
私はまだアライグマで同じことをする方法を理解していませんが、私は同様の何かがあるはずだと思います。