外部からみえないサーバー上にあるwebページを外から見えるようにする

sshポート転送を利用する

GWサーバ(CGI起動できる)
サーバ1[ch](GWサーバーからみえる、サーバー2からみえる  GWとサーバー1をつなぐ踏み台 兼 サーバー1のポートとLWBのポートが結ばれている)
サーバ2[in](サーバ1からみえ、LWBもみえる サーバー1とLWBをつなぐ踏み台サーバー)
LWBサーバ

以下の2つのポートフォーワードを行う.

イメージとしては、
(0)CGI: GWサーバーのポートの80へのリクエストをGWサーバーの12345ポートへ転送 GWサーバ上でWebリクエストイベント時に実行.
(1)フォーワード[A]:GWサーバー:12345番ポート->サーバー1の23456ポート GWサーバー上で実行:踏み台サーバー1[ch] [キープ]
(2)フォーワード[B]: サーバー1[b]:23456ポート->LWBサーバー:80ポート サーバー1上で実行:踏み台サーバー2[in] [フォーワードAを構築するたびによぶ]

(1)ポート転送してGWサーバからLGWのウェブサーバーにアクセスできるようにする.
GWサーバに以下のようなスクリプトをおく.
(i)GWサーバーの12345ポートにサーバ1の23456ポートを転送
(ii)サーバー1上のauto_ac.sh を起動.

GWサーバー上に設置(web_keep.rb, web_keep.sh これをnohup web_keep.sh で落とさないようにしておく):
やってることは、(1)サーバーAにアクセス.フォワード[A]を構築.login1.shを起動してフォーワード[B]を構築.
        (2) (1)を60秒ごとに繰り返す.
port1.rb (これは使はない webuseの簡易版)

require 'rubygems'
require 'net/ssh'


opt={
        :passphrase => 'password1'

}


opt2={

        :passphrase => 'password2'

}
stdout=""

Net::SSH.start('サーバー1.com','username',opt) do |ssh|
#       ssh.exec!("ls") do |channel,stream,data|

#               stdout << data if stream == :stdout
#       enda
        puts "hello"
        t=Thread.new do
                ssh.forward.local(12345,"localhost",23456)
                puts "Hello2"
        end
        puts "hello2b"
        ssh.exec!("/bin/sh login1.sh") do |chanel, stream,data|
                stdout << data if stream == :stdout
                puts stdout

        end
end

web_keep.rb (落ちないようにする、これを設置しておく)

#!/usr/local/bin/ruby
require 'rubygems'
require 'net/ssh'


opt={
#       :keys => '~/.ssh',
        :passphrase => 'password'

}


opt2={

        :passphrase => 'password2'

}

f=open("error_file.txt","w")
def ssh_tonnel(opt , f)
        stdout=""
        stderr=""
        Net::SSH.start('サーバー1','username',opt) do |ssh|
        #       ssh.exec!("ls") do |channel,stream,data|

        #               stdout << data if stream == :stdout
        #       enda
                puts "hello"
                t=Thread.new do
                        ssh.forward.local(12345,"localhost",23456)
                        f.puts "Hello2"
                end
                puts "hello2b"
               
                ssh.exec!("/bin/sh login1.sh 2>>tmp1a >>tmp1b") do |chanel, stream,data|
                        stdout << data if stream == :stdout

                        stderr << data if stream == :stderr
                        puts stdout

                        f.puts stdout
                        f.puts stderr
                end


        end

        puts stdout
end


ssh_tonnel(opt,f)

while 1==2
        begin

#               ssh_tonnel(opt)

                f.puts("begin")
#
                f.flush
                t2=Thread.new do
                        ssh_tonnel(opt,f)
                end
                sleep(60)
                Thread::kill(t2)

                f.flush
                f.puts(Time.now)

                f.puts("end")

                f.flush
        rescue

                f.puts("error begin")
                f.puts(Time.now)
                f.puts("error end")

                f.flush
#               exit
        end


end

おちても復活できるように。。
web_keep.sh

#!/bin/sh

