なんだか日曜ですが、ブログ書いてます。にゃんぱすー。
BGMは、さっきまでエヴァ破でしたが、やっぱまったり系が良くて、おねがいシリーズを観ながら作業してマス。

複数のOpenSwanサーバによる、IPSecサーバの負荷分散

今回、とある案件により、大規模IPSecセンタールータを構築する案件がありました。
この事前検証の結果を公開する形となります。
備考録的なエントリとなる為、ログや確認コマンド少なめデス。(そのあたりはぐぐってください。。。)

OverView

2015-05-00



拠点ルータ(今回はYAMAHA RTX810)は、ipsecの対向アドレスにFQDNを使う事が可能です。
今回、その特性を利用し、Route53でDNSラウンドロビンを構成し、複数台のIPSecサーバへ負荷を分散する実装です。
また、IPSecサーバでSNATを構成する事により、戻りルート(RouteTable)の問題を解決し、同時にSrc/Dst Checkの無効化を不要にします。

技術的なキモ

2015-05-01

IPSec相互接続を構成した上で、上記のような設定を行います。
これにより、どのVPNサーバに繋がってもPhase1を構成する事が可能です。また、この設定と同等の設定が出来れば、他社ルータでも実装が可能かもしれません。

構築ドキュメント

事前に、Aレコードの設定は終わっているものとします。
以下、AmazonLinux(HVM) 64bitインストール直後と仮定します。環境により適宜読み替えてください。

% sudo yum install --enablerepo=epel openswan -y

% sudo iptables -t nat -A POSTROUTING -d 172.16.0.0/16 -o eth0 -j MASQUERADE
% sudo service iptables save
% sudo service iptables restart
% sudo chkconfig iptables on

% sudo sed -i "s/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g" /etc/sysctl.conf
% cat << _EOF_ | sudo tee -a /etc/sysctl.conf > /dev/null

# Configure for OpenSwan.
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
_EOF_

% sudo sysctl -p

% echo "FORWARD_IPV4=yes" | tee -a /etc/sysconfig/network > /dev/null
% service network restart

% sudo cp -prv /etc/ipsec.conf /etc/ipsec.conf.orig
% sudo cp -prv /etc/ipsec.secrets /etc/ipsec.secrets.orig

% sudo sed -i "s/virtual_private=/virtual_private=%v4:10.0.0.0\/8,%v4:172.16.0.0\/12,%v4:192.168.0.0\/16,%v4:\!172.16.1.0\/24/g" /etc/ipsec.conf
※172.16.1.0/24 - VPNサーバの存在するSubnet
% sudo sed -i "s/nat_traversal=.*/nat_traversal=no/g" /etc/ipsec.conf
% sudo sed -i "s/^#include/include/g" /etc/ipsec.conf

% echo ': PSK "himitsu"' | sudo tee /etc/ipsec.d/ipsec.secrets > /dev/null
※ ルータに設定する事前共有鍵

% cat << _EOF_ | sudo tee /etc/ipsec.d/00_config.conf
config setup
    plutoopts="--perpeerlog"
_EOF_

% cat << _EOF_ | sudo tee /etc/ipsec.d/site_example.conf.example > /dev/null
conn site-_SITENAME_
  type=tunnel
  authby=secret
  auto=add

  ### Phase1
  pfs=no
  aggrmode=no
  keyexchange=ike
  ike=aes128-sha1;modp1024
  dpddelay = 5
  dpdtimeout = 20
  dpdaction = restart

  left=_PIPADDR_
  leftid=_PIPADDR_
  leftsubnet=172.16.0.0/16
  leftnexthop=%defaultroute

  right=_REMOTE_GLOBAL_IP_
  rightid=_REMOTE_LOCAL_IP_
  rightsubnet=_REMOTE_LOCAL_SUBNET_
  rightnexthop=%defaultroute

  ### Phase2
  phase2=esp
  compress=no
  phase2alg=aes128-sha1;modp1024
_EOF_

sudo chkconfig ipsec on

