なんだか日曜ですが、ブログ書いてます。にゃんぱすー。
BGMは、さっきまでエヴァ破でしたが、やっぱまったり系が良くて、おねがいシリーズを観ながら作業してマス。
複数のOpenSwanサーバによる、IPSecサーバの負荷分散
今回、とある案件により、大規模IPSecセンタールータを構築する案件がありました。
この事前検証の結果を公開する形となります。
備考録的なエントリとなる為、ログや確認コマンド少なめデス。(そのあたりはぐぐってください。。。)
OverView
拠点ルータ(今回はYAMAHA RTX810)は、ipsecの対向アドレスにFQDNを使う事が可能です。
今回、その特性を利用し、Route53でDNSラウンドロビンを構成し、複数台のIPSecサーバへ負荷を分散する実装です。
また、IPSecサーバでSNATを構成する事により、戻りルート(RouteTable)の問題を解決し、同時にSrc/Dst Checkの無効化を不要にします。
技術的なキモ
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/
おわりに
いつか木崎湖行きたいんですよね。温泉も良さげだけど、キャンプ場で一日読書とかやりたいデス。。。
コメントする