41
NATインスタンス 冗長化深淵な話 AWS Casual Talks#1 2013-11-01 ひろせまさあき @hirose31 大剣使い

Redunduncy of NAT instance on AWS/VPC

Embed Size (px)

Citation preview

Page 1: Redunduncy of NAT instance on AWS/VPC

NATインスタンス冗長化の深淵な話

AWS Casual Talks#12013-11-01

ひろせまさあき@hirose31大剣使い

Page 2: Redunduncy of NAT instance on AWS/VPC

VPCにおけるNAT冗長化の話

VPC 10.0.0.0/16

Subnet 10.0.0.0/24

VPC Router

Internet GW

EC2 w/ EIP NAT w/ EIP

EC2 w/o EIP

ここ!

Page 3: Redunduncy of NAT instance on AWS/VPC

NATの冗長化といえば

Page 4: Redunduncy of NAT instance on AWS/VPC

安心のCDP/Ninja of Threeクオリティ

Page 5: Redunduncy of NAT instance on AWS/VPC

糸冬了

Page 6: Redunduncy of NAT instance on AWS/VPC

…とはいかない深淵な理由が…

Page 7: Redunduncy of NAT instance on AWS/VPC

(再掲)

VPC 10.0.0.0/16

Subnet 10.0.0.0/24

VPC Router

Internet GW

EC2 w/ EIP NAT w/ EIP

EC2 w/o EIP

Page 8: Redunduncy of NAT instance on AWS/VPC

(再掲)

VPC 10.0.0.0/16

Subnet 10.0.0.0/24

VPC Router

Internet GW

EC2 w/ EIP NAT w/ EIP

EC2 w/o EIP

Page 9: Redunduncy of NAT instance on AWS/VPC

(再掲)VPC 10.0.0.0/16

Subnet 10.0.0.0/24

VPC Router

Internet GW

EC2 w/ EIP NAT w/ EIP

EC2 w/o EIP

Page 10: Redunduncy of NAT instance on AWS/VPC

_人人人人人人_> publicサブ <> ネットのみ < ̄^Y^Y^Y^Y^Y^ ̄

Page 11: Redunduncy of NAT instance on AWS/VPC

_人人人人人人_> まさに <> 公私混同 <> パターン < ̄^Y^Y^Y^Y^Y^ ̄

@Yuryu(C)

Page 12: Redunduncy of NAT instance on AWS/VPC

第二部唯一つの

サブネットを胸に

Page 13: Redunduncy of NAT instance on AWS/VPC

どうしてpublic, private、2つのサブネットを切らなかったのか?

Page 14: Redunduncy of NAT instance on AWS/VPC

深淵な理由↓

Page 15: Redunduncy of NAT instance on AWS/VPC

深淵な理由↓

めんどくさそうだったから     /⌒  ⌒\

   /( ●)  (●)\  /::::::⌒(__人__)⌒::::: \  <で?  |    mj |ー'´      |  \  〈__ノ       /    ノ  ノ

Page 16: Redunduncy of NAT instance on AWS/VPC

NATインスタンスってただのNATしてるLinuxサーバーだしぃサブネットひとつの方がシンプルだしぃオンプレでもPublic/Privateなんかでサブネットわけてないしぃ

Page 17: Redunduncy of NAT instance on AWS/VPC

深淵な理由↓

ない!     /⌒  ⌒\   /( ●)  (●)\  /::::::⌒(__人__)⌒::::: \  <ふ〜ん  |    mj |ー'´      |  \  〈__ノ       /    ノ  ノ

Page 18: Redunduncy of NAT instance on AWS/VPC

第二部唯一つの

サブネットを胸に

Page 19: Redunduncy of NAT instance on AWS/VPC

1.構成・設定は?2.どやってフェイル オーバーすんの?3.なにを異常とみなすか?

Page 20: Redunduncy of NAT instance on AWS/VPC

構成図

NATActive

Private IP ! : 10.0.0.21Secondary IP!: 10.0.0.254

EIP ! : 54.X.X.31

NATStandby

Private IP ! : 10.0.0.22

default GW ! : 10.0.0.1 default GW ! : 10.0.0.254

Private IP ! : 10.0.0.101default GW ! : 10.0.0.254

w/oEIP

VPC Router ! : 10.0.0.1

Subnet 10.0.0.0/24

VPC 10.0.0.0/16

Page 21: Redunduncy of NAT instance on AWS/VPC

設定Source / Dest Check OFF (standby, too)Secondary Private IP: $NAT_VIP (=10.0.0.254)Elastic IP Associate with $NAT_VIP (≠Primary Private IP) Allow Reassociation

sysctl -w net.ipv4.ip_forward=1sysctl -w net.netfilter.nf_conntrack_max=262144

iptables -t nat -A POSTROUTING -s 10.0.0.0/16 -o eth0 -j SNAT --to-source $NAT_VIP

ip addr add $NAT_VIP dev eth0 label eth0:natip route add default via 10.0.0.1 dev eth0 src $NAT_VIP

AWS

Linux, sysctl

Linux, iptables

ちなみにAWS側の2nd IP設定せずにLinux側だけでIP Aliasした場合、arp解決ができなくて疎通できません

