no about note

エンジニアのメモ書き

CentOS6.xにstoneをインストールした

Stone

stoneとはなにか?

stone は、アプリケーションレベルの TCP & UDP リピーターです。ファイアウォールの内から外へ、あるいは外から内へ、TCP あるいは UDP を中継します

ポートフォワーディングの例

  • 例えば、Local → Remote へRemoteDesktopしたい場合SSHのポートフォワード機能を使うと、ファイアウォールに22番ポートしか空いてない場合、22番ポートで接続すると余計な穴を空ける必要がない

stoneに置き換えられそうなもの

  • sshのポートフォワーディング
  • Apacheのリバースプロキシ

参考:
* ポートフォワーディング
* 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

→動いたっぽい

CentOSでstone 2.3eのインストールと設定

ログの設定

# 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 &

参考

新しいLinuxの教科書

新しいLinuxの教科書