たけまるの日記

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

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あたりを使う方法を考えようと思います。。。