VyOS Users Meeting Japan #2で話をしてきました

VyOSをビルドしたという自分のふとしたツイートから @higebu さんと知り合い、軽いノリで次回のユーザ会をやるときは話すとうっかり言ってしまったので約束を守るために話をしてきました。
ちなみに髭生やしてると思い込んでいたので、ご本人をみたときは軽くショックを受けました。

当日はおまけ資料の動画ファイルを職場のPCに忘れて午前中取りにいった割には使い物にならなかったり、ついでに新宿でエージェント業を遂行していたら、どこにいても聞こえるくらいでかいドラム鳴らしてる迷惑集団がいたりしてナヨナヨでした。
彼ら最終的には公園に落ち着いたようですが、休日を公園で過ごしてる人たちにはさぞ迷惑だったでしょうね。

そんなテンションで話しをさせていただいたVyOSユーザ会ですが、開催を知らされてから当日まで一週間もなく、内容も英語とのことで薄いスライドの内容の割にはかなり時間をくってしまいました。
(前日にレビューしてくれた秋津メンのみんなありがとうございました)

さてせっかくなので、自分がVyOSに限らず各種ソフトウェアルータや、SDNについて抱いている感想をカス零細弱小広告配信会社的な観点で軽くまとめます。

Vyattaを使い始めたきっかけは、入社して二日目に崩壊した箱出しで使っていたCentOS5のiptablesです。
初日で環境も揃い、二日目になりがんばるぞいってなったところで向かいの席から悲鳴があがり、そこからすべてが始まりました。

私物のRTX1200を試しに投入してみたところ見事に瞬殺w、今まで経験のない現象だけどRTXよりまだましなiptablesでがんばったほうがいいとなり、ならLinuxのチューニングが丸ごと使えるしNW機器として使える細かい手設定が不要なVyattaを選びました。
あとはひたすらパケットドロップ&破棄→チューニングで対処を繰り返して現在にいたるという感じです。

さて自社では大活躍しているVyOSをはじめとするソフトルータ(各種SDNも)ですが、自分の環境だとイマイチ使いどころが分からないとか使ってみたいけどーみたいな発言を見かけます。
まずは使ってみることをお勧めします。
なんとなく使ってるうちに自然とここで使えるなとか発想が出てくるはずです。

以下のような安価で低消費電力の2Port NICのマザーにVyOSを入れて家のルータとして使うのはどうでしょうか。
家庭用ルータをぶっちぎる性能と機能に足して、RTXより低価格で同等かそれ以上の性能を発揮するでしょう。

GA-J1900N-D3V

今後はIntelのDPDK等、高価なネットワーク機器の変わりに、安価なサーバやOpenFlowスイッチとコントローラを利用したパケットプロセッシングが主流になっていくとおもっています。
今のうちに自分自身の既成概念をぶち壊しておきましょう。

たとえば今ですが、数千万の小銭しか出資してないくせにあーだこーだ口出しして足引っ張ってくるVCのクラウドおじさん達がBGPルータを買ってくれないので、Lagopus(DPDK)とRouteFlowとか、最新カーネルでBulk dequeueのパッチが当たったので実はVyOSのquaggaで安価になんとかなるんじゃないかなと目論んでいます。(やるかは別として)

なおスライドでちょっと紹介した自作サーバについては、今年の初めに自作サーバ同窓会で詳細を発表しています。
スライドはこのへん動画はこのへんにひっそりと公開されていますので、興味のある方は悪の道に染まってみてください。

次回もなにかネタをこしらえて話をさせていただけたらとおもいます。
参加された皆様お疲れ様でした!

安価(?)でプチキャリアグレードNATルータを作ってみた

寒い日が続きますが、皆さん体調など崩していないでしょうか?
自分はサバゲで叫びすぎて喉を痛めてその後いっきに冷え込んだため、そのまま喉をやられてしまいました。
内部ネットワークを10Gでリプレースというでかい作業に着手した直後に同僚が不摂生という不可抗力で倒れ、一人で糞暑い中連日DCに通って朝から晩まで作業して、やっとこさ落ち着いたらこのざまです。

さて、自社でも大変重宝しているCore i7 870のVyattaですが、そのトラフィックもとうとうピーク時で大量のショートパケットをさばきつつ out/400Mbps inout/280Kpps 前後をNATで処理するようなところまできてしまいました。
今となっては貧弱なハードウェアでここまでできてしまったのは、正直想定外です。
CPUはチューニングのためにハイパースレッドをオフにして、各コア綺麗に分散している状態でピーク時で45%くらいなのでそろそろキャパシティに不安がでてきました。

natter1 natter3 natter2

そこで内部ネットワークの10G化にあわせて、新しいNATルータを設置することにしました。
自分の中での要件は以下のとおりでした。

・通常だと一個しか置けないデフォゲーNATルータを複数置いてスケールさせたい
・安定性と冗長性は絶対ゆずらない
・アクティブスタンバイ構成をやめてアクティブアクティブにして効率化したい
・Vyattaの負荷を考慮してデフォゲーと内部ルーティング用を分離して、全サーバにスタティックルートを書いている運用を捨てたい
・フェイルオーバーは2,3秒くらいでしてほしい

という夢の様な要件から、以下の方法を導き出しました。

・NAT/IP Masquaredeは従来通りVyattaでがんばる、ここはCPUパワーでコスパを出すしかない
・デフォゲーは信頼性向上と直近でセグメント間の通信をワイヤレートでする必要があるため、思い切ってディストリビューションスイッチとしてL3スイッチを導入する
・デフォゲーを受けたL3スイッチからは、OSPFのECMPでNATルータの負荷分散をする、冗長性はルーティングプロトコルで担保する

