たけまるの日記

たけまるの日記です。web関係の技術ネタが多いですが、好きなことを適当に書いています。

Parallelsshを使ってsshコマンドを多ホストで実行

install (MacOS)

$ brew install pssh

ホストリストを作成 (host.list)

user@host1.test
user@host2.test
user@host3.test:12345
…

実行

$ pssh -h /tmp/ssh.list "hostname"
[1] 14:49:28 [SUCCESS] user@host1.test
[2] 14:49:28 [SUCCESS] user@host2.test
[3] 14:49:28 [SUCCESS] user@host3.test:12345

iオプションで実行結果を表示できる

$ pssh -h /tmp/ssh.list -i "hostname"
[1] 14:48:28 [SUCCESS] user@host1.test
host1.test
[2] 14:48:28 [SUCCESS] user@host2.test
host2.test
[3] 14:48:28 [SUCCESS] user@host3.test:12345
user@host3.test

sudoをしようとするとttyが無いと怒られるので、必要であればssh先のsudoersを書き換える

参考 http://orebibou.com/2014/07/%E8%A4%87%E6%95%B0%E5%8F%B0%E3%81%AB%E5%AF%BE%E3%81%97%E5%90%8C%E6%99%82%E3%81%ABssh%E6%8E%A5%E7%B6%9A%E3%80%81%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B/

IPv6が有効なホストからSOCKS経由でGoogleに繋ごうとすると失敗する

さくらVPSを2台契約しておりまして、

hostB$ ssh -D 1080 username@hostA

という感じで片方のホストをSOCKSサーバーにして、もう片方のホストからSOCKS経由で外に行く、なんて事をやっていました。


しかし、特定のホストだけ接続できない。
例えば以下のようになります。

hostB$ curl --socks5 localhost:1080  "http://www.google.com/"
curl: (6) Failed to resolve "www.google.com" for SOCKS5 connect.


勿論SOCKSを経由しなければ

hostA$ curl "http://www.google.com/"
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.jp/?gfe_rd=cr&amp;ei=XggRVIyJMcGF4AK10YGgBw">here</A>.
</BODY></HTML>
hostB$ curl "http://www.google.com/"
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.jp/?gfe_rd=cr&amp;ei=XggRVIyJMcGF4AK10YGgBw">here</A>.
</BODY></HTML>


これ、相当ハマったのですが、以下のようにしたら動きました。

hostB$ curl --socks5 localhost:1080 --ipv4 "http://www.google.com/"
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.co.jp/?gfe_rd=cr&amp;ei=XggRVIyJMcGF4AK10YGgBw">here</A>.
</BODY></HTML>

そうです、IPv6が問題だったのです。
curlのオプションで、IPv4の使用を強制したら繋がりました。
つながらないホストは、IPv6に対応しているホストでした。


しかし謎なのは、現行のさくらVPSは標準でIPv6に対応しており、2台とも問題なくIPv6通信ができます。
あまり深追いはしていないのですが、OpenSSHのDynamicForwardがIPv6に対応していない?


さて、実際はPHPcurlからIPv6対応ホストにSOCKS経由で接続できなくて困っていたので、
場当たり的にPHPcurlIPv4固定で動作させる事により回避したいと思います。

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );


ちなみにこれ、最初は別のホストで動いていたものを新しいVPSに移行したら動かなくなり調べていたのですが、
移行元ホストは古いさくらVPSインスタンスで、IPv6が無効の状態となっていました。
そのため強制的にIPv4が使われていたため動いていたようです。


時間のあるときにOpenSSHのDynamicForwardとIPv6の関係を調べよう。。


参考
http://www.businesscorner.co.uk/disable-ipv6-in-curl-and-php/

mod_evasiveのアラートメール件名(Subject)の設定

DoSアタックに遭いました。


幸いApacheBench使って単一のホストから打ってきてるだけだったので、iptablesで特定IPをフィルタすることで対応しました。
しかし、こんな幼稚な手法でもIP変えられたら同じ轍を踏む事になりますので、気休め程度にApacheDoS対策モジュールを入れてみました。


