Hatena::Groupmonsterhunter

yukogetsは3度死ぬ このページをアンテナに追加 RSSフィード

2008-06-05

[] Mac でネイティブにトンネルしたい! 11:25  Mac でネイティブにトンネルしたい! - yukogetsは3度死ぬ を含むブックマーク はてなブックマーク -  Mac でネイティブにトンネルしたい! - yukogetsは3度死ぬ  Mac でネイティブにトンネルしたい! - yukogetsは3度死ぬ のブックマークコメント

という話になって、ちょっと調べてみました。

あ、ちなみにクライアントの方のお話です。tunnel-server は前に書いたとおり Wine 上で動作可能です。

WinPcap と libpcapの互換性

tunnel-client の動作には WinPcap が必要ですが、Mac には当然 WinPcap は導入できません。ただし、MacUNIX ですから libpcap なら使えます。

というわけで libpcap が WinPcap のかわりになればいいなーと思っていたら、WinPcap ユーザーズマニュアルによると

wpcap.dll はよく知られたUNIXのパケットキャプチャライブラリであるlibpcap と互換性があります。この互換性は、全てのWin32OSファミリー上と主要なUNIXフレーバー上で動作するポータブルネットワークツールを作成することを可能にします。

とのこと。マジで?!

ためしに WinPcap のサンプルソースである pktdump_exMac でコンパイル。

% cc -lpcap -o pktdump_ex pktdump_ex.c
pktdump_ex.c: In function 'main':
pktdump_ex.c:119: warning: passing argument 3 of 'pcap_next_ex' from incompatible pointer type

なんか warning 出たけどとりあえず無視。コンパイル通った!

実行してみます。

% sudo ./pktdump_ex
Password:
pktdump_ex: prints the packets of the network using WinPcap.
         Usage: pktdump_ex [-n adapter] | [-f file_name]

1. en0 (No description available)
2. fw0 (No description available)
3. en1 (No description available)
4. lo0 (No description available)
Enter the interface number (1-4):3
1212555407:302934 (106)
00 80 bd 14 f8 e8 00 11 24 95 fb b9 08 00 45 10
00 5c d2 e8 40 00 40 06 3c 32 c0 a8 ...

1212555407:323127 (458)
00 80 bd 14 f8 e8 00 11 24 95 fb b9 08 00 45 10
01 bc d2 e9 40 00 40 06 3a d1 c0 a8 ...

1212555407:343680 (1130)
00 80 bd 14 f8 e8 00 11 24 95 fb b9 08 00 45 10
04 5c d2 ea 40 00 40 06 38 30 c0 a8 ...

1212555407:387156 (1130)
...
^C
(実際はもっとダンプのデータが続くのですがパスワードとか含まれてそうなので削りました!)

ものの数秒で数万行のデータになります。

というわけで、動いてしまいました。これいけるんじゃね?


しかし、Winsock2 とかにも依存してる

というわけで、wktkしながら公開されてる MHPTunnel 0.5 のソースを見てみると、

#include <winsock2.h>
#include <windows>

などという記述が・・・。

こればっかりはちゃんと sys/socket.h とかを使うように書き換えないとダメかな・・・。

もしくは、Wine に含まれる winsock2.h とかを使ってうまくいくなら若干楽できるかも。と思って無理矢理コンパイルを試みる。

なお、MacBook には Wine をまだ入れてないので FreeBSD/i386 6.2-RELEASE でやってみました。

% cc -lpcap -I/usr/local/include/wine/windows tunnel-client.cpp
tunnel-client.cpp:15:19: conio.h: No such file or directory
tunnel-client.cpp: In function `void DoCommand(SOCKET_EX*, DATA_HEADER*, char*)':
tunnel-client.cpp:84: error: invalid conversion from `char*' to `const u_char*'
tunnel-client.cpp:84: error:   initializing argument 2 of `int pcap_sendpacket(pcap_t*, const u_char*, int)'                                                                                                   
tunnel-client.cpp: In function `DWORD DoMain(void*)':
tunnel-client.cpp:289: error: `_T' was not declared in this scope
tunnel-client.cpp:337: warning: converting of negative value `-0x00000000000000001' to `DWORD'
tunnel-client.cpp:350: warning: converting of negative value `-0x00000000000000001' to `DWORD'
tunnel-client.cpp:369: warning: converting of negative value `-0x00000000000000001' to `DWORD'

こんな感じでした。

僕はプログラマじゃないのでこれ以上はよくわかりません><


お客様の中に、一晩でやってくれるジェバンニはいらっしゃいませんか?