harumaki.net

インフラ屋の覚書や、ラーメン食べある記とか。

ポート転送ツール rinetd

   


ポート指定で別の外部ホストへサービスを転送できるツール。
受付ホストと転送先ホストをIPアドレスで指定するところがポイント。
URLをそのままに、ホストだけ変更するような場合に有効。

【本家サイト】

http://www.boutell.com/rinetd/

【ダウンロード元】

  • RPM
    RHEL4版(ソースは共通なのでRHEL3でもインストール可能)
    initスクリプトやlogrotateスクリプト、コンフィグファイルも含まれ
    一通りの環境がセットアップできるので、こちらがお奨め。
    ftp://sea-mew.jp/rpms/el4/i386/rinetd-0.62-5.RHEL4.i386.rpm

【参考】
Linuxサーバhacks

【検証環境】
テスト環境:192.168.0.12(eth0)、192.168.1.13(eth1)
転送先環境:192.168.100.212

1)インストール

1-1)ソース版

  1. ダウンロードと展開

    # wget http://www.boutell.com/rinetd/http/rinetd.tar.gz

    # tar -zxvf rinetd.tar.gz

  2. Makefileの修正
    デフォルトのMakefileではmanページのコピー先が異なるため修正。

    # cd rinetd

    # cp -p Makefile Makefile.org

    # vi Makefile
    [変更箇所]
    8c8
    < install -m 644 rinetd.8 /usr/man/man8 — > install -m 644 rinetd.8 /usr/share/man/man8

  3. インストール

    # make

    # make install
    インストールされるのは実行ファイルとmanページ。
    /usr/sbinにバイナリが、/usr/shareにmanページがコピーされる。

1-2)RPM版

  • インストール

    # cd /usr/src/redhat/RPMS/i386/

    # wget ftp://sea-mew.jp/rpms/el4/i386/rinetd-0.62-5.RHEL4.i386.rpm

    # rpm -ivh rinetd-0.62-5.RHEL4.i386.rpm
    Preparing… ########################################### [100%]
    1:rinetd ########################################### [100%]

    #

  • 構成ファイル
    インストールされるファイルは以下のとおり。
    /etc/logrotate.d/rinetd
    /etc/rc.d/init.d/rinetd
    /etc/rinetd.conf
    /usr/sbin/rinetd
    /usr/share/doc/rinetd-0.62
    /usr/share/doc/rinetd-0.62/CHANGES
    /usr/share/doc/rinetd-0.62/README
    /usr/share/doc/rinetd-0.62/index.html
    /usr/share/man/man8/rinetd.8.gz

2)セットアップ

設定ファイルは/etc/rinetd.confとなるが
ソースではデフォルトでは用意されていない。
以下、RPMでの環境をベースに設定。

  • 設定

    # cd /etc/

    # vi rinetd.conf

  • [設定内容]
    書式は
    [宛先IP] [宛先ポート] [転送先IP] [転送先ポート]
    0.0.0.0 80 192.168.100.212 80
  • ログファイルの設定
    デフォルトは/var/log/rinetd.logとなる。
    ここをコメントアウト。
    logfile /var/log/rinetd.log
  • ログ出力形式の設定
    デフォルトではタブ区切りの独自のログフォーマットだが
    以下の設定を追加すると、apacheのアクセスログと同じ形式のログとなる。
    logcommon

3)動作確認

3-1)デーモン起動

RPMではinitスクリプトが用意されるので
こちらから起動。

# /etc/init.d/rinetd start
rinetd を起動中: [ OK ]

#
同時にログファイルも生成される。

# ll /var/log/rinetd.log

  • rw-r–r– 1 root root 0 3月 14 20:52 /var/log/rinetd.log

3-2)動作確認

ためしにIPアドレス指定でブラウザからログインし、転送が実行されることを試す。

但しブラウザのアドレスバーのURLは変更されず、かつ転送先のサイトでリンク先へ遷移しても
最初にリクエストしたURLが保持されたままページが遷移される。
今回はIPアドレスでテストしたが、サーバのIP変更などでURLの変更が好ましくない場合に有効。

3-3)ログ出力形式

  • デフォルト
    • 書式
      [日時] [リクエスト元] [接続先IP] [ポート] [転送先IP] [転送先ポート] [受信bytes] [転送bytes] [動作結果]
    • 出力結果
      14/Mar/2007:21:05:53 192.168.0.2 192.168.0.12 80 192.168.100.212 80 10060 5769 done-local-closed
      14/Mar/2007:21:05:53 192.168.0.2 192.168.0.12 80 192.168.100.212 80 9665 5534 done-local-closed
  • common形式(logcommonオプション有効)
    apacheのアクセスログと同じ書式。

    • 出力結果
      192.168.0.2 – – [14/Mar/2007:21:08:58 +0900] "GET /rinetd-services/192.168.0.12/80/192.168.100.212/80/done-local-closed HTTP/1.0" 200 34182 – – – 10339
      192.168.0.2 – – [14/Mar/2007:21:08:58 +0900] "GET /rinetd-services/192.168.0.12/80/192.168.100.212/80/done-local-closed HTTP/1.0" 200 4387 – – – 7671

4)そのほかの設定

4-1)chkconfig

chkconfig –addでそのまま自動起動の設定を追加することが可能。

# chkconfig –add rinetd

# chkconfig –level 345 rinetd on

4-2)logrotate

RPMではインストールと同時に
/etc/logrotate.dにスクリプトが配置されるので
そのままローテートまで可能。

# cat /etc/logrotate.d/rinetd
/var/log/rinetd.log {
missingok
notifempty
delaycompress
postrotate
/sbin/service rinetd restart 2> /dev/null > /dev/null || true
endscript
}

5)注意点

サービス起動時のポートの競合

rinetd.confに追加したIPとポートは、実行時にrinetdデーモンがポートを使用(待機)するため
元のサービスを実行するとポートが競合し、起動できなくなる(当たり前だが)。

apacheで複数のグローバルIPをバーチャルホストで使用している場合は
転送するIPアドレスのバーチャルホスト設定を無効化してからapacheとrinetdをそれぞれ起動すること。

ちなみに以下は今回検証した192.168.0.12で
eth1(192.168.1.13)をapacheで通常通りサービスを提供し
eth0(192.168.0.12)をrinetdで転送した際のlsofの結果。

# lsof -i:80
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
httpd 3414 root 3u IPv4 2989054 TCP 192.168.1.13:http (LISTEN)
httpd 3417 apache 3u IPv4 2989054 TCP 192.168.1.13:http (LISTEN)
httpd 3418 apache 3u IPv4 2989054 TCP 192.168.1.13:http (LISTEN)
httpd 3419 apache 3u IPv4 2989054 TCP 192.168.1.13:http (LISTEN)
httpd 3420 apache 3u IPv4 2989054 TCP 192.168.1.13:http (LISTEN)
httpd 3421 apache 3u IPv4 2989054 TCP 192.168.1.13:http (LISTEN)
httpd 3422 apache 3u IPv4 2989054 TCP 192.168.1.13:http (LISTEN)
httpd 3423 apache 3u IPv4 2989054 TCP 192.168.1.13:http (LISTEN)
httpd 3424 apache 3u IPv4 2989054 TCP 192.168.1.13:http (LISTEN)
rinetd 3586 root 4u IPv4 2989529 TCP 192.168.0.12:http (LISTEN)

#

comment








 - bash, GNU/Linux, network