インストールは以下を参考にさせて頂きました
http://ijo.cc/it/ja/server/apache_mod_evasive/


さて、このモジュールは攻撃を食らった時(モジュールがお仕事した時)にアラートメールを送信する機能があります。
そのメールの件名を設定するには、ソースファイルを直接編集してコンパイルすると説明しているサイトがいくつかありましたが、そこまでしなくてもhttpd.confの設定だけで件名を設定できたのでメモしておきます。


DOSEmailNotifyの引数がそのまま /bin/mail の引数になっているようでしたので

<IfModule mod_evasive20.c>
     DOSBlockingPeriod 3600
     DOSLogDir "/var/log/httpd_mod_evasive"
     DOSEmailNotify "-s 'DoS Attack Alert' mail@address.test"
</IfModule>

こんな感じで行けました!

LINE詐欺が来た!手口の全てを暴く

今話題のLINE詐欺、ついに俺のところにも来ました。
手口の一部始終を公開したいとおもいます。


とりあえず滅多にLINEなど来ないひとからいきなり以下のメッセージが。


「何してますか?忙しいですか?手伝ってもらってもいいですか?」
「近くのコンビニエンスストアでweb money の プリペイドカードを買うのを手伝ってもらえますか?」


LINEで詐欺が流行ってるのはtwitterで知っていましたが、具体的な手口までは知らなかったし、何より送ってきてる人が登録している知人の名前だったため、流石に怪しいとは思ったけどこの時点では3割くらいは本人の可能性もあるかなと思っていました。



とりあえず本人確認のため、その人の個人的な趣味の事について聞こうとするも、完全スルー。
この時点で本人の可能性は0になりました。
ので、おちょくりモードに移行。



こんなかんじでのらりくらりとかわされる。



色々聴きだしてみる。明らかに日本人ではないね。



買ったように見せかけ、画像をURLで出す。
ちなみにこのURLを開くと出てくる画像は即興で作ったコレ。



そんなわけで見事にひっかかりました。
奴らのIPがバッチリ。

175.44.216.29 - - [28/Jun/2014:18:05:16 +0900] "GET /webmoney.jpg HTTP/1.1" 200 44935 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET4.0C; .NET4.0E)"
175.44.216.29 - - [28/Jun/2014:18:06:17 +0900] "GET /webmoney.jpg HTTP/1.1" 304 - "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET4.0C; .NET4.0E)"
175.44.216.29 - - [28/Jun/2014:18:12:30 +0900] "GET /webmoney.jpg HTTP/1.1" 304 - "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET4.0C; .NET4.0E)"

WindowsXPにIE6wwww



IPを調べて見ると案の定中国。
見せる画像日本語じゃなくて中国語にしとけばよかった。


ちなみに別経路で本人に連絡をとってみたのですが、アカウントを乗っ取られて自分ではログインできず、パスワードも変更できない状況との事でした。


実際この手口は既にかなりやられているようで、他サイトで同じID/PWを使いまわしている人が狙われてるとか。
これでWebMoney渡しちゃうような人はそうそう居ないとは思いますが、そもそもアカウントを乗っ取られないように各自対策は必要ですね。


参考
LINEで発生しているWeb Moneyを要求する不正ログインについてまとめてみた。 - piyolog

mac/linuxでのtsocksの挙動の違いについて

諸事情で、Linux上で動くPHPのプログラムを、
tsocksを使ってSOCKS経由で通信させようとしていたが、
結果的に動かなかったという話。


環境としてはCentOS6にEPELで入れたtsocks、
ssh -Dで他ホストに接続し、通信をそちらに流そうとした。
が、成功するケースと失敗するケースがあった。


■成功

$ tsocks telnet hogehoge.com 80
$ tsocks wget -O - http://hogehoge.com/
$ tsocks ftp hogehoge.com


■失敗

$ tsocks curl -s http://hogehoge.com/
PHP上からのfile_get_contents(), curl_exec, Net_FTPからのファイル転送


