IX2015のIPSec再設定スクリプト

#!/usr/local/bin/ruby

# check per min

require 'rubygems'
require 'open-uri'
require 'oauth'
require 'net/telnet'

# ip setting
src_site = "AAAA"
dst_site  = "BBBB"
dst_host = "example.com"
router_ip = "10.3.1.1"
tftp_server_ip = "10.3.2.15"
basedir = "/usr/local/adm/globalip/"
id_rsa = "/usr/local/adm/.ssh/globalip_BBBB"
#---
src_file = basedir + "ipaddress.txt"
dst_new_file = basedir + dst_site + "_ipaddress.txt"
dst_old_file = basedir + dst_site + "_ipaddress_old.txt"
send_to = "hogehogehoge@" + dst_host + ":" + basedir + src_site + "_ipaddress.txt"

# get time of day
day_msg = "*** CHANGE *** [" + Time.now.strftime( "%Y/%m/%d-%H:%M" ) + "] " + src_site + ": "

# get hostname
hostname = open( "| hostname" ).gets

# get current ip address from ix2015 by snmp
new_ipaddr = open( "| /usr/local/bin/snmpwalk -v 1 -c public " + router_ip + " ipAdEntAddr | grep -v \" 10.\" | cut -d \" \" -f 4" ).gets

# get old ip address from local file
old_ipaddr = open( src_file ).gets

  fork { exec( "scp -i " + id_rsa + " " + src_file + " " + send_to ) }
# update ddns
if ( new_ipaddr != old_ipaddr ) then
  ############################################################
  ### twit
  CONSUMER_KEY = 'XXXXXXXXXXX'
  CONSUMER_SECRET = 'XXXXXXXXXXXX'
  ACCESS_TOKEN = 'XXXXXXXXXXXXX'
  ACCESS_TOKEN_SECRET = 'XXXXXXXXXXX'

  consumer = OAuth::Consumer.new(
    CONSUMER_KEY,
    CONSUMER_SECRET,
    :site => 'http://twitter.com'
  )
  access_token = OAuth::AccessToken.new(
    consumer,
    ACCESS_TOKEN,
    ACCESS_TOKEN_SECRET
  )
  response = access_token.post(
    'http://twitter.com/statuses/update.json',
    'status'=> "@yogata " + day_msg + new_ipaddr + " by " + hostname
  )

  ############################################################
  ### log
  fp = File.open( src_file, "w" )
  fp.write( new_ipaddr )
  fp.close

  # update ipaddress file to fukuoka
  fork { exec( "scp -P 20022 -i " + id_rsa + " " + src_file + " " + send_to ) }
end

# check dst update
new_ip = open( dst_new_file ).gets.chomp
old_ip = open( dst_old_file ).gets.chomp
if ( new_ip != old_ip ) then
  # connect server
  telnet = Net::Telnet.new("Host" => router_ip )
  
  # get router name
  String routername = ""
  telnet.cmd("svintr-config").each {|c|
    if ( c.index("#") != nil && c.index("(config") == nil) then
        routername = c.sub(/^(.*)#.*/,'\1').chomp
    end
  }
  if routername == "" then
    p "can't get router name"
    return
  end
  
  # reset ipsec & upload config
  telnet.cmd("term len 0")
  telnet.cmd("show run").each {|c|
    if /ike policy ike_policy_#{dst_site} peer/ =~ c then
      telnet.cmd("no " + c)
    elsif /ipsec autokey-map ipsec_map_#{dst_site} #{src_site}_to_#{dst_site} peer/ =~ c then
      telnet.cmd("no " + c)
    end
  }
  telnet.cmd("ike policy ike_policy_#{dst_site} peer " + new_ip + " key hoge ike_proposal")
  telnet.cmd("ipsec autokey-map ipsec_map_#{dst_site} #{src_site}_to_#{dst_site} peer " + new_ip + " ipsec_proposal")
  telnet.cmd("write memory")
#  sleep 60
  telnet.cmd("tftp put startup-config " + tftp_server_ip + ":" + routername + "_" + Time.now.strftime("%Y%m%d_%H%M_config.log"))
  telnet.cmd("exit")

  # update old file
  fork { exec( "cp -f " + dst_new_file + " " + dst_old_file ) }
end

カーネル/VM勉強会@関西 其の参

カーネル/VM勉強会@関西 其の参に行ってきたのでメモ.
http://atnd.org/events/25291
どの発表も面白かった,ローカルアレンジメント・発表者の方々,ありがとうございました.

マルウェアの自動解析と自動検出 / @mayahu32さん

ヒューリスティックマルウェア検出方法について.
呼び出し関数のログをとってN-gramマルウェアか判別,なるほど!
呼び出し関数のログを取るためにあれこれフックする話.
コードを無害化するためにファイルアクセス,ネットワークアクセスを無効化するって話で,それだとマルウェア止まっちゃうじゃん!と思ったけれど,マルウェアかどうかを判別できればよいので止まっても構わないとのこと.確かにその通りだ.

Multi Thread Tiny BASIC / @takeokaさん

自作BASICについて.
マルチスレッドすごい!
fork(行番号)なところは直感的

Hello, World / @naota344さん

Python+Qtで書かれたプログラムがzshから呼び出されてGUIで描画されるまで.
詳細「Hello, World」ってTweetはまさにその通り.

libdcompile / @fadis_さん

fadisさんが作ったlibdcompileについて.
evalしたいのでライブラリなコンパイラが必要,LLVM+clangで.
中間コードをホストコードからコンパイル&マージ(JIT)して実行.ホストコードの情報は全部見える.
こんなことが出来るなんて.

Linuxカーネル3.3でNVIDIAプロプライエタリドライバを使う / @cosmo__さん

Linuxカーネル3.3で使えなくなったNVIDIAドライバを使うようにする話.
カーネルヘッダの位置をハードコーディングしていたせいで,コンフィグチェックのシェルスクリプトでコケる
解決策1:昔の位置にシンボリックリンク or 解決策2:新しい位置を見るように中身を変更
今回は解決策1で解決,でも295.33で解決策2にて対応済み

soundcoreモジュールとLinuxサウンドシステム / @takaswieさん

Linuxサウンドシステムについて,ALSAとかとか.
soundcoreは1つのサウンドカードに複数のデバイスがあるとNGであったり,5.1chがNGであったり,色々な制約がある
ALSAはsoundcoreの制約への対策
なんとなくALSA使っとけみたいな感じで特に調べたことなかったので,勉強になった.

公開ミラーサーバの運用 / @yoppy3さん

NAISTのミラーサーバについて.
奈良先端科学技術大学院大学の「先端」は,奈良の先っちょって意味らしい :-)
ミラーサーバ向けなCPU(浮動小数点演算よりもメモリ帯域幅)とかZFS(L2ARCをSSDへ,でもこれはミラーサーバじゃなくても一般的にそうか)とかの話が参考になった.
ミラー向けMLとかって,そういうミラーサーバ特化なチューニングの話とか出てるのかな?と気になった.

