2014年8月3日日曜日

stone の rpm を作る

stone の rpm を作りました。CentOS 6 用です。Amazon Linux でも利用しています。
以下に置いてあります。

https://raw.githubusercontent.com/pcserver-jp/stone/master/stone-2.3e-2.3.3.17.el6.x86_64.rpm

https://raw.githubusercontent.com/pcserver-jp/stone/master/stone-2.3e-2.3.3.17.el6.src.rpm

本家 (http://www.gcd.org/sengoku/stone/Welcome.ja.html) の tar ボールは 2.3e (2.3.2.7 2008/02/24) から更新されていません。本家の cvs に置いてあるソースは 2.3.3.17 (2013/12/27) が最新版となります。
tar ボールに付属している spec ファイルと Makefile ではビルドできなかったのでパッチをあてています。stone.c は最新版に置き換えました。パッチは以下に置いてあります。

https://raw.githubusercontent.com/pcserver-jp/stone/master/stone.2.3.3.17.patch

stone を利用すると、ファイアウォールを超えることが容易になります。
外部へは、http/https しか通信を許可していない環境が多いと思います。stone を利用すると、例えば ssh を ssl 化して https 経由で接続できるようになったりします。プロキシサーバを通過させることもできたりしますが、今回そこまでは紹介しません。会社等で利用する場合は、このようなトンネルを利用する行為が許されているかどうか確認してください。
面白い使い方としては、udp を tcp 化することです。tcp 化すれば、ssh でポート転送できるようになります。ssl アクセラレータとして利用することもできます。https でバーチャルホストを利用することもできます。やり方は各自調べてみてください。

パブリック・クラウドを利用する場合、ファイアウォールが障壁となっていることがよくあると思います。パブリック・クラウドでサーバを発注すると、Linux であれば22番ポートしか開いていないことが多いです。そこで、443番ポートをトンネルして ssh 接続する方法を紹介します。


まずはサーバ側を設定します。上記の rpm をインストールします。


sudo yum -y localinstall https://raw.githubusercontent.com/pcserver-jp/stone/master/stone-2.3e-2.3.3.17.el6.x86_64.rpm


ssl で利用するサーバ証明書を作成します。


openssl req -new -outform pem -out stone.cert -newkey rsa:1024 -keyout stone.key -nodes -rand ./rand.pat -x509 -batch -days 36500
sudo touch /etc/pki/tls/certs/stone.pem
sudo chmod 400 /etc/pki/tls/certs/stone.pem
cat stone.cert stone.key | sudo tee /etc/pki/tls/certs/stone.pem > /dev/null
rm -f stone.cert stone.key


stone プロセスを chroot する準備をします。CentOS では UID、GID 17番が空いていると思われますが、何かと衝突するようであれば変更してください。


sudo groupadd -g 17 stoned
sudo useradd -g stoned -u 17 -c "Stone Daemon" -d / -s /sbin/nologin -r stoned
sudo mkdir -p /var/chroot/stoned


起動スクリプトを作成します。


cat << 'EOF' | sudo tee /etc/init.d/stoned
#!/bin/bash
#
# stoned        Starts stone daemon.
#
# chkconfig: 2345 99 25
# description: Stone is a TCP/IP repeater in the application layer. \
# It repeats TCP and UDP from inside to outside of a firewall, or \
# from outside to inside.

### BEGIN INIT INFO
# Provides: stoned
# Required-Start: $network $local_fs $remote_fs
# Required-Stop: $network $local_fs $remote_fs
# Should-Start: $syslog
# Should-Stop: $syslog
# Default-Start: 2345
# Default-Stop: 99
# Short-Description: Starts/stop the "stone" daemon
# Description:      Stone is a TCP/IP repeater in the application layer.
#    It repeats TCP and UDP from inside to outside of a firewall, or
#    from outside to inside.
### END INIT INFO

# source function library.
. /etc/init.d/functions

: ${prog:=stone}
lockfile=/var/lock/subsys/$prog
STONE_BIN="/usr/bin/$prog"
STONE_CONF="/etc/${prog}d.conf"
PIDFILE=/var/run/${prog}.pid
RETVAL=0

start()
{
  [ "$EUID" != "0" ] && exit 4
  echo -n $"Starting $prog: "
  daemon $STONE_BIN -D -l -o stoned -g stoned -t /var/chroot/stoned -i $PIDFILE -C $STONE_CONF
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch $lockfile
  return $RETVAL
}

stop()
{
  [ "$EUID" != "0" ] && exit 4
  echo -n $"Shutting down $prog: "
  killproc -p $PIDFILE $STONE_BIN
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f $lockfile
  return $RETVAL
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    status $prog
    ;;
  *)
    echo $"Usage: $0 {start|stop|restart}"
    RETVAL=1
esac

exit $RETVAL
EOF
sudo chmod 755 /etc/init.d/stoned


設定ファイルを作成します。今回は1行しかありませんが、2行目以降は先頭に「-- 」 (ハイフン・ハイフン・半角空白) を付けることで複数の設定を入れることができます。


cat << 'EOF' | sudo tee /etc/stoned.conf
localhost:22 443/ssl
EOF


起動して、自動起動設定します。ファイアウォールを設定している場合は、443/tcp が開いていることを確認しておいてください。


sudo /etc/init.d/stoned start
sudo chkconfig --add stoned
sudo chkconfig stoned on



次はクライアント側の設定です。Windows 7 での実行例となります。
以下のファイルをダウンロードして解凍します。

http://www.gcd.org/sengoku/stone/stonexp-2.3e.zip

コマンドプロンプトを開き、解凍後にできたディレクトリに移動後、次のコマンドを実行します。my_server は、サーバのグローバルアドレスに置き換えてください。例は示しませんが、プロキシサーバを経由させるように実行することも可能です。


stone my_server:443/ssl localhost:10443 localhost


あとは、Teraterm 等で [ホスト] に 「localhost」、[TCPポート] に 「10443」 を指定して接続してください。


Windows Server の RDP も同様に443番ポートをトンネルして、リモートデスクトップ接続する方法を紹介します。Windows Server 2008 R2 で検証しました。

先ほどの Windows 7 の例で紹介したファイルをダウンロードして解凍します。
C:\Windows\stoned というディレクトリを作成し、解凍して出てきたファイルを全てコピーします。
C:\Windows\stoned\stoned.cfg というテキストファイルを作成し、中身を以下のようにします。


-L C:/Windows/stoned/error.txt
-a C:/Windows/stoned/access.txt
-dd
-n
-z certkey=C:/Windows/stoned/stone.pem
127.0.0.1:3389 443/ssl


C:\Windows\stoned\stone.pem というテキストファイルを作成し、中身を先ほど Linux 上で作成した /etc/pki/tls/certs/stone.pem ファイルと同じにします。

Windows のサービスとして登録します。
コマンドプロンプトを管理者として実行し、以下のコマンドを実行します。


cd C:\Windows\stoned
stone -M install Service -C C:\Windows\stoned\stoned.cfg


Stone Service というサービスが登録されるので、開始して、スタートアップの種類を「自動」に変更します。Windows Firewall を有効化している場合は 443/tcp を開けておきます。

クライアント側では以下のコマンドを実行しておきます。my_windows は、Windows Server のグローバルアドレスに置き換えてください。


stone my_server:443/ssl localhost:10443 localhost -- my_windows:443/ssl localhost:13389 localhost


あとは、リモートデスクトップ接続にて、「localhost:13389」 に接続します。

0 件のコメント:

コメントを投稿