CentOS6.xにstoneをインストールした
http://www.flickr.com/photos/28145073@N08/7356884346
stoneとはなにか?
- パケットを中継してファイアウォールにトンネルを掘ることができる
stone は、アプリケーションレベルの TCP & UDP リピーターです。ファイアウォールの内から外へ、あるいは外から内へ、TCP あるいは UDP を中継します
ポートフォワーディングの例
- 例えば、Local → Remote へRemoteDesktopしたい場合SSHのポートフォワード機能を使うと、ファイアウォールに22番ポートしか空いてない場合、22番ポートで接続すると余計な穴を空ける必要がない
stoneに置き換えられそうなもの
参考:
* ポートフォワーディング
* SSHポートフォワード(トンネリング)を使って、遠隔地からLAN内のコンピュータにログインするAdd Star
stoneをインストールする
Makeに必要なパッケージを入れる
# yum install gcc openssl-devel
stoneをダウンロード
# cd /usr/local/src # wget http://www.gcd.org/sengoku/stone/stone-2.3e.tar.gz # tar zxvf stone-2.3e.tar.gz
Makefileを編集
- エラーを回避するために以下のようにmakefileを編集する
# cd stone-2.3d-2.3.2.7/ # cp -p Makefile Makefile.bak # diff Makefile Makefile.bak 100c100 < $(MAKE) FLAGS="-O -Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL -D_GNU_SOURCE $(FLAGS)" LIBS="-lpthread $(LIBS)" stone --- > $(MAKE) FLAGS="-O -Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL $(FLAGS)" LIBS="-lpthread $(LIBS)" stone [root@router-test stone-2.3d-2.3.2.7]#
syslog以外にログを吐くように設定
# cd /usr/local/src/stone-2.3d-2.3.2.7 # cp -p stone.c stone.c.bk
stone.cを編集
# diff stone.c stone.c.bk 9988c9988 < openlog(SyslogName, 0, LOG_LOCAL0); --- > openlog(SyslogName, 0, LOG_DAEMON); 10064c10064 < openlog(SyslogName, 0, LOG_LOCAL0); --- > openlog(SyslogName, 0, LOG_DAEMON);
コンパイル
# make linux-ssl make TARGET=linux ssl_stone LIBS="-ldl" make[1]: ディレクトリ `/usr/local/src/stone-2.3d-2.3.2.7' に入ります make FLAGS="-DUSE_POP -DUSE_SSL " LIBS="-ldl -lssl -lcrypto" linux make[2]: ディレクトリ `/usr/local/src/stone-2.3d-2.3.2.7' に入ります make FLAGS="-O -Wall -DCPP='\"/usr/bin/cpp -traditional\"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL -D_GNU_SOURCE -DUSE_POP -DUSE_SSL " LIBS="-lpthread -ldl -lssl -lcrypto" stone make[3]: ディレクトリ `/usr/local/src/stone-2.3d-2.3.2.7' に入ります cc -O -Wall -DCPP='"/usr/bin/cpp -traditional"' -DPTHREAD -DUNIX_DAEMON -DPRCTL -DSO_ORIGINAL_DST=80 -DUSE_EPOLL -D_GNU_SOURCE -DUSE_POP -DUSE_SSL -o stone stone.c -lpthread -ldl -lssl -lcrypto stone.c: In function ‘saDup’: stone.c:1558: 警告: キャストによってポインタから異なるサイズの整数となります stone.c: In function ‘sendPairUDPbuf’: stone.c:3023: 警告: キャストによってポインタから異なるサイズの整数となります stone.c: In function ‘freePair’: stone.c:3644: 警告: キャストによってポインタから異なるサイズの整数となります stone.c: In function ‘doconnect’: stone.c:3883: 警告: キャストによってポインタから異なるサイズの整数となります stone.c: In function ‘acceptPair’: stone.c:4072: 警告: キャストによってポインタから異なるサイズの整数となります stone.c: In function ‘proto2fdset’: stone.c:6239: 警告: キャストによってポインタから異なるサイズの整数となります stone.c:6300: 警告: キャストによってポインタから異なるサイズの整数となります stone.c: In function ‘dispatch’: stone.c:6916: 警告: キャストによってポインタから異なるサイズの整数となります stone.c: In function ‘newMatch’: stone.c:7070: 警告: キャストによってポインタから異なるサイズの整数となります stone.c: In function ‘freeMatch’: stone.c:7084: 警告: キャストによってポインタから異なるサイズの整数となります stone.c: In function ‘sslopts_default’: stone.c:8875: 警告: assignment discards qualifiers from pointer target type stone.c:8885: 警告: assignment discards qualifiers from pointer target type stone.c: In function ‘sslopts’: stone.c:8971: 警告: assignment discards qualifiers from pointer target type stone.c:8972: 警告: assignment discards qualifiers from pointer target type stone.c:8976: 警告: assignment discards qualifiers from pointer target type stone.c:8977: 警告: assignment discards qualifiers from pointer target type stone.c:8981: 警告: assignment discards qualifiers from pointer target type stone.c:8982: 警告: assignment discards qualifiers from pointer target type stone.c: In function ‘initialize’: stone.c:10178: 警告: キャストによってポインタから異なるサイズの整数となります make[3]: ディレクトリ `/usr/local/src/stone-2.3d-2.3.2.7' から出ます make[2]: ディレクトリ `/usr/local/src/stone-2.3d-2.3.2.7' から出ます make[1]: ディレクトリ `/usr/local/src/stone-2.3d-2.3.2.7' から出ます
→エラーがでなければOK
Pathの通る位置に配置
# cp -rfpa stone /usr/local/bin/
stoneコマンドで起動
# stone Dec 2 18:19:22.812033 139932587710400 start (2.3e) [6991] Dec 2 18:19:22.812184 139932587710400 stone 2.3e http://www.gcd.org/sengoku/stone/ Dec 2 18:19:22.812204 139932587710400 Copyright(C)2007 by Hiroaki Sengoku <sengoku@gcd.org> Dec 2 18:19:22.812214 139932587710400 using OpenSSL 1.0.1e-fips 11 Feb 2013 http://www.openssl.org/ Usage: stone <opt>... <stone> [-- <stone>]... opt: -h opt ; help for <opt> more -h stone ; help for <stone> -h ssl ; help for <SSL>, see -q/-z opts
→動いたっぽい
ログの設定
# vim /etc/rsyslog.d/stone.conf // 1行を追記 local0.* /var/log/stone.log
stoneのログを/var/log/messagesに出力しないようにするため、以下を修正
# vi /etc/rsyslog.conf ・・・ *.info;mail.none;authpriv.none;cron.none /var/log/messages ↓ *.info;mail.none;authpriv.none;cron.none,local0.none /var/log/messages
ログファイル作成
# touch /var/log/stone.log
rsyslogを再起動
# /etc/init.d/rsyslog restart システムロガーを停止中: [ OK ] システムロガーを起動中: [ OK ] [root@router rsyslog.d]#
rsyslog で local ファシリティで指定したログが /var/log/messages にも出力されるので出力させないようにした記録
専用アカウントを設定
グループとユーザ作成
# groupadd -g 10001 stone # useradd -g stone -d /etc/stone -s /sbin/nologin -u 10003 stone
起動スクリプト作成
OPTIONS="-i $PID_FILE -C /etc/stone/stone.conf"
# vim /etc/init.d/stone #!/bin/bash # # stone Start up the stone # # chkconfig: 2345 55 25 # description: stone is a simple packet repeater. # # processname: stone # config: /usr/local/etc/stone.conf # pidfile: /var/run/stone.pid ### BEGIN INIT INFO # Provides: stone # Required-Start: $local_fs $network $syslog # Required-Stop: $local_fs $syslog # Should-Start: $syslog # Should-Stop: $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start up the stone # Description: stone is a simple packet repeater. ### END INIT INFO # source function library . /etc/rc.d/init.d/functions # pull in sysconfig settings [ -f /etc/sysconfig/stone ] && . /etc/sysconfig/stone RETVAL=0 prog="stone" lockfile=/var/lock/subsys/${prog} # Some functions to make the below more readable STONE=/usr/local/bin/stone PID_FILE=/var/run/${prog}.pid #OPTIONS="-i $PID_FILE -C /usr/local/etc/stone.conf" OPTIONS="-i $PID_FILE -C /etc/stone/stone.conf" start() { [ -x $STONE ] || exit 5 echo -n $"Starting $prog: " $STONE $OPTIONS && success || failure RETVAL=$? [ $RETVAL -eq 0 ] && touch $lockfile echo return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p $PID_FILE $STONE RETVAL=$? [ $RETVAL -eq 0 ] && rm -f $lockfile echo } reload() { echo -n $"Reloading $prog: " killproc -p $PID_FILE $STONE -HUP RETVAL=$? echo } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; reload) reload ;; *) echo $"Usage: $0 {start|stop|restart|reload}" RETVAL=2 esac exit $RETVAL
起動スクリプト自動起動設定
# chmod 755 /etc/init.d/stone # chkconfig stone on
起動する
/etc/init.d/stone start
stoneの動作確認
80番ポートを443に転送してみる
# stone 172.16.0.100:80 80 & # stone 172.16.0.100:443 443 &