Debian的なアレ / @uwabamiさん

apt-getはDebianのものです

ておくれ / @katsyoshiさん

VLSD http://sourceforge.jp/projects/vlsd/ について
ZFSぽい?
ておくれてない真面目な内容でした.

BHyVeってなんや / @syuu1228さん

BHyVeについて
仮想化のおさらいのところが勉強になった.ゲストもホストもx86なのだからエミュレートいらねーじゃん,でもゲストからのセンシティブ命令だけはマズイのでIntel VT-xで処理する,ってところ.
bhyveloadコマンドがインスタンスをデバイスとして作成して,bhyveコマンドでインスタンスを生成する.
jailとの違いとして,ゲストとホストで異なるOSを許容出来る
メモリをDDで抜いてコピーすればライブマイグレぽいことができる?差分更新が難しそう...

NEC IX2015のセカンダリIPアドレスでできないこと

セカンダリIPアドレスのセグメントに装置を置いたら,ルーティングする通信ができなかった.確認するとできないらしい.http://www.nec.co.jp/ixseries/ix2k3k/faq/ip.html#Q1-2
具体的には http://www.rtpro.yamaha.co.jp/RT/FAQ/TCPIP/secondary-address.html にある以下のような構成で,2台のコンピュータ/端末間の通信ができない.インターフェース名はix2015のものに変更済み.

   +-------------+
   |  [Fa0/0.1]  |
   +------+------+
          | 172.16.184.33 (primary)                172.16.184.32/28
          | 192.168.0.1 (secondary)                  192.168.0.0/24
    ------+----------+--------------------------+------------------
                     |                          |
                     |172.16.184.34             |192.168.0.2
           +---------+---------+      +---------+---------+
           |  コンピュータ/端末  |      |  コンピュータ/端末  |…
           +-------------------+      +-------------------+

引用元のYAMAHA RTシリーズは上記の構成を取れるらしい.

reading ”ServerSwitch: A Programmable and High Performance Platform for Data Center Networks"

NICにTCAMついたら面白くね?と思ってツイートしたら,実はあるらしい.

なので,読んでみた.

概要

プログラマビリティがあってTCAM持ってるチップがあったのでNICを作ってPCI-Eに接続した.既存のイーサネット/IP/MPLSのネクストホップ探索回路とプログラマブルTCAMを併用するため,任意のフローだけTCAMで制御できる.TCAMで処理は早いし,PCI-Eなので低遅延で広帯域だし,そもそもチップは安い.

所感

NICにTCAMを載せて高速転送させるのは面白そう,値段もお手頃.TCAMと既存イーサネット/IP/MPLS回路を併用するのが良いなぁ.プログラマビリティが欲しいところだけ設定すればよくて,それ以外は既存どおりの動かし方が可能.
ヘッダ書き換えや付与・除去の制約(というかVLAN関係がほとんどできない)のは残念だけれど,今後の実装なのかな.
TCAMは構造的に消費電力を多く使うけれど,今回のチップは容量が小さいせいか,15.4→15.7と0.3Wの増加なので思ったよりも少なかった.
転送制御のプログラマビリティを求めているOpenFlowとの比較について,OpenFlowではコントローラとスイッチ間の遅延が大きいし帯域もインターコネクトじゃないのでイケテないと云う指摘はごもっとも.


