stoneでポートをリダイレクトする方法

自宅サーバなどの管理のため、使用できるポートを制限されたネットワーク環境から外部サーバにアクセスするために、 stone と呼ばれるツールを使用することにしました。

stone の概要

stone は、パケットを中継することによって、ファイアーウォールにトンネルを掘ることが出来ます。通常開いているポート 443 を使って ssh にアクセスすることも可能です。クライアントとサーバで起動することにより通常とは違うポートを使用することができます。しかも、SSL で暗号化することも可能です。設定手順は、次の通り。

  1. 443 ポート使用停止( Apache の設定変更)
  2. stone のコンパイルとインストール
  3. SSL 通信用証明書の作成
  4. stone の起動と起動用シェル作成

443 ポート使用停止( Apache の設定変更)

stone で使う 443 ポートについてサーバ側での使用状況を調査します。調査には、 netstat コマンドを実行します。 Apache で SSL を使う設定をしている場合は、これを解除します。 Apache のconf ファイルから SSL の設定と使用しているポートの設定を削除します。 Debian パッケージを使用している場合は、以下の手順でできます。それ以外の場合は、 httpd.conf で該当する設定をコメントアウトします。

設定ファイル /etc/apache2/ports.conf から 443 ポートの設定をコメントアウトします。

Listen 80
# Listen 443

SSL の設定ファイルの置き場所に移動し、解除するファイルを確認します。確認後設定を解除します。

cd /etc/apache2/sites-available
a2dissite hoge( hoge は、 SSL のサイト定義ファイル)

後は、再起動すれば終了です。 netstat で確認して443が使用されていないことを確認します。ちなみに netstat の結果に 443 の代わりに https となっているかもしれませんが、これは、 /etc/services ファイルにポートとの紐付け情報があるためで同じ意味です。

stone のコンパイルとインストール

Linux で使うには、ソースをコンパイルする必要があります。ソースは、Simple Repeater stoneにtar.gzファイルがあります。これを解凍し、コンパイルします。ダウンロードしたファイル「stone-2.3e.tar.gz」を解凍し、 make コマンドでコンパイルします。 make コマンドのオプションに SSL 通信できるように linux-ssl を設定します。

user001@debian:~$ tar zxvf stone-2.3e.tar.gz 
stone-2.3d-2.3.2.7/
stone-2.3d-2.3.2.7/README.en.txt
stone-2.3d-2.3.2.7/README.txt
stone-2.3d-2.3.2.7/stone.c
stone-2.3d-2.3.2.7/Makefile
stone-2.3d-2.3.2.7/GPL.txt
stone-2.3d-2.3.2.7/logmsg.mc
stone-2.3d-2.3.2.7/cryptoapi.c
stone-2.3d-2.3.2.7/stone.spec

user001@debian:~$ cd stone-2.3d-2.3.2.7/

user001@debian:~/stone-2.3d-2.3.2.7$ make linux-ssl
make TARGET=linux ssl_stone LIBS="-ldl"
make[1]: ディレクトリ `/home/user001/stone-2.3d-2.3.2.7' に入ります
make FLAGS="-DUSE_POP -DUSE_SSL " LIBS="-ldl -lssl -lcrypto" linux
make[2]: ディレクトリ `/home/user001/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 -DUSE_POP -DUSE_SSL " LIBS="-lpthread -ldl -lssl -lcrypto" stone
make[3]: ディレクトリ `/home/user001/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 -DUSE_POP -DUSE_SSL  -o stone stone.c -lpthread -ldl -lssl -lcrypto
stone.c: In function ‘strnUser’:
stone.c:4509: error: 不完全型のポインタへの間接参照
stone.c:4524: error: 不完全型のポインタへの間接参照
stone.c:4536: error: 不完全型のポインタへの間接参照
stone.c:4551: error: 不完全型のポインタへの間接参照
stone.c:4557: error: 不完全型のポインタへの間接参照
stone.c: In function ‘openconfig’:
stone.c:8675: 警告: ignoring return value of ‘dup’, declared with attribute warn_unused_result
stone.c: In function ‘initialize’:
stone.c:10125: 警告: ignoring return value of ‘getcwd’, declared with attribute warn_unused_result
stone.c:10142: 警告: ignoring return value of ‘fchown’, declared with attribute warn_unused_result
stone.c:10143: 警告: ignoring return value of ‘fchown’, declared with attribute warn_unused_result
make[3]: *** [stone] エラー 1
make[3]: ディレクトリ `/home/user001/stone-2.3d-2.3.2.7' から出ます
make[2]: *** [linux] エラー 2
make[2]: ディレクトリ `/home/user001/stone-2.3d-2.3.2.7' から出ます
make[1]: *** [ssl_stone] エラー 2
make[1]: ディレクトリ `/home/user001/stone-2.3d-2.3.2.7' から出ます
make: *** [linux-ssl] エラー 2

