share facebook facebook2 twitter menu hatena pocket slack

2015.06.29 MON

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

津村 彰

WRITTEN BY津村 彰

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

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

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

OverView

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

技術的なキモ

17_01IPSec相互接続を構成した上で、上記のような設定を行います。
これにより、どの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のタイムアウトを待って、同じく鍵の交換を再度試みます。

参照サイト

あまりにも多すぎてわかりましぇん。。。(Chromeのタブが多すぎて、、、多すぎて、、、。)

おわりに

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

元記事はこちら

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

津村 彰

津村 彰