3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(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)