エラーがでてうまくコンパイルができません。エラー内容から、 Makefile ファイルの変更が必要なことがわかりました。次のように100行目あたりに -D_GNU_SOURCE を追加します。

linux:
	$(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

変更後、再度コンパイルすれば、 stone コマンドが作成されています。ここで SSL 関連のコンパイルエラーが出た場合は、 libcurl4-openssl-dev パッケージをインストールする必要があります。

user001@debian:~/stone-2.3d-2.3.2.7$ make linux-ssl
make TARGET=linux ssl_stone LIBS="-ldl"
make[1]: ディレクトリ `/home/user001/stone-2.3d-2.3.2.7' に入ります
make FLAGS="-DUSE_POP -DUSE_SSL " LIBS="-ldl -lssl -lcrypto" linux
make[2]: ディレクトリ `/home/user001/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]: ディレクトリ `/home/user001/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
<command-line>: 警告: missing whitespace after the macro name
stone.c: In function ‘openconfig’:
stone.c:8675: 警告: ignoring return value of ‘dup’, declared with attribute warn_unused_result
stone.c: In function ‘initialize’:
stone.c:10125: 警告: ignoring return value of ‘getcwd’, declared with attribute warn_unused_result
stone.c:10142: 警告: ignoring return value of ‘fchown’, declared with attribute warn_unused_result
stone.c:10143: 警告: ignoring return value of ‘fchown’, declared with attribute warn_unused_result
make[3]: ディレクトリ `/home/user001/stone-2.3d-2.3.2.7' から出ます
make[2]: ディレクトリ `/home/user001/stone-2.3d-2.3.2.7' から出ます
make[1]: ディレクトリ `/home/user001/stone-2.3d-2.3.2.7' から出ます
user001@debian:~/stone-2.3d-2.3.2.7$ 

作成された stone コマンドは、 /usr/local/bin など PATH が通っているディレクトリに起きます。

Windows については、同じサイトの Windows 用の zip ファイルをダウンロードし、解凍後、
stone.exe を PATH の通っているフォルダに移動します。以上でインストールは、完了です。

SSL 用証明書の作成

stone で暗号化するための証明書を作成します。 stone 実行時にパラメータ設定で証明書と鍵を指定して起動する事ができるのですが、デフォルトで以下の証明書を使用して起動します。

/etc/ssl/certs/stone.pem

作成は、以下のコマンドを実行すればカレントにファイルが作成されます。

openssl req -new -outform pem -out stone.cert -newkey rsa:1024 -keyout stone.key -nodes -rand ./rand.pat -x509 -batch -days 356
cat stone.cert stone.key > stone.pem
cp stone.pem /etc/ssl/certs/

stone の起動と起動用シェル作成

インストールと証明書の作成及び設定が終わると、いよいよ stone を起動します。起動には、どのポートを使い、どのサーバとアクセスするかを起動パラメータとして指定する必要があります。そのため起動前に、通信経路を考える必要があります。これらの設定や起動用シェルの作成についてまとめてみました。

クライアントからサーバへの通信経路を以下のように考えます。

場所 経路
クライアント ssh →ポート 10022 →ポート 1043 ( SSL 暗号化)→ポート 443
サーバ ポート 443 ( SSL 復号化)→ポート 22 → ssh

クライアントで実行する stone コマンドは、次のとおりです。

stone -l localhost:10443/ssl 10022 -- www.hoge.com:443 10443 &

ssh でポート 10022 に接続すると、 stone が接続を受けてデータを暗号化しポート 10433 に流します。ポート 10433 に流れてきたデータを stone が再び受けて www.hoge.com:443 にデータを送ります。

サーバで実行する実行する stone コマンドは、次のとおりです。

stone -l localhost:22 443/ssl &

ポート 443 に流れきたデータを stone が受けて復号化し、ポート 22 に流します。ポート 22 に流れてきたデータは、 ssh サーバが受け取り処理します。

起動時のオプションですが、 -l は、 stone のログを syslog に出力する用にします。

クライアントとサーバでそれぞれstoneを起動し、クライアントで ssh を localhost:10022 に向けて起動します。

ssh localhost -p 10022

接続が確認できれば、デーモン起動用スクリプトを作成し、登録するだけです。起動用のスクリプトファイルを作成してみました。できがよくないのですが、参考までにどうぞ。

それぞれのスクリプトを起動登録します。次の命令を実行すれば、自動で登録してくれます。

update-rc.d stone-client defaults 99

これで再起動時にも自動で stone が起動されます。また /etc/init.d/stone-client start とかやれば、起動できます。

スポンサーリンク







シェアする

  • このエントリーをはてなブックマークに追加

フォローする