勿論、tsockを使わずにcurlのオプションにSOCKSサーバーを設定した場合は成功する
(コマンドライン実行、PHPからの実行問わず)


不思議なことに、これらは全てmac上で行えばすべて成功する。
OSや各種ライブラリの実装の違いなのだろうか
これ以上追うと深みに嵌りそうなのだけどどうするかな。。。

追記


最終的に諦めました


まずtsocksの仕組みとして、
DynamicLoadしているライブラリより先にlibtsocks.soをロードすることにより、
connect()関数等を上書き(フック)する事により実現しています。


そのための仕組として、LinuxではLD_PRELOADという環境変数を使って
指定していますが、MacOSでは仕組みが異なり、
DYLD_INSERT_LIBRARIES環境変数で指定しています。
このあたりの実装の違いで挙動の違いが起きている気がしています。


http://curl.haxx.se/mail/lib-2010-01/0263.html
http://sourceforge.net/p/tsocks/bugs/23/
この辺りを見ると、curlはnon-blocking socketを使っているから動かないんじゃないか
みたいな事を書いてると思いますが、実際のところは不明かつMacOSでは動いてるし…。


因みにcurl自体、SOCKSへ接続する機能があるのはわかっているのですが、
どちらかというとphpからのFTPをSOCKS経由にするのが目的で、
両方共動かなかったので、なにか共通の問題があるのではないかとcurlをメインで追っていました。


いずれにせよtsocks自体2002年のリリース以降なにもメンテされていないような代物なので、
これ以上調べても無駄と判断して諦めました。


大人しくsquidあたりを使う方法を考えようと思います。。。

さくらのレンタルサーバー スタンダードプランについて調べてみた

さくらのレンタルサーバー スタンダードというプランを借りてみました。
容量は100GBで月額515円と、かなりお安くなっています。さくらVPSには散々お世話になっているのですが、こちらのほうは初めてです。


このサービスではSSHを繋ぐことができますので、せっかくなので中身がどんな感じか探ってみました。

% uname -a
FreeBSD wwwXXX.sakura.ne.jp 9.1-RELEASE-p11 FreeBSD 9.1-RELEASE-p11 #0: Wed Apr  9 21:20:36 JST 2014     root@wwwXXXsub.sakura.ne.jp:/usr/obj/usr/src/sys/SAKURA17  amd64

FreeBSDとな。ふむ。


次はdmesg関係をチェック。

% cat /var/run/dmesg.boot
…
CPU: Intel Xeon E312xx (Sandy Bridge) (2600.13-MHz K8-class CPU)
  Origin = "GenuineIntel"  Id = 0x206a1  Family = 6  Model = 2a  Stepping = 1
  Features=0xf8bf3ff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,MMX,FXSR,SSE,SSE2,SS>
  Features2=0xffba2203<SSE3,PCLMULQDQ,SSSE3,CX16,PCID,SSE4.1,SSE4.2,x2APIC,POPCNT,TSCDLT,AESNI,XSAVE,OSXSAVE,AVX,F16C,RDRAND,HV>
  AMD Features=0x20100800<SYSCALL,NX,LM>
  AMD Features2=0x1<LAHF>
  TSC: P-state invariant
real memory  = 19327352832 (18432 MB)
avail memory = 18604638208 (17742 MB)
Event timer "LAPIC" quality 400
ACPI APIC Table: <BOCHS  BXPCAPIC>
FreeBSD/SMP: Multiprocessor System Detected: 3 CPUs
FreeBSD/SMP: 3 package(s) x 1 core(s)
 cpu0 (BSP): APIC ID:  0
 cpu1 (AP): APIC ID:  1
 cpu2 (AP): APIC ID:  2

CPUはSandy Bridge世代のエントリークラスですね。
メモリは18Gとかなり大盛り。某激安レン鯖とはやはり違います。
ただコア数が3個…?