以下詳細(勝手な補足を含む)

Abst

データセンタに特化した制御をするために今まではソフトウェアで実装してたけれどこれは遅い.なので,一般的なイーサネットチップを低遅延なPCI-Eにくっつけて,かつプログラマブルにして実装する.
まずまずしたいことは,ソースルーティングとか複数のフォワーディング方法を実装すること,網内インテリジェンス(網内ルーティングでキャッシュへ誘導)を実現すること,網内輻輳をエンドノードに通知して輻輳回避をすること.

Introduction

関連研究の紹介.
今のネットワークはイーサネット/IP/TCPのフォーマットに基づいている,単一パス(OSPFとか)でありECMPとかあんまり使ってない,TCP輻輳制御に頼っている,という特徴がある.
対してデータセンタに特化したやり方では,PortLandのような仮想MACアドレスを使った巨大L2のセグメント分け(階層化とL2ルーティング)とか,BCubeのようなエンド間のマルチパス利用とか,QCNのような網内輻輳をエンドノードに通知するしくみとか,色々ある.
データセンタでは後者を実現したくて,そのためにはプログラマビリティが重要.どう実装するかというと,ソフトウェア実装だと遅いし,ハードウェア実装でFPGA使うと高い.
そこで,プログラマビリティがあって,遅延が小さくて,広帯域で,安い方法を提案する.

Design Goals

以下の3点を実現できる設計を行った.

  1. フォワーディングエンジンをプログラムできること(D-plane)
    • イーサネット(Exact Match)/IP(Exact Match or Longest Prefix Match)なマッチング以外にもできること.例えば BCube だと Strict Source Routing ぽい(たぶん)ので,そういうことができること.
  2. 新しいルーティング,シグナリング,フロー制御を実装できること(C-plane)
    • BCubeの情報をもとにルーティングに反映できること,QCNのフィードバックができること.
  3. 網側でキャッシュへ導くような,DCNサービスを実現できること
    • 他にもマルチキャストのコピーポイントをできるだけエンドノードに近くする,とか.

Design

Switching chip + NIC chipsの構成で,Switchig chipはデータ(D-plane)パケットの転送をTCAM+イーサネット/IP/MPLSの専用回路を併用して行う.NIC chipsは制御(C-plane)パケットの通信を行う.
APIを用意してTCAMの書き換え,マッチングができる.それ以外のAPIとしてはヘッダ書き換え(一部のみ)とか,カウントとかも用意している.

Implementation

価格は100個で$400ぐらいする
転送してない状態での消費電力は15.4W,フルスピードで15.7W

Discussion

1. ヘッダ書き換えに制約がある.VLAN-ID書き換えとか,VLANの付与・除去とかができない.
2. 10G対応.同じアーキテクチャで10Gx24Port対応いけるけれど,バックプレーンが足り無い.PCI-Express2.0 x32 で片方向 128Gbps である.

Related Work

OpenFlowは同じような取り組みだけれど,OpenFlowではコントローラとスイッチ間の遅延が大きいし帯域もインターコネクトじゃないのでイケテない.

IPv6でNFSする

FreeBSDだと,IPv6NFSできるらしいのでやってみた
/etc/exports は

/home	-alldirs,maproot=root	-network 2001:xxxx:xxxx:xxxx::/64

書き換えたらnfsの再起動が必要.nfsの再起動には順序性があるので,service -e でカンニング
マウントするときは

# mount -t nfs \[2001:xxxx:xxxx:xxxx::y\]:/home /mnt/

のように,IPv6アドレスを囲んだ上でエスケープが必要.アドレスとディレクトリのデリミタもコロンだから,なのかな.

10G規格XENPAK/XFP/SFP+の比較

10GbEの通信をするときにXENPAK/XFP/SFP+があるらしいので,その違いを調べてみた.

XENPAK XFP XFP+
トランシーバ(L0)
イーサネット(L1) × ×

イーサネットのPHYが載っているかの違いで XENPAK or XFP&SFP+ に分類できる.XFPとSFP+はトランシーバ部分しか定義されていないので,上位がイーサネットでもFibreChannelでもどちらでも良い.

1波10Gbpsシリアルと,4波10Gbpsパラレルの比較

10Gbpsの伝送速度を実現する方法として,1波10Gbpsシリアルと,4波10Gbpsパラレルの2種類があるので,その違いを調べてみた.

1波10Gbpsシリアル 4波10Gbpsパラレル
符号化方式 64/66B 8B/10B
1波の伝送速度 10.3125Gbps 3.125Gbps
波数 1波 4波
波長多重方式 なし CWDM/DWDM
伝送距離 数百m 数十km

4波パラレルだと8B/10B エンコードしているので長距離伝送が可能.

参考