左側のSubnetのSrc/Dstになっている部分は、同じ条件で複数設定できず後者がエラーになるためです。なると当然、フェイルオーバーした時に許可していない方のトンネルを使おうとすると、通信ができなくなる、という単純な罠が待ち受けています。設定を動的に、もしくは複数設定できない、という理由からLinuxで冗長化するのは不可能だと結論が出ていて今なお変わらないようです。対応案としては、2つ見つかりました。どちらかのTunnel分しかspdaddしない(=冗長化は捨てる)どちらか片方のTunnelしか利用しないと割り切る完全にイケてねー状態です。それぞれの対応案を工夫する形で外道式を考えてみることにしました。片方しかspdaddできない問題を解決するPrivate間用のsetkeyの設定を、initスクリプトが実行しない形で用意します。中身は、設定中のTunnelを消してもう片方のTunnelを追加するだけのものです。esp/tunnel/27.0.1.144-172.30.4.11/require;そして各TunnelへのPingを監視しておいて、到達しなくなったら自動的に切り替えるという作戦です。/etc/ipsec-tools.d/20-vpc-private.standby2一見上手くいきそうだったのですが、問題が1つありました。どちらのTunnelを使うか決定しており、その組み合わせは4種類あることになります。往復が同じTunnelの場合もあるし、異なる場合もありどちらも動きます。これ、Quaggaの選択状況は把握できるのですが、VPC側の選択状況は取得できません。疎通ができているか、なので、それをVPNサーバで行うわけにもいきません。何度も切り替えたり、iptablesで遮断してTunnelDownを偽装してみると全然思い通りに動かなく、setkey切り替え作戦は失敗に終わりました。設定を2つ用意し、monit監視でTunnelダウン検知時に設定ファイルごと切り替えて再起動する、という荒技を行うことにしました。G/WracoonVPN1の場合はこの設定。VPN2はG/WとTunnelSegmentを変えるだけです。ここで注意すべきは、鍵ファイルは分けずに2件書いて共通して使う必要があるということです。deflate;}ipsec-toolsTunnel部分は共通設定となります。esp/tunnel/27.0.1.144-172.30.4.11/require;PrivateSubnet間の設定は分けておきます。これはVPN1用です。BGPのVPN1用はこうです。networkのTunnelSubnetと、neighborのTunnelAddressを変えるだけです。vtymonitそして監視用にmonitを入れます。monit監視設定はヘルスチェックスクリプトと、Tunnel切り替えスクリプトを使います。stop"monit用ヘルスチェックスクリプト現行片VPNの、VPC側のTunnelAddressにPingが飛ばない場合、エラーと判定します。1monit用Tunnel切り替えスクリプト実行すると、現行片VPNではないもう1つのVPNの設定に切り替えてrestartします。しているだけになります。起動しておけば、ひたすら片肺飛行を繰り返してくれる、なかなかグロい構成になっています。restart問題点この設定には1つ問題があります。本来すべき2Tunnelの設定をしていないせいか、切替時になかなかracoonがTunnel確立をできず、長いと1分以上かかる場合もあります。それゆえに、監視間隔時間の調整が大切になります。この切替時間は、非NAT化のために犠牲にできる長さなのか、という話になります。それについては用途の問題で、仮にSSH接続だけなら問題ない範囲と捉えますし、重要なレプリケーションなどをするならNAT型にする、というかおとなしくハードウェアにした方がよいと思います。完全切替型の構築スクリプトお世辞にも綺麗な構成とは言えませんが、それでも構築スクリプトを置いておきます。aws_vpn_between_vpcgw_and_debian_with_monit_for_non_nat.shせっかく調べたから書きましたが、いやー汚いですねコレ。microインスタンスでOpenVPNの方がマシかもしれません。相変わらず自分のネットワーク系のセンスの無さというか、撤退や妥協が下手というか、身にしみた案件でした。コメントをキャンセルメールアドレスが公開されることはありません。data-url="">外道父ドリコムで主にインフラエンジニアをやっている何でも屋。WordPress.。