virtio_pci0: <VirtIO PCI Network adapter> port 0xc040-0xc05f mem 0xf2020000-0xf2020fff irq 11 at device 3.0 on pci0
vtnet0: <VirtIO Networking Adapter> on virtio_pci0
virtio_pci0: host features: 0x711fffe3 <EventIdx,RingIndirect,NotifyOnEmpty,RxModeExtra,VLanFilter,RxMode,ControlVq,Status,MrgRxBuf,TxUFO,TxTSOECN,TxTSOv6,TxTSOv4,RxUFO,RxECN,RxTSOv6,RxTSOv4,TxAllGSO,MacAddress,RxChecksum,TxChecksum>
virtio_pci0: negotiated features: 0x110f8020 <RingIndirect,NotifyOnEmpty,VLanFilter,RxMode,ControlVq,Status,MrgRxBuf,MacAddress>
…

という事で、どうやらOSは仮想環境上のようです。

% uptime
 9:30PM  up 28 days, 19:18, 1 user, load averages: 0.31, 0.38, 0.44

ロードアベレージかなり低い!
某激安レン鯖とはやっぱりちが(ry

% df -h
Filesystem      Size    Used   Avail Capacity  Mounted on
/dev/vtbd0p2      2G    161M    1.6G     9%    /
devfs           1.0k    1.0k      0B   100%    /dev
/dev/vtbd0p4    3.9G    1.9G    1.7G    54%    /usr
/dev/vtbd0p5     19G    794M     17G     4%    /var
/dev/vtbd1        2T    126G    1.7T     7%    /home

ユーザー領域として2TBのストレージが接続されているようです。

% ls -al /home | wc
     149    1334   10661

管理用のディレクトリなどもあるようですが、約150ユーザーが収容されていました。全員同じプランかはわかりませんが、仮に全員スタンダードだとすると150人 x 100GB = 15TB必要なはずですが、ストレージは2TB。
フレキシブルに容量を増やせるようになっているのか、全員容量いっぱいまでは使わないだろうという想定なのか。

% quota
Disk quotas for user XXXXX (uid XXXX): 
Filesystem        usage    quota   limit   grace  files   quota  limit   grace
/home             83952  104857600 104857600           5374  3000000 3000000

ユーザーごとのquota設定。
inodeのリミット(最大ファイル数)が300万なので、単純計算で1ファイルあたり35kB以下のファイルをいっぱい作ると容量よりinodeの限界のほうが先に来ることになりますね。


全体として、月額500円前後という金額を考えたらかなりハイスペックな内容と言えるのではないでしょうか。
見かけ上のスペックだけではなく、一応インフラエンジニアをやっていた私から見ても、サーバー構成に安心感があるなと思いました。

さくらVPSは100GBで1000円と、価格面からみると2倍の価格となります。
もちろんサーバーを自由に使えるメリットはあるのですが、単純にサイトを作る場合などにはこちらのが良さそうですね。


お約束ですが、こちらの内容は、あくまで私が借りたアカウントで、普通のユーザー権限で見れる範囲の内容を書いたまでです。契約時期などによっても細かい部分は違うと思いますので、そのあたりは自己責任でお願いします。




VirtualBoxの共有ディレクトリの静的ファイルをApacheから読むと文字化けする問題

ホストOSのeclipseでコードを書き、workspaceをVirtualBoxの共有ディレクトリにマウントして開発しているスタイルだと遭遇する問題。

過去に一度遭遇して、再度発生した時に対処方法を忘れていたのでメモ。
原因、対策については以下サイトに書いている内容そのまま。


VirtualBoxの共有ディレクトリ内のファイルを更新してもApacheで表示が更新されない問題
http://nplll.com/archives/2012/09/virtualboxapache.php

原因

Apacheには静的ファイルをメモリ上にキャッシュする機能があり、
通常であればファイル更新を検知してキャッシュ更新を行うが、
DocRootがNFS等の共有ドライブ上にあると検出できない。

対策

上記キャッシュ機能を無効にする。
httpd.confに以下内容を記述してApache再起動。

EnableMMAP Off
EnableSendfile Off