Big-IPでsorry serverにredirectする

poolが全滅、あるいはconnectioin limitにひっかかった場合にsorryサーバにリダイレクトさせたい場合。

connection limit入れたい場合

sorryサーバにリダイレクトしたい時に接続数制限をする場合はPoolのconnection limitを設定する。

VirtualServerでConnectionLimitを入れると、
接続数overの場合に、L4のレベルで切断される(ブラウザで見ると真っ白のまま)のでNG。

方法1

http profileのFallback Hostにリダイレクト先を設定する。
Fallback on Error Codes はwebサーバからの応答で特定のエラーコードが返ってきた場合にもsorryサーバにリダイレクトさせたい場合に設定。
リダイレクト先は1種類で固定

方法2

(実は今までずっとこっちでやっていた)
iruleでpoolのactive memberの数を判定して、1以下の場合に
sorryサーバにリダイレクトするように設定する。

iruleなので書き方によってはsource ipやurlによって
リダイレクト先のsorryサーバを柔軟に設定できる。

when HTTP_REQUEST {
  if {[active_members [LB::server pool]] < 1 } {
    redirect to "http://sorry.example.com/"
  }
}

linuxでVMwareのvmdkイメージをmountする話

ストレージの機能で仮想マシンのイメージをsnapshotでとっていても、
実際にそのvmdkから特定のファイルを復旧する場合は、
そのsnapshotのファイルをコピーしてインベントリに登録、、、などまあまあ面倒。
だったらいっそのことvmdkを直接mountしたらええやんと思って調べた。

結論を書くと、vmwareのツールでは稼働中の仮想マシンのファイルは
snapshotでも参照できなかったのでkvmのguestfs使った。

VMware vSphere Virtual Disk Development Kit をdownload、install。versionはvsphereにあったもの。

fuseを使っているので必要なら入れる

# yum install fuse-libs

VMware-vix-disklibを展開したら出てくるinstall perlを実行

# perl vmware-install.pl -d

使い方

partition一覧を表示: -p

# vmware-mount -p test.vmdk 
Nr      Start       Size Type Id Sytem                   
-- ---------- ---------- ---- -- ------------------------
 1       2048    1024000 BIOS 83 Linux
 2    1026048    4194304 BIOS 82 Linux swap
 3    5220352   57694208 BIOS 83 Linux

どのパーティションを何でmountしていたかは各仮想マシンによるけど、
この例は1が/boot、2がswap、3が/

mountする:

# vmware-mount test.vmdk 3 /mnt

ただし、起動状態だとmountできない(readonlyでも)ようなので、
いくらread-onlyのsnapshotでもVMが起動しているとmountできないみたい。
こりゃアカン。

libguestfs でmountする

結局HDDイメージなんだからkvmで使ってたブツでいけんじゃね?と思ってやったらできた。
http://hogem.hatenablog.com/entry/20120204/1328321337

仮想マシン起動中に書き込むとファイルシステムが壊れるのでreadonlyでmount。
確実にいくなら(netappのようにsnapshotはreadonlyになっている場合は)snapshotのファイルを使う
CentOS6.7の最新のguestfishだと-iは失敗したので手動でmountする。

# cd .snapshot/hourly.0/
# guestfish -r -a test.vmdk
><fs> run
><fs> df
libguestfs: error: df: do_df: you must call 'mount' first to mount the root filesystem
><fs> list-filesystems
/dev/sda1: ext4
/dev/sda2: swap
/dev/sda3: ext4
><fs> mount /dev/sda3 /

後はcopy-outでファイルを取り出す。

><fs> copy-out /etc/hosts /tmp/hosts.old

RedHat/CentOS のphp/curlでGMO決済にsslで蹴られる現象の対応

GMO側がPCI DSS対応でTLS 1.2のみでの接続となってる。で、CentOS6でcurlで接続すると、
rpmでinstallされているcurl/opensslはtls 1.2に対応しているにも関わらずSSL Connect Errorで弾かれる。
(正確にはcurl直叩きではなくてphpから呼び出すcurl)

