オープンソースクラウド基盤
”Wakame-vdc” 開発苦労話
     2011/02/07(月)
       @hansode
自己紹介
■自己紹介
•吉田将士 / Masahito Yoshida

• 株式会社あくしゅ http://axsh.jp/
   • 担当: サーバインフラ系
   • 時々: プログラミング(Ruby, Perl, PHP, Bourne Shell)

•Twitter: @hansode
•Blog: http://blog.hansode.org/
   •ここ最近はOpenStackやPuppetの検証記録

•趣味: 筋トレ、ボルダリング(インドアクライミング)
  ⇒最終目標は、片手懸垂。現在、両手で25回程度。
“Wakame-vdc”における
     開発担当
『Security Groups』
ファイヤーウォール機能
今回は、
 『Security Groups』
開発実装のお話です。
■ 『Security Groups』の機能
•AWS(Amazon Web Service)の「Security Groups」相当
  •許可ベースのファイヤーウォール
     •接続元IPアドレス
     •対象項目(tcp,udp,icmp / ポート番号)


   「例: 192.0.2.10 から tcp/22 への接続を許可」

      192.0.2.10                  tcp/22
『Security Groups』を
実装するにあたり、
  使用した技術。
2つあります
1. ebtables
2. iptables
ここで、
会場のみなさんに
  質問です。
【Q.1】
ebtablesをご存じの方?
【Q.2】
iptablesをご存じの方?
■ 開発着手前のスキル情報・・・
•AWS利用経験は2年
  • Wakame-fuel開発で使用
  • Security Groupの設定経験あり
  • tcp/22とtcp/80を許可する程度の運用経験

•iptablesとebtables、名前を知っていた程度
   • 実際に運用した経験は無い・・・
ここからが
開発苦労談の
はじまりです・・・
もしも(eb|ip)tablesを
知らないエンジニアが
 『Security Groups』を
1ヶ月半で実装したなら
     2011/02/07(月)
       @hansode
この後、
基礎を分かっていれば、
 何てこと無い箇所で
 ハマり続けます!
『Security Groups』
機能実装へ向けて、
改めて機能確認。
■ 『Security Groups』の機能
•AWS(Amazon Web Service)の「Security Groups」相当
  •許可ベースのファイヤーウォール
     •接続元IPアドレス
     •対象項目(tcp,udp,icmp・ポート番号)
Amazon EC2内から見ると

1. 同一セキュリティグループ内のパケットのみ見える
2. tcpdumpやtshark等を実行しても、他グループのパ
   ケットは見えない
3. 例え自分のインスタンスであっても、他グループの
   パケットは見えてはいけない
「Security Groups」を実装すべく、
iptablesでフィルタしてみました。
■ iptables
http://www.netfilter.org/projects/iptables/
iptables is the userspace command line program used to configure
the Linux 2.4.x and 2.6.x IPv4 packet filtering ruleset. It is targeted
towards system administrators.
Since Network Address Translation is also configured from the
packet filter ruleset, iptables is used for this, too.
The iptables package also includes ip6tables. ip6tables is used for
configuring the IPv6 packet filter.


                   IPv4 packet
                filtering ruleset.
iptablesによるフィルタ後、
         tcpdumpで
パケットキャプチャしてみると、、
近隣ノードの
パケットが見えている・・!
どうやら、
見えているの正体は
 『arpパケット』だ。
どうもiptablesでは、
arpパケットの制御
 までは行えない。
別のフィルタを
探し始める。
そして、
たどり着いたのが
■ ebtables
http://ebtables.sourceforge.net/
The ebtables program is a filtering tool for a Linux-based bridging
    firewall. It enables transparent filtering of network traffic
    passing through a Linux bridge. The filtering possibilities are
    limited to link layer filtering and some basic filtering on higher
    network layers. Advanced logging, MAC DNAT/SNAT and
    brouter facilities are also included.



                       Link layer
                        filtering
iptablesの要領で、
ebtablesでフィルタリング
      してみると、、
ハマってしまいました・・・
ebtablesでハマった
      その1
DHCPと
ブロードキャスト
■DHCPとブロードキャスト


      gw
                インスタンスへのIPアドレス割り
           DH
           CP   当てにはDHCPを利用しており、
                インスタンスがDHCPサーバを探
                す為に、、
  A
■DHCPとブロードキャスト


      gw
                インスタンスへのIPアドレス割り
           DH
           CP   当てにはDHCPを利用しており、
                インスタンスがDHCPサーバを探
                す為に、ブロードキャストへパ
  A             ケットを送信する。
■DHCPとブロードキャスト


      gw
                DHCPサーバから応答があり、
           DH
           CP   IPアドレスが割り当てられる。


  A
■DHCPとブロードキャスト


      gw
                DHCPサーバとの通信だけで
           DH
           CP   なく、
                ブロードキャストとの通信を
  A             許可する必要がある。
ebtablesでハマった
      その2
グループ内インスタンスの
  所属ネットワーク
■グループ内インスタンスの場所
同一ネットワーク内

       gw




 A          B




     A・Bが同一セキュリティグループに所属し、
        同一ネットワークに存在する場合
■グループ内インスタンスの場所
同一ネットワーク内

     gw




 A        B




          AとBが通信出来れば良い
■グループ内インスタンスの場所
              ネットワークまたぎ

              gw      gw




              A           B




  A・Bが同じセキュリティグループに所属し、
    互いに別ネットワークに存在する場合
■グループ内インスタンスの場所
             ネットワークまたぎ

             gw       gw




             A        B




   AとBが通信出来れば良い・・・?
■グループ内インスタンスの場所
             ネットワークまたぎ

             gw         gw




              A         B




     相棒インスタンスにではなく、
   ゲートウェイとの通信許可設定を行う。
■グループ内インスタンスの場所
同一ネットワーク内         ネットワークまたぎ

      gw          gw       gw




 A         B       A        B




     相棒インスタンスの所属するネットワークによって、
          通信許可対象が変化する。
ebtablesでハマった
      その3
arpキャッシュ
■arpキャッシュ


      gw
               A・B間で、許可→拒否→許可。
               設定変更を繰り返すと、拒否
               しているのに通信可能状態が
               発生。
  A        B
■arpキャッシュ


        gw
                 arpキャッシュ更新タイミングよ
                 りも短い場合、拒否設定時で
                 もarp通信出来てしまう状態が
                 ある。
  A          B



                 arpキャッシュ
      arpキャッシュ
■arpキャッシュ


        gw       短時間で変更する場合は、イ
                 ンスタンス内のarpテーブルを
                 都度削除する必要がある。

                 # arp –d <IPアドレス>
  A          B



                 arpキャッシュ
      arpキャッシュ
■arpキャッシュ


        gw       ※この短時間内の変更問題
                 は、根本的解決になってない
                 ので、今後の課題。


  A          B



                 arpキャッシュ
      arpキャッシュ
色々ありましたが、
   1ヶ月半で
「Security Groups」
実装完了しました。
■最終的なパケットフロー (ver.10.11)
   ARP       ebtables
               ARP


                         iptables
                IP4       ICMP          ACCEPT


                                        DROP
                           TCP



                          UDP

   IP4
         Link Layer     Network Layer
開発を
振り返ってみると
ネットワークの
勉強になりました・・・
この苦労話が
 少しでもみなさんの
役に立てば、幸いです。
ご清聴ありがとうございました
  http://twitter.com/hansode
  http://blog.hansode.org/

Wakame-vdc 開発苦労談