検索



Please click now!!

sshd を別ポートで起動してみる。

新年明けましておめでとうございます。今年も宜しくお願いします。

今年の一発目。FreeBSD ネタですが、sshd を port:22 ではないポートで起動するようにしてみたいと思います。そんなの簡単じゃん。て?そりゃーそーだけどさー。rcNG な起動スクリプトを書くのが難儀なのよ。

port:22 で起動する sshd は /etc/rc.conf に

sshd_enable="YES"

と書けば良いのだけど、これとは別に、例えば port:22022 で sshd を起動したい。どうしてか?と、言えば網内では port:22 で ssh するんだけど、BB ルータの外側から各サーバにダイレクトに ssh したい場合、個々のサーバで sshd を別ポートで起動して、BB ルータ側でポートの転送をしてあげればダイレクトに入れるよねー。って感じですかね。

なんだよー。そんなの IPv6 あればできるじゃん。と思うんですけど、IPv4 の世界しか無い場合は不可能なので・・。

で、ここまでが前置きで、サーバを起動したときに sshd を port:22022 で起動するようにスクリプトを書くわけです。しかし、これがまた大変・・。例えば、sshd だけでなく、httpd を port:8080 で起動するスクリプトはどうするのだ?とか、色々出てきてですねぇ・・。

一応できたスクリプトがこんな感じ。


#!/bin/sh
#
# PROVIDE: sshd-diff-port
# REQUIRE: LOGIN cleanvar
#
# Define these smartd_* variables in one of these files:
# /etc/rc.conf
# /etc/rc.conf.local
#
# DO NOT CHANGE THESE DEFAULT VALUES HERE

port="22022"
sshd_diff_port_enable="${sshd_diff_port_enable-NO}"
sshd_diff_port_pidfile="/var/run/sshd-${port}.pid"

. /etc/rc.subr

name="sshd_diff_port"
rcvar=`set_rcvar`
command="/usr/sbin/sshd"
pidfile=${sshd_diff_port_pidfile}

load_rc_config $name

command_args="-o PidFile=${sshd_diff_port_pidfile} -p ${port}"

run_rc_command "$1"



簡単かぁ?これを書くために jman rc.subr してじっくりと眺めます。後はコマンド、今回の場合は sshd ですが、それのオプションをじっくりと調査します。

で、スクリプト名は sshd_diff_port としました。command_args で sshd のオプションを書きました。/etc/rc.conf.local には以下のように書けば起動できることでしょう。

sshd_diff_port_enable="YES"

良かった良かった。

それにしても rcNG スクリプトを書く上で疑問な点がまだ残っています。

スクリプトを起動してその中から実際のデーモンを起動した場合(firefox みたいなイメージかな) stop ができない。例えば kdm は スクリプトでそれを起動時に呼ぶのだけど、その中では kdm-bin をキックしている。その場合、stop オプションで実行しても kdm が終了しない。pidfile=${kdm_pidfile} を記述しても 以下のメッセージが出力され終了できない。なんで〜(?_?)。ちょっとだけrc.subr 見てみたけど $name とかが絡んでいる? けど、実際のプロセスは kdm ではなく、kdm-bin なのよー。どうすれば kill できるのー?

kdm not running? (check /var/run/kdm.pid).

で、できたスクリプトがこれ。stop は受け付けてくれないので rc スクリプト内で完結するようにした。reload も stop 部分は自前にして start だけ rc.subr に任せた。ダサいなぁ・・。


#!/bin/sh
#
# kdm start
#
# PROVIDE: kdm
# REQUIRE: DAEMON
# BEFORE: LOGIN
# KEYWORD: FreeBSD shutdown

# Define these smartd_* variables in one of these files:
# /etc/rc.conf
# /etc/rc.conf.local
# /etc/rc.conf.d/kdm
#
# DO NOT CHANGE THESE DEFAULT VALUES HERE
#
kdm_enable="${kdm_enable-NO}"
kdm_pidfile="/var/run/kdm.pid"

. /etc/rc.subr

name="kdm"
rcvar=`set_rcvar`

load_rc_config $name

command="/usr/local/kde4/bin/kdm"
pidfile=${kdm_pidfile}

case $1 in
'stop' )
    if [ -f ${pidfile} ] ; then
        kill -TERM `cat ${pidfile}`
        /bin/rm ${pidfile}
    fi
    echo 'Stopping kdm.'
    exit;
    ;;
'restart' )
    if [ -f ${pidfile} ] ; then
        kill -TERM `cat ${pidfile}`
        /bin/rm ${pidfile}
    fi
    echo 'Stopping kdm.'
    ;;
esac

run_rc_command "$1"



httpd を 8080 で起動するスクリプトはもう、書くのもイヤになっちゃった・・。どこかに rc スクリプトのサンプル置き場とか無いかなぁ?

本当に書き方、よく分からないや・・。きっと rc.subr 眺めて書くんでしょうなぁ・・。トホホ・・。

Linux の rc スクリプトも汚いと思っていたけど、最近の FreeBSD の rc スクリプト書くのも、簡単なのは良いのだけど、ちょっと何かやろうとしたら全然書けない・・。トホホ・・。

日時: 2009年01月07日(水) 14:40
このエントリをつぶやく

トラックバック

このエントリーのトラックバックURL:
http://www.running-dog.net/mt333/mt-tb.cgi/110

コメント: sshd を別ポートで起動してみる。

なんか、とある方から教えていただいたのですが、sshd_config の中で Port 行が複数書けるので、port ごとに sshd を起動する必要は無いらしい・・。

一個のデーモンが複数の port を LISTEN してくれる・・。

もっと早く知っていれば・・。orz。

投稿者 たかちゃん。 | 2009年01月07日(水) 17:32

やぁ、久しぶり。
まだ日記続いてたんだぁ。

投稿者 むちむち隊長 | 2009年01月12日(月) 11:26

おぉーー。むちむち隊長っ!!

お久しぶりです。元気でしたか?僕はまだこんなことしているけど、相変わらずバイク乗っていますか?

もっちさんも元気ですか?

なんか懐かしいですー。

投稿者 たかちゃん。 | 2009年01月12日(月) 13:27

コメントを投稿

 
Copyright (c) 1997-2010 takachan@running-dog.net All Rights Reserved.