while test 1 -eq 1
do
./web_keep.rb &
str=$!
echo $str

sleep 60;
kill $str

done


サーバー1に以下のようなスクリプトauto_ac.shをおく(あまりよくないの改良の必要あり)
フォーワードV[LGWサーバー:80番ポート->サーバー1の23456ポート 踏み台サーバー2].
http://tree-tips.appspot.com/mac/ssh_auto_login/ 参考

login1.sh

echo "heelo"
. ./auto_login.sh
auto_ssh

auto_login.sh (実効権限を付与)

#!/bin/sh

auto_ssh() {
host="サーバー2のIP"
id="username"
pass="password"

expect -c "
set timeout 10
spawn ssh -L 23456:LWSのIPアドレス:80 ${id}@${host}
expect \"Are you sure you want to continue connecting (yes/no)?\" {
    send \"yes\n\"
    expect \"${id}@${host}'s password:\"
    send \"${pass}\n\"
} \"${id}@${host}'s password:\" {
    send \"${pass}\n\"
}
interact
"
}

(3)nohup ruby port.rb としておけば,WSサーバからログアウトしても
WS上からlocalhost:12345 でLGWにアクセスできる.

(4)もしかしたら、~/.ssh/config みたいなので接続時間をのばすことが必要.
http://www.maruko2.com/mw/ssh_%E6%8E%A5%E7%B6%9A%E3%82%92%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A2%E3%82%A6%E3%83%88%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
参考に
config

ServerAliveInterval 15

(5)生きていれば,curl http://localhost:12345 とかででてくるはず

                                                                                            • -


CGIの利用
外に変えすCGI
やってること:WBSの80番にきたリクエストをWBSの12345ポート(トンネルでLWSの80番ポートにつながる)
に転送する.

http://takuya-1st.hatenablog.jp/entry/20121121/1353477494
curl等を利用したCGIを作り、そこからアクセス

#!/bin/sh

URL=http://localhost:12345

header=`curl -I $URL | grep Conten`
echo $header
echo ""
curl $URL

?移行で指定したファイルを出力
例えば、WBサーバのIPアドレス/test.cgi?tmp.html
だとtmp.htmlをだすことができる.
test.cgi

#!/bin/sh

request=$REQUEST_URI
request_file=`echo $request | sed "s/.*echo.cgi?//g" `
URL=http://localhost:12345/${request_file}
header=`curl -I $URL | grep Content-Type`
str=`echo "$header" | sed "s/;.*//g"`
echo $str
echo ""
curl $URL

POST対応版:

#!/bin/sh



request=$REQUEST_URI
request_file=`echo $request | sed "s/.*echo.cgi?//g" `

URL=http://localhost:43890/${request_file}
REQUEST=${REQUEST_METHOD}

if test ${REQUEST} = "GET"; then
        header=`curl -I $URL | grep Content-Type`

        #for i in `echo "$header"`;do

        #f123=echo "$header" > tmp4
        #done
        str=`echo "$header" | sed "s/;.*//g"`
        echo $str
        echo ""
        #echo "Content-type: text/html"
        #echo ""
        #echo ""
        #echo ${request}
        #echo ${request_file}
        curl $URL
        #echo $header
        #echo "$str 123"

fi



if test ${REQUEST} = "POST"; then
        #echo "Content-type: test/html"
        #echo ""
        #echo "This is Post"

        header=`curl -I $URL | grep Content-Type`
        str=`echo "$header" | sed "s/;.*//g"`

        echo $str
        echo ""

        read LINE
        curl $URL -X POST -d $LINE
fi

htmlファイル変換スクリプト
.cssにもやる必要あり

#!/bin/sh
filename=$1
basedir=$2

if test $basedir"" = "";
then
        basedir=`pwd`
fi

basedir2=`echo $basedir | sed "s/var.*html\///g" | sed 's/\//\\\\\//g'`

echo $filename
echo $basedir2