このように、L3スイッチが得意とする超高速ルーティングと、CPUバウンドでなんとかなるIP Masuquaredeの処理をVyOSでするという分担構造になりました。

説明用に軽く図をかいてみました。

natter4

これならば高信頼かつワイヤレートでVLAN間が通信できるし、NATルータはL3スイッチのECMP上限数まで増やせるし、内部と外部用でゲートウェイわけなくてもいいし、一石億鳥やー!ってことでプロジェクトは動き始めました。

L3スイッチとVyattaでのOSPF ECMP NAT串刺しルーティング構成の検証はVirtual Box上で、Arista NetworksのvEOSを対向として行いました。
vEOSは多少の機能制限があるものの、ほぼ完璧にL3スイッチの動作をするのでこちらで検証を行いました。

もちろん外部と正常に通信できるのは当たり前ですが、ルーティング的に問題ないことはわかっていたので、ECMPの分散に偏りがでないかを重点的に調べました。
一昔前のL3スイッチではECMPの負荷分散がIPを元にハッシュ化していたため、しばしば偏りECMPの意味がないといった状況が多発していたようです(?)
現在ではパケット単位が標準のようです。

ディストリビューションスイッチはアライドテレシスのx8100を導入しました。
要件に対して事前の検証やアドバイス、導入支援まで迅速に数多くしていただきました。

今回はこの程度の概要しか気合が足りなくて書きませんが、リクエストがあればもうちょっと深く掘り下げて書いて見ようと思います。

このドサクサにまぎれてVyattaからVyOSに移行しました。
詳細は過去のエントリーにあります。

あとサーバルームの連続稼働は一日6時間くらいまでが健全だと思いました。

VyOSのigbを最新にしてみた

ネットワークのリプレースにあたりVyattaのリポジトリが長時間が落ちっぱなしだったり、コミュニティもgdgdなようなので、思い切ってVyOSに乗り換えることにしました。

以前からのVyattaの使い方の通り、カーネルを最新にするために非公式版なんぞないと思い込み、build-isoから作る作業をしていました。
ついでなのでigbも最新版を入れようと思い、とりあえずビルドをしてみましたが…。

vyos1

それさぁ、早くいってよぉ〜

しかしこれだけではlinux-headers相当のパッケージを含まないため、igbのコンパイルをすることができませんでした。
四苦八苦していろいろ模索した結果公式に、linux-vyatta-kbuild_*.deb という kernel-headers 相当のパッケージを見つけました。

http://dev.packages.vyos.net/vyos/pool/main/l/linux-3.13/

しかしこれだけではigbのmakeに必要がなものが揃っていないので、以下にまとめて手順を記載します。

# Debianのsqueezeリポジトリを追加
configure

set system package repository squeeze components main
set system package repository squeeze distribution squeeze
set system package repository squeeze password ""
set system package repository squeeze username ""
set system package repository squeeze url http://http.us.debian.org/debian

commit
save

exit

# makeに必要なパッケージをインストール
sudo apt-get update
sudo apt-get install make gcc build-essential

# カーネルヘッダをインストール
sudo wget http://dev.packages.vyos.net/vyos/pool/main/l/linux-3.13/linux-vyatta-kbuild_3.13.11-1+vyos1+helium5_amd64.deb
sudo dpkg -i linux-vyatta-kbuild_3.13.11-1+vyos1+helium5_amd64.deb

cd /usr/src

sudo ln -s /usr/src/linux-image/debian/build/build-amd64-none-amd64-vyos linux

# igbのインストール
sudo wget http://downloads.sourceforge.net/project/e1000/igb%20stable/5.2.9.4/igb-5.2.9.4.tar.gz
sudo tar -zxvf igb-5.2.9.4.tar.gz
cd igb-5.2.9.4/src/
sudo make
sudo make install

以上で最新カーネル、最新ドライバの最強のVyOSが出来上がりです。

社内勉強会のスライドを公開します

conntrack tableのステータスを利用した通信状況の監視についてまとめました。

conntrack tableをなめる→数える→アラートとグラフにするといった利用方法です。
L4監視なのでかなり確実ですが、問題はnetfilterで大量のトラフィックをさばいてる現場がそう多くないので導入しにくいところでしょうか。

負荷が気になるようなら、conntrackdで同期した別のマシンで処理するというのもありだと思います。

vyatta site to site vpnのルーティングのハマりどころ

vyattaはNATが設定してある場合、スタティックルートが設定してあっても、NATに吸い込まれてVPN側にうまくルーティングしてくれません。
そうゆう場合はNATに除外ルールを設定します。

ローカル: 192.168.10.0/24
リモート: 192.168.12.0/24

source {
    rule 1 {
        destination {
            address !192.168.12.0/24 
        }
        outbound-interface eth1
        source {
            address 192.168.10.0/24
        }
        translation {
            address masquerade
        }
    }
 }

このように、リモートのサブネット192.168.12.0/24宛の場合はNATから除外します。

ポートフォワードをしている場合は、リモートから入ってくる場合も除外しないと吸い込まれてしまいます。

destination {
    rule 101 {
        destination {
        port 22
    }
    inbound-interface eth1
    protocol tcp
    source {
        address !192.168.12.0/24
    }
    translation {
        address 192.168.10.2
        port 22
    }
 }

NATとルーティングの処理が串刺しになっているというのも、なんだか妙な感じがしますがvyattaはこうです。