Page 22: Redunduncy of NAT instance on AWS/VPC

フェイルオーバーの流れiptables -t nat -F POSTROUTINGiptables -t nat -A POSTROUTING -s 10.0.0.0/16 -o eth0

-j SNAT --to-source $NAT_VIPip addr add $NAT_VIP/24 dev eth0 label eth0:natip route del defaultip route add default via $I_GW dev eth0 src $NAT_VIP

iptables -t nat -F POSTROUTINGip addr del $NAT_VIP/24 dev eth0 label eth0:natip route del defaultip route add default via $NAT_VIP dev eth0

新Active

aws ec2 assign-private-ip-addresses--network_interface_id $ENI_ID_of_NEW_ACTIVE--private_ip_addresses $NAT_VIP--allow-reassignment

AWS API

旧Active (if possible)

Page 23: Redunduncy of NAT instance on AWS/VPC

フェイルオーバー没案

Page 24: Redunduncy of NAT instance on AWS/VPC

1. VIP使わずに、NATが切り替わったらEIPなしインスタンスのデフォゲを必死で変えてまわる

Page 25: Redunduncy of NAT instance on AWS/VPC

_人人人人人人_> ありえ <> ない < ̄^Y^Y^Y^Y^Y^ ̄

Page 26: Redunduncy of NAT instance on AWS/VPC

2. ENIをも1こつけて、それをVIP的に移動させ

Page 27: Redunduncy of NAT instance on AWS/VPC

Secondary IP+IP Aliasでいけたしあんま調べてないけど、EIPをeth1にヒモ付けた場合、自分が外へ出ていけなかった(ような気がする)ポリシールーティングとか駆使すればいけるのかも

Page 28: Redunduncy of NAT instance on AWS/VPC

なにを異常とみなすか?

•異常とは?

•NATサーバーが生きてるかどうか、ではない

•フリーズしてSSHで入れなくてもパケット転送ができてればいい

•☛非EIPインスタンスが外部へ疎通できないのが異常である

Page 29: Redunduncy of NAT instance on AWS/VPC

なにを異常とみなすか?

• 外部の疎通対象をどうするか?

• 自由に気兼ねなくping打っていいホストがあればいいのだけど…

• 一応ある

• ping.mesh.ad.jp

JANOG28 到達性確認手段共有BoF

http://tools.bgp4.jp/index.php?janog28

• とりあえず にpingを…

Page 30: Redunduncy of NAT instance on AWS/VPC

なにを異常とみなすか?

• が落ちたら?

•間隔置いて何回かリトライする

• はわりと一時的に不通になるにょ

•それでもダメなら別のところにセカンダリーチェックする

Page 31: Redunduncy of NAT instance on AWS/VPC

なにを異常とみなすか?

•監視元の非EIPインスタンスが落ちたら?

•複数インスタンスから外部への疎通監視する

Page 32: Redunduncy of NAT instance on AWS/VPC

なにを異常とみなすか?

•誤検知したら?

•監視(非EIPインスタンス)に加えて調停役を立てて投票制(quorum)にする

•調停役がAWSのAPIを叩くなどしてF/Oする

•なので調停役はEIP付インスタンスで動かす必要がある←意外とワナい

Page 33: Redunduncy of NAT instance on AWS/VPC

なにを異常とみなすか?•監視ノードのお仕事

•調停役にステータスを送る

•起動時: JOINを送る

•定期的に: pingの結果を送る OK/NG

•終了時: LEAVEを送る

•送信データ=ステータス、自ホスト名、時刻

• 3台ぐらい立ててる

•msgpack RPCで送ってる

Page 34: Redunduncy of NAT instance on AWS/VPC

なにを異常とみなすか?• 調停役ノードのお仕事

• 監視ノードからデータが来たら

• 内部的に持ってる情報を更新

• 数秒間隔で定期的に

• 突然死した監視ノードがいないかチェック

• 最終更新時刻をみてしばらく更新されてないやつはLEAVE(投票数にはカウントしない)とみなす

• 上記でステータスがNG or LEAVEのがいたら

• ステータスが全部NG(外部疎通できるやつがいない)かつ、稼働中の監視ノード数が定足数以上なら、フェイルオーバー発動!!!

• PerlのAnyEvent::MPRPC::Serverで実装

• 今ならSerf http://www.serfdom.io/ でサクッと実現できるかもですね

Page 35: Redunduncy of NAT instance on AWS/VPC

まとめ

Page 36: Redunduncy of NAT instance on AWS/VPC

サブネット分けてCDPのように

VPC Routerの設定を変えてフェイルオーバー

Page 37: Redunduncy of NAT instance on AWS/VPC

深淵な理由でサブネット切ってない場合は…

Page 38: Redunduncy of NAT instance on AWS/VPC

今回紹介したNAT VIPの移動

Page 39: Redunduncy of NAT instance on AWS/VPC

ではなく!

Page 40: Redunduncy of NAT instance on AWS/VPC

_人人人人人人_

>全インスタンスに<

> EIPを付ける!!<

 ̄^Y^Y^Y^Y^Y^ ̄

Page 41: Redunduncy of NAT instance on AWS/VPC

ご清聴ありがとうございました