人気ブログランキング | 話題のタグを見る
(Linux)NAT内でFTPサーバ立ち上げるにはアドレス変換が必要
CentOS で vsftpd を使ったFTPサーバを構築してます。
今までは CTU(NTT西日本光プレミアムの加入者網終端装置。つまりはルータ) の 21 ポートを制御用コネクションと開放し、直下のLANにあるサーバにマッピングしてました。

もちろんサーバ機はプライベートアドレスしか持っておらず、CTUの静的アドレス変換機能を使って外部からFTP接続を仕様としているので、当然 PASV モードでの運用となります。

で、/etc/vsftpd/vsftpd.conf には下記のように PASV に関する設定を追加して運用してました。

pasv_promiscuous=YES パッシブモードを利用にする
pasv_min_port=4000 ←↓パッシブモード利用時のポート範囲
pasv_max_port=4029 ※firewall、ルーターのポートマッピングにあわせる


で、今回(Linux)CentOSでちょっとトリッキーなNATルータを構築してみたで書いた他所サーバ機(192.168.1.2)にもFTPサーバの機能を持たせて、インターネット側からアクセスできるようにする必要が生じました。

上記にあるような設定にしたんですが、どうも外部から接続できません。(制御用ポートは21がすでに使ってるのでかなり別のポート番号を使ってます。)
ログインはできてるっぽいんですが、ファイルリスト取得中にタイムアウトしてしまいます。
この時ffftpのログを見てると、アクセスしようとしているIPがローカルのIPアドレス(ここのネットワークAにあたる部分)を示してました。

で、調べてみると PASV で待ち受けているアドレスがなぜかローカルのアドレスを送ってるっぽいですね。
上記のCTU直LAN(ネットワークA)上のFTPサーバは21ポートを制御用として使っているため、気が利く CTU が PASV 待ち受けアドレスをグローバルアドレスに変換してくれているようです。
(多分21ポートならという条件で勝手にアドレス変換してるんでしょうね。。)

解決策としては、PASV 待ち受けアドレスとしてグローバルアドレスをクライアントに送ってあげなければなりません。
その機能が vsftpd にも入っているようです。

vsftpd.conf に下記のように設定すればいいようですね。

pasv_promiscuous=YES パッシブモードを利用にする
pasv_min_port=4000 ←↓パッシブモード利用時のポート範囲
pasv_max_port=4029 ※firewall、ルーターのポートマッピングにあわせる

pasv_addr_resolve=yes pasv_addressで名前解決を有効にするかどうか。yesならpasv_addressでDDNS名が使える。
pasv_address=jehu.example.com ルータ側のアドレスもしくは、DDNS名

pasv_addr_resolveが有効だと、pasv_address の設定でダイナミックDNS名を指定してるとIPに直してくれるようです。
pasv_addressにグローバルIPを設定します。ただ、個人サーバは固定IP持ってない時は pasv_addr_resolve を有効にすることでDDNS名も指定できるようですね。


FTPの仕様と PASV に関する話は、パソコンおやじ:FTPサーバの公開で非常によくまとめられています。FTPサーバ構築当初は非常にお世話になったページです。


参考までに vsftpd でFTPサーバ構築時によく指定してる設定もあげときます。

(設定ファイル /etc/vsftpd/vsftpd.conf)
anonymous_enable=NO anonymousユーザ拒否

chroot_list_enable=YES アクセスディレクトリの制限を有効に。
chroot_list_file=/etc/vsftpd/chroot_list ホームディレクトリ以外へのアクセス拒否させるユーザファイル指定
↑のファイルにアクセス拒否をするユーザーを1行ずつ書く。

local_umask=002 パーミッションマスク。775のパーミッションになる
002だと所有者、所有グループは77,その他は5になる

use_localtime=YES JST使用のため追加



■ユーザーのアクセス制限
・ファイル:/etc/vsftpd/ftpusers
ここに操作させたくないユーザ名を記述します。
passwordの認証時に不正なログインとして失敗に終わります。

・ファイル:/etc/vsftpd.user_list
vsftpd.conf に userlist_deny=NO の記述がない、又は userlist_deny=YES と指定した場合は拒否リスト。(デフォルト)
vsftpd.conf に userlist_deny=NO があると接続許可リスト。


vsftpdの設定の詳細は、パソコンおやじ:FTPサーバ(vsftpd)の構築(RedHat系編)が参考になります。


参考:
パソコンおやじ:NATルータ環境でのPASVモード対応
FTPサーバー構築(vsftpd)
by jehoshaphat | 2010-02-23 02:50 | ネットワーク


<< (Linux)ポートを開いてい... (WindowsServer)... >>