sudo shutdown -r now
ここまで設定する事で、一通りの設定は終わりです。
その他VPCの設定として、インスタンスへ以下のSecurityGroupを設定します。
o 500/udp(isakmp) - 0.0.0.0/0
o CustomProtocol 50(ESP) - 0.0.0.0/0

拠点の追加

以下のコマンドを実行します。

PIPADDR=`curl -s 169.254.169.254/latest/meta-data/local-ipv4`
SITENAME="mikalab"
RGIPADDR="xx.xx.xx.xx"
RPIPADDR="192.168.0.1"
RSUBNET="192.168.0.0/24"

RSUBNET=echo ${RSUBNET} | sed -e "s/\//\\\\\\//g"
sudo cp -prv /etc/ipsec.d/site_example.conf.example /etc/ipsec.d/site-${SITENAME}.conf

sudo sed -i "s/_PIPADDR_/$PIPADDR/g" /etc/ipsec.d/site-${SITENAME}.conf
sudo sed -i "s/site-_SITENAME_/${SITENAME}/g" /etc/ipsec.d/site-${SITENAME}.conf
sudo sed -i "s/_REMOTE_GLOBAL_IP_/${RGIPADDR}/g" /etc/ipsec.d/site-${SITENAME}.conf
sudo sed -i "s/_REMOTE_LOCAL_IP_/${RPIPADDR}/g" /etc/ipsec.d/site-${SITENAME}.conf
sudo sed -i "s/_REMOTE_LOCAL_SUBNET_/${RSUBNET}/g" /etc/ipsec.d/site-${SITENAME}.conf

RTXの設定

上記のConfigに対応する設定は、以下の通りです。
GlobalIPAddressはipcpで取得する事を前提に、ipsec部分のみ抜き出します。

tunnel select 1
 ipsec tunnel 1
  ipsec sa policy 1 1 esp aes-cbc sha-hmac
  ipsec ike duration ipsec-sa 1 28800 100000
  ipsec ike duration isakmp-sa 1 28800 100000
  ipsec ike encryption 1 aes-cbc
  ipsec ike esp-encapsulation 1 off
  ipsec ike group 1 modp1024
  ipsec ike hash 1 sha
  ipsec ike keepalive log 1 off
  ipsec ike keepalive use 1 on dpd 5 4
  ipsec ike local address 1 192.168.0.1
  ipsec ike local id 1 192.168.0.0/24
  ipsec ike log 1 key-info message-info
  ipsec ike pre-shared-key 1 text himitsu
  ipsec ike remote address 1 vpn.mikalab.example
  ipsec ike remote id 1 172.16.0.0/16
  ipsec auto refresh 1 on
 ip tunnel tcp mss limit auto
 tunnel enable 1
厳密にはAES128ではなくAES256の方が良い気もするのですが、取り急ぎ相互接続性を優先しました。

実際の挙動

DPDによりSAのダウンが検出されたか、鍵の寿命が尽きた時、SAが再確立されます。
この際、RTXはPhase1の鍵交換を行う直前に名前解決を行い、DNSラウンドロビンによりVPNサーバの1台が選定されます。
鍵の寿命が尽きる場合、少し前から並行して鍵交換を行いますので、ダウンタイムはほぼ0です。しかし、スティッキーが存在する訳ではないので、高確率で別のVPNサーバへ接続されます。
また、DPDによりSAのダウンが検出された場合(OpenSwanが動作を停止した場合など)、DPDのタイムアウトを待って、同じく鍵の交換を再度試みます。

参照サイト

CentOS6から複数IPアドレス設定の方法か変わったらしい、件 - 戦力外プログラマの日記
http://apoup.blogspot.jp/2013/10/centos6ip.html

Openswan Site-to-site VPN — cannot respond to IPsec SA request because no connection is known
http://networkengineering.stackexchange.com/questions/7278/openswan-site-to-site-vpn-cannot-respond-to-ipsec-sa-request-because-no-conne