curl-7.19.7
openssl-1.0.1e

http://php.net/manual/ja/function.curl-setopt.php

この辺見ていると、curlで接続するSSLのバージョンは
CURLOPT_SSLVERSIONで定義されて、デフォルトはCURL_SSLVERSION_DEFAULT

CURL_SSLVERSION_DEFAULT 0
CURL_SSLVERSION_TLSv1 1
CURL_SSLVERSION_SSLv2 2
CURL_SSLVERSION_SSLv3 3
CURL_SSLVERSION_TLSv1_0 4
CURL_SSLVERSION_TLSv1_1 5
CURL_SSLVERSION_TLSv1_2 6


CURL_SSLVERSION_DEFAULTが何なのかが調べてもわからなかったけど
挙動を見ている限り、tls 1.0 で接続しているぽい。
(RedHat6からopensslからNSSに変更になったのが関係してそう)

解決策

phpcurl側でtls v1.2を指定する。
CURL_SSLVERSION_TLSv1かCURL_SSLVERSION_TLSv1_2。
(TLSv1は1.0ではなくてTLS1全部)

php

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSLVERSION, 1);

curl --tlsv1.2 を指定する。

解決策2

nssじゃなくてopensslだといけるらしいので、curlphpをソースで頑張っていれる。
アプリケーション側でどうしてもオプション指定できない場合はこっちで?

stunnel でtlsで鍵認証をした上でsshする

ずばり探し求めてたの発見。

wifiなどでoutboundが80,443だけに制限されている場合、
aws上のサーバなどにsshが出来ない。

てっとり早い対応はsshのportを443に変えてしまう。
sshdの設定で鍵認証だけを有効にしていれば、
ポートスキャンや総当たり攻撃をされても基本的に問題はない。

けど、せっかくなのでもう少しマシな接続方法を検討して調べたら
stunnelでtlsでクライアント認証を必須にする方法を発見。

opensslで作った証明書でクライアント認証を必須にしたstunnelの通信を設定
sshはそのstunnelを経由して行う

rsyncはdefaultでcopy時にsparse fileを作らない

ということを知った。
cpは元がsparse fileならcopy先もsparseになるから
rsyncもそうだと思ってたけど違った。
rsyncは-S(--sparse) を指定しない場合はdefaultでsparseにしない。

古いlinux(fedora core、centos)をp2vする

mdadmを使っているためvmware converterが使えなくて、ssh+tarでp2vする場合の注意点。

参考: http://hogem.hatenablog.com/entry/2016/02/12/233000

inode size

移行先の仮想マシンで何も考えずにmkfsしてinode sizeが256になっていると、
移行元のgrubのバージョンが古いためgrubが入らない。
mke2fsでinode size 128でmkfsしておく。

http://kb.kristianreese.com/index.php?View=entry&EntryID=113

mke2fs -L / -I 128 -F -j -O dir_index /dev/sda1

modprobe

ドライバが古いから/dev/sdaを認識できない場合
http://www.vcdx.nl/2012/11/06/kernel-panic-not-syncing-attempted-to-kill-init/
/etc/modprobe.conf

alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptscsi
alias scsi_hostadapter2 mptscsih
alias scsi_hostadapter3 mptfc
alias scsi_hostadapter4 mptspi
alias scsi_hostadapter5 mptsas

からmkinitrdする。

ansibleで牛がしゃべるようになってた

久々に触ったら突然牛が出てきてうけた。
正確にいうとansibleは何も変わってなくて、サーバにcowsayがinstallされたからだった。

 _____________
< PLAY [hoge] >
 -------------
        \   ^__^
         \  (oo)\_______  
            (__)\       )\/\
                ||----w | 
                ||     || 

cowsayがinstallされていたらdefaultで牛がしゃべる。

さよなら牛さん

エラーのときにこの牛見るとイラっとするので無効にしておいた。

  • /etc/ansible/ansible.cfg
nocows = 1