DeleGate 9.9.0のインストールと設定

XenServerでサーバ仮想化+DeleGateでグローバルIPひとつを使い回す - yuhei.kagaya
XenServerのインストールと仮想マシンの作成 - yuhei.kagaya
の続きで、DeleGateを使ってLAN内部のサーバを公開する。

  • DeleGateを通してLAN内部のサーバにSSHで行けるようにする。
  • DeleGateのリバースプロキシ機能によって、HTTP(80)、HTTPS(443)を別サーバ・複数ドメインで外部公開する。

ソースをもってきてコンパイル

DeleGateの現在の最終バージョン9.9.0をインストールした。

コンパイルするときに以下はとくにanonymous-FTPを必要なかったのでやらなかった。

vi src/Makefile

(*a) anonymous-FTP アクセス時などに、アクセス者名として使われるアドレスを、
      以下のように定義して下さい。

#ADMIN = undef
ADMIN = hoge@hoge.jp
cd /usr/local/src
wget ftp://ftp.delegate.org/pub/DeleGate/delegate9.9.0.tar.gz

tar xzvf tar xzvf delegate9.9.0.tar.gz
cd delegate9.9.0/src
make

...

make[1]: Entering directory `/usr/local/src/delegate9.9.0/src'
/usr/local/src/delegate9.9.0/mkmake.exe +r -ckconf Makefile.chk Makefile.tst DELEGATE_CONF "ar" "undef" ""
        ckconf:
        ADMIN = 'undef'
        get ADMIN value interactively ...
!!!!!!!!!!!!!!!!!!!! WARNING !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!   You should have defined ADMIN as:                      !
!     ADMIN = mail-address-of-the-DeleGate-administrator   !
!   either in DELEGATE_CONF or in the Makefile.      !
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Enter your E-mail address [root@hoge.jp]: root@hoge.jp

コレで、src/deletaged ができた。

次に、インストール。

/usr/local/delegate にインストールして、
/usr/local/delegate/var 配下にキャッシュやログなどを置くことにした。

mkdir -p /usr/local/delegate/bin
mkdir -p /usr/local/delegate/conf/conf.d
mkdir -p /usr/local/delegate/var/cache
mv /usr/local/src/delegate9.9.0/src/delegated /usr/local/delegate/bin/

/usr/sbin/groupadd delegate
/usr/sbin/adduser -g delegate -d /usr/local/delegate/var -s /bin/false delegate

chown -R delegate.delegate /usr/local/delegate/var

起動スクリプトの作成

こちらを参考にさせていただき、起動スクリプト /etc/init.d/delegate を作成。
delegate設定

vi /etc/init.d/delegate
#!/bin/sh
#
# chkconfig: 35 90 10
# description: Delegated, multi-purpose application level gateway
# processname: delegated
#
# This file was automatically customized by debmake on Mon, 1 Dec 1997 17:23:23 +0900
#
# Written by Miquel van Smoorenburg <miquels@drinkel.ow.org>.
# Modified for Debian GNU/Linux by Ian Murdock <imurdock@gnu.ai.mit.edu>.
# Modified for Debian by Christoph Lameter <clameter@debian.org> 


DAEMON=/usr/local/delegate/bin/delegated

DGROOT=/usr/local/delegate/var
SITECONF=/usr/local/delegate/conf/site.conf
CONFDIR=/usr/local/delegate/conf/conf.d
OWNER=delegate/delegate



if [ ! -x $DAEMON ];
then
    echo "$DAEMON does not exist."
    exit 0
fi


if [ ! -r $SITECONF ];
then
    echo "$SITECONF does not exist."
    exit 0
fi


if [ ! -d $CONFDIR ];
then
    echo "$CONFDIR does not exist."
    exit 0
fi

for p in $CONFDIR/*:[0-9]*.conf
do
    if [ ! -f $p ];
    then
        echo "[addr:port].conf does not exist."
        exit 0
    fi
done


options="DGROOT=$DGROOT OWNER=$OWNER"

case "$1" in
    start)
        if [ "$2" = "" ];
        then
            for p in $CONFDIR/*:[0-9]*.conf
            do
                addrport=`basename $p .conf`
                $DAEMON -P$addrport $options +=$SITECONF +=$p
            done
        else
            if [ -f $CONFDIR/$2.conf ];
            then
                $DAEMON -P$2 $options +=$SITECONF +=$CONFDIR/$2.conf
            else
                echo "no configuration for address:port $2 found."
                exit 1
            fi
        fi
    ;;
   
   
    stop)
        if [ "$2" = "" ];
        then
            for p in $CONFDIR/*:[0-9]*.conf
            do
                addrport=`basename $p .conf`
                $DAEMON -Fkill -P$addrport $options +=$SITECONF
            done
        else
            $DAEMON -Fkill -P$2 $options +=$SITECONF
        fi
    ;;
   
    restart|reload)
        if [ "$2" = "" ];
        then
            for p in $CONFDIR/*:[0-9]*.conf
            do
                addrport=`basename $p .conf`
                $DAEMON -r -P$addrport $options +=$SITECONF +=$p
            done
        else
            if [ -f $CONFDIR/$2.conf ];
            then
                $DAEMON -r -P$2 +=$SITECONF $options +=$CONFDIR/$2.conf
            else
                echo "no configuration for address:port $2 found."
                exit 1
            fi
        fi
    ;;
   
   
    *)
         echo "Usage: /etc/init.d/delegate {start|stop|restart|reload} [addr:port]"
         exit 1
    ;;
   
esac

exit 0
chmod 770 /etc/init.d/delegate


こちらのページを参考にさせていただき、CONFDIR=/usr/local/delegate/conf/conf.d に置いたファイル名が、待ち受けアドレス:ポートを表し、ファイル内容で詳細を記述する形式にした。

設定ファイル例:/usr/local/delegate/conf/conf.d/192.168.11.2:11022.conf
※DeleGateの動作するサーバのIPアドレス192.168.11.2のポート番号11022で動作させる設定ファイル

自動起動の設定

cd /etc/init.d/
/sbin/chkconfig delegated on
/sbin/chkconfig --list delegated
delegated       0:off   1:off   2:on    3:on    4:on    5:on    6:of

DeleGate全体の設定 site.conf

vi /usr/local/delegate/conf/site.conf


CRON="0 3 * * * -expire 7"
ADMIN="hoge@hoge.jp"

LANのなかのサーバに外部ネットワークからSSHを中継するDeleGateの設定

XenServerでサーバ仮想化+DeleGateでグローバルIPひとつを使い回す - yuhei.kagayaのvm11(192.168.11.)に、
ポート番号11022に接続してSSHで行けるようにする。

vi /usr/local/delegate/conf/conf.d/192.168.11.2:11022.conf


RELIABLE="*"
SERVER="tcprelay://192.168.11.11:22/"
TIMEOUT=con:10800,io:10800,login:10800

ファイヤーウォールあけとく。

iptables -I RH-Firewall-1-INPUT 21 -p tcp -m state --state NEW -m tcp --dport 11022 -j ACCEPT
/etc/init.d/iptables save
/etc/init.d/iptables restart


この設定のDeleGateを起動、停止、再起動

/etc/init.d/delegate start 192.168.11.2:11022
/etc/init.d/delegate stop 192.168.11.2:11022
/etc/init.d/delegate restart 192.168.11.2:11022

DeleGateのリバースプロキシ機能を使ってLANのなかのサーバを公開する設定

XenServerでサーバ仮想化+DeleGateでグローバルIPひとつを使い回す - yuhei.kagayaの全体図のように
外部ネットワークから

  • http://dev31.hoge.jpのリクエストがきた場合にvm31へ
  • http://dev32.hoge.jpのリクエストがきた場合にvm32へ

と、リクエストをマウントしてDeleGateから代理リクエストしてクライアントへ返す。

vi /usr/local/delegate/conf/conf.d/192.168.11.2:80.conf


SERVER=http
URICONV=""

### vm31
HOSTLIST="vm31-virtualhost:dev31.hoge.jp"
MOUNT="/* http://192.168.11.31/* nvhost=vm31-virtualhost,nvserv=-thru"
REACHABLE="192.168.11.31"

### vm32
HOSTLIST="vm32-virtualhost:dev32.hoge.jp,aiueo.hoge.jp,kakikukeko.hoge.jp"
HOSTLIST="vm33-virtualhost:+,test.hoge.jp"
MOUNT="/* http://192.168.11.32/* nvhost=vm32-virtualhost,nvserv=-thru"
REACHABLE="192.168.11.32"


RELIABLE="*"
LOGFILE=""
PROTOLOG="${LOGDIR}/${PORT}/[date+%d].${PROTO}"
CONNECT="direct:*:*"

URICONVを設定しないと、クライアントに返すHTMLドキュメント中のURIが/に書き換えられてしまう。cssやimageタグ、aタグのsrcにhttp://〜から指定しても/から書き換えられてしまう。
なので、わざとURICONVの設定を効かないようにする。


http://www.delegate.org/delegate/Manual.htm#HOSTLISTはカンマで区切ることにより複数のホストに一つの名前をつけておける。
名前をつけたホストのリストはnvhostで指定できる。また、「+,」から始めれば同リストにホストを追加できる。
上の場合、

  • dev32.hoge.jp
  • aiueo.hoge.jp
  • kakikukeko.hoge.jp
  • test.hoge.jp

で来たリクエストをマウントして192.168.11.32に代理リクエストするようになる。


Mountオプションの「nvhost=domain,nvserv=-thru」を使うことで、ドメインで来たリクエストをそのまま対象のサーバにドメイン名でリクエストすることができる。なので、対象サーバ(上の例だと192.168.11.31や192.168.11.32)のApacheではVirtualHostをきる設定が使える。




こちらのサイトを参考にさせていただきました。
DeleGate Home Page (www.delegate.org)
delegate設定
猫ぐらし: DeleGate(9.1.1)インストール&設定
Delegateのインストール
delegate のインストール
DeleGate version 9.9 リファレンスマニュアル の日本語訳
DeleGate 設定例
DeleGate‚ðŽg‚Á‚ÄLAN“à•”‚̃T[ƒo‚ðŒöŠJ‚·‚é•û–@