[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [+]

IP Filter で FTP サーバを公開する

IP Filter を使って、内部のサーバを外部から見えるようにするには、 WWW サーバや DNS サーバなどの場合なら、単一のポートだけを rdr を使って 見えるようにすれば実現できます。
(詳しくは
こちら をご覧ください。)
しかし、FTP サーバの場合、passive mode では 21/tcp 以外のポートも フォワードする必要があります。必要になりそうなポートすべてを全部フォワード すれば実現できるかもしれませんが、とっても面倒臭そうです。
実は最近知ったのですが、bimap というもので、静的 NAT の設定を行うことが できます。以下は、内部にある FTP サーバを公開するための方法です。

目次


1. 環境

OS は FreeBSD-4.5R です。
IP Filter のバージョンは、OS についてくる 3.4.20 です。(ipf -V で確認。)

2. 前準備

インストール方法などは、
こちらをご覧ください。

3. 設定方法

静的 NAT の設定自体は、ipnat の設定ファイルに以下を追加するだけです。

bimap ifname ipmask -> ipmask

ifname および ipmask はそれぞれ、外部のインタフェース、 アドレスを表します。
例えば、内部のプライベートアドレスが 192.168.1.17 で、公開したい グローバルアドレスが 1.2.3.4, そのインタフェースが ed0 の場合、以下の ように設定します。

  bimap ed0 192.168.1.17/32 -> 1.2.3.4/32

ただし、これを有効にした時点で外から丸見えになってしまいます。
# あるいは、フィルタの穴を開けてあげないと外から見えません。
そこで、必要なポートだけを公開するようにします。
FreeBSD-4.5R の ftpd は、passive mode の場合、デフォルトでは 49152 から 65535 のポートを使用します。ですので、以下のようにして、21/tcp と 49152〜65535/tcp を許可してやります。

  pass in quick on ed0 proto tcp from any to 192.168.1.17 port = 21 keep state
  pass in quick on ed0 proto tcp from any to 192.168.1.17 port >= 49152 keep state

もちろん、上記以外は block しておいた方がいいです。
# 53/udp など開けておいた方がいいポートもあります。
もし、49152〜65535 の間で、公開するとまずいポートがある場合は、sysctl で net.inet.ip.portrange.hifirst か hilast を変更すれば、範囲を変更 できる…と思います。(すみませんやったことがありません。)

4. 動作確認

外部のマシンから FTP サーバに対して、passive mode でアクセスしてみます。

  bash-2.05a$ ftp -p 1.2.3.4
  Connected to 1.2.3.4.
  220 ftp.usupi.org. FTP server (Version 6.00LS) ready.
  Name (ftp.usupi.org.:usu): ftp
  331 Guest login ok, send your email address as password.
  Password:
  230 Guest login ok, access restrictions apply.
  Remote system type is UNIX.
  Using binary mode to transfer files.
  ftp> dir
  150 Opening ASCII mode data connection for '/bin/ls'.
  total 6
  dr-xr-xr-x  2 0  operator  512 Feb 27  2002 bin
  dr-xr-xr-x  2 0  operator  512 Feb 27  2002 etc
  drwxrwxr-x  2 0  operator  512 Feb 27  2002 pub
  226 Transfer complete.

ちゃんと dir コマンドで一覧が得られています。
次に、公開していないポートが許可されていないことを確認します。 例えば、telnet コマンドで 80/tcp にアクセスしてみます。

  bash-2.05a$ telnet 1.2.3.4 80
  Trying 1.2.3.4...
  ^C

TCP セッションが確立できないことが、確認できました。
念のため、ログを確認しておきます。(日付等は省略)

  ipmon[48]: 01:24:24.666435 ed0 @0:22 b 9.8.7.6,12345 -> 1.2.3.4,80 PR tcp len 20 48 -S IN
  ...

念のため、他のポートも同様に許可していないことを確認しておきましょう。

5. おまけ

-l オプションつきで ftpd を起動するようにしておくと(たぶんデフォルトで そうなっていると思います)、syslog にログインした記録が残ります。
/etc/syslog.conf に以下を追加し、syslogd に SIGHUP シグナルを送れば、 ログが残るようになります。

  ftp.*           /var/log/ftp.log

ただし、上記の場合、/var/log/ftp.log というファイルをあらかじめ作って おく必要があります。
例えば、/var/log/ftp.log に、以下のように記録されます。(日付等は省略)

  ftpd[9123]: connection from router.usupi.org (xxxx)
  ftpd[9123]: ANONYMOUS FTP LOGIN FROM router.usupi.org, usu@usupi.org

また、messages などと同様に、自動的にログを切替えるには、newsyslog の 設定をしておく必要があります。例えば、/etc/newsyslog.conf に以下を追加 します。

  /var/log/ftp.log        644  7    *   168  Z

Powered by Apache PostgreSQL Usupi Logo Kuri Logo
[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [-]
usu@usupi.org Last modified : Tue Feb 11 01:55:58 2003