sed "s/href=\\\"/href=\\\"echo.cgi?${basedir2}\//g" $filename.html > ${filename}d.html
sed "/http/! s/src=\\\"/src=\\\"echo.cgi?${basedir2}\//g" ${filename}d.html > ${filename}d2.html
sed "s/get(\"/get(\"echo.cgi?${basedir2}\//g" ${filename}d2.html > ${filename}d3.html
sed "s/:url(\"/:url(\"echo.cgi?${basedir2}\//g" ${filename}d3.html > ${filename}_web.html


変換スクリプト改善版

#!/bin/sh
filename="syoku_genjyou9"
basedir="tmp/syoku_list"
basecgidir="\/cgi-bin\/AAAA\/BBBB"
open_dir="cgi-bin\/CCC"
css_dir="base/css"

if test $basedir"" = "";
then
        basedir=`pwd`
fi

basedir2=`echo $basedir | sed "s/var.*html\///g" | sed 's/\//\\\\\//g'`

echo $filename
echo $basedir2

echo  "s/href=\\\"/href=\\\"echo.cgi?${basedir2}\//g"

sed "s/href=\\\"/href=\\\"echo.cgi?${basedir2}\//g" $filename.html > ${filename}d.html
sed "/http/! s/src=\\\"/src=\\\"echo.cgi?${basedir2}\//g" ${filename}d.html > ${filename}d2.html
sed "s/get(\"/get(\"echo.cgi?${basedir2}\//g" ${filename}d2.html > ${filename}d3.html
sed "s/:url(\"/:url(\"echo.cgi?${basedir2}\//g" ${filename}d3.html > ${filename}d4.html


mkdir ${css_dir}/web_css

find base/css -name "*.css" -printf "%f\n" | xargs -n1 -I%  bash -c "sed -e \"s:url(:url(echo.cgi?${base_dir}/${css_dir}/:g\" base/css/% > ${css_dir}/web_css/%"


sed -e "s:${css_dir}:${css_dir}/web_css:g" ${filename}d4.html > ${filename}d5.html
sed "s/cgi-bin/"${open_dir}"\/echo.cgi?cgi-bin/g" ${filename}d5.html > ${filename}_web.html


高機能版
出力前にurlでsedを変換することで事前に変換せずにgrobal化できる.
(trans.sed を環境に合わせてチューニング)

#!/bin/sh



request=$REQUEST_URI
request_file=`echo $request | sed "s/.*echo.cgi?//g" `

URL=http://localhost:43890/${request_file}
REQUEST=${REQUEST_METHOD}

if test ${REQUEST} = "GET"; then
        header=`curl -I $URL | grep Content-Type`

        #for i in `echo "$header"`;do

        #f123=echo "$header" > tmp4
        #done
        str=`echo "$header" | sed "s/;.*//g"`

        #str="Content-type: text/html"
        echo $str
        echo ""
        #echo "Content-type: text/html"
        #echo ""
        #echo ""
        #echo ${request}
        #echo ${request_file}
        #echo "hello"
        if test `echo $header | sed s/.*text.*/a/g` = "a"; then

                test=`curl $URL`
                echo "$test" | ./trans.sed


        else

                curl $URL


        fi
        #echo $test
        #echo $header
        #echo "$str 123"

fi



if test ${REQUEST} = "POST"; then
        #echo "Content-type: test/html"
        #echo ""
        #echo "This is Post"

        header=`curl -I $URL | grep Content-Type`
        str=`echo "$header" | sed "s/;.*//g"`

        echo $str
        echo ""

        read LINE
        curl $URL -X POST -d $LINE
fi


trans.sed

#!/bin/sed -f

#s:test:test2:g
s:href=\":href=\"echo.cgi?tmp/syoku_list/:g

/http/! s:src=\":src=\"echo.cgi?tmp/syoku_list/:g
s:get(\":get(\"echo.cgi?tmp/syoku_list/:g




s:url(\":url(\"echo.cgi?tmp/syoku_list/:g


s:cgi-bin:cgi-bin/AAA/echo.cgi?cgi-bin:g

#Fro flxigrid

s:url(images/:url(echo.cgi?tmp/syoku_list/base/css/images/:g


baを直す必要がある