ファイアーウォールに保護された L2TP-VPN サーバーに CentOS 6.0 から接続する - Easy Network.
http://network.station.ez-net.jp/client/remote/vpn/l2tp-linux-fw.asp

[Openswan Users] Tunnel failing to come up
https://lists.openswan.org/pipermail/users/2015-January/023245.html

Can't get past "pending Phase 2" on OpenSWAN <-> ISA Server IPSec VPN
http://serverfault.com/questions/473576/cant-get-past-pending-phase-2-on-openswan-isa-server-ipsec-vpn

[Openswan Users] Tunnel failing to come up
https://lists.openswan.org/pipermail/users/2015-January/023237.html

ipsec.conf(5) - Linux man page
http://linux.die.net/man/5/ipsec.conf

Linuxマシンをルータにする方法
http://redhatlinux.kt.fc2.com/cont/router.htm

OpenswanでVPN接続してIPSec通信をやってみた。 - Developers.IO
http://dev.classmethod.jp/server-side/network/openswanvpn/

YAMAHA業務向けルーター運用構築スレッドPart2
http://engawa.2ch.net/test/read.cgi/network/1358345652/

RTX と Linux を IPsec で接続 (Openswan) - COMPNET
http://www.compnet.jp/archives/3849

VPN Fortinet 60B vs Openswan - FORTIGATE.es
http://www.fortigate.es/viewtopic.php?f=5&t=976

Openswan ipsec transport tunnel not going up - serverfault.com
http://serverfault.com/questions/435607/openswan-ipsec-transport-tunnel-not-going-up

YAMAHA RTX1100 と OpenSwan で IPSec VPN 接続 - SS-NET
http://www.shakke.com/network/vpn/yamaha-rtx1100-%E3%81%A8-openswan-%E3%81%A7-ipsec-vpn-%E6%8E%A5%E7%B6%9A/

Configuring OpenSwan IPSec Server - miscellaneous
http://blog.jameskyle.org/2012/07/configuring-openswan-ipsec-server/


IPsec 設定ガイド
http://www.rtpro.yamaha.co.jp/RT/docs/ipsec/guide.html

YAMAHA RTシリーズのFAQ / 障害切り分け手順
http://www.rtpro.yamaha.co.jp/RT/docs/Trouble/

L2TP/IPsec
http://www.rtpro.yamaha.co.jp/RT/docs/l2tp_ipsec/index.html

L2TPv3を用いたL2VPN
http://www.rtpro.yamaha.co.jp/RT/docs/l2tpv3/#setting1

Openswanの"ipsec.conf"の"auto"
http://blog.suz-lab.com/2010/06/openswanipsecconfauto.html

RFC 2409 IKE
https://www.ietf.org/rfc/rfc2409.txt

Setting up OpenSWAN for Site-to-Site VPN - Ubuntu 12.04 and Cisco ASA 5520
http://www.knaddison.com/technology/setting-openswan-site-site-vpn-ubuntu-12-04-and-cisco-asa-5520

IPsec 相互接続の手引き
http://www.rtpro.yamaha.co.jp/RT/docs/ipsec/interop.html

Linuxでopenswanとxl2tpd使ってL2TP/IPSec VPNする方法 - Qiita
http://qiita.com/nyarla/items/490e10a5eaa6f0216909

RTシリーズとCISCOルータの相互接続のための設定例集
http://www.rtpro.yamaha.co.jp/RT/docs/example/cisco-rev6/ipsec-aggr.html

[Openswan Users] leftid and rightid ignored? using wrong conn
https://lists.openswan.org/pipermail/users/2010-February/018281.html IPsec コマンドリファレンスhttp://www.rtpro.yamaha.co.jp/RT/docs/ipsec/command.html

Configuring OpenSwan IPSec Server
http://blog.jameskyle.org/2012/07/configuring-openswan-ipsec-server/

おわりに

いつか木崎湖行きたいんですよね。温泉も良さげだけど、キャンプ場で一日読書とかやりたいデス。。。