UBUNTUでvsftpdの設定むずかし!エラーでまくり。LIST 425だのSSLだのポートだのを乗り越えて。

ubuntu上でvsftpdの設定に苦労したのでメモ。
けっこう情報が少ないんだよな。「LIST 425」のエラーだの「SSL」だの「ルーターのポート」だのを乗り越えてやっとできた。
なかなかFTP設定がうまくいかない、全然できない、という人の役に立てばサイコー。
ちなみにvsftpdは、 very secure の略だそうです。「VS」っていうと「対決」みたいな意味合いかと思っていました…対決するとしたらクラッカーとかとですかね。名付け親にはその意味もあるのかも。
まあとにもかくにも、では、行ってみようか。

OSのバージョン
設定した現在のUBUNTUのバージョンです。

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.5 LTS
Release: 22.04
Codename: jammy

vsftpdのインストール

# apt install vsftpd

起動の確認

# systemctl start vsftpd

サービスの自動起動を登録しよう

# systemctl enable vsftpd

その確認

# systemctl is-enabled vsftpd
「enabled」とでればOK

バージョン

# vsftpd -v
vsftpd: version 3.0.5

現時点で最新だ。
もし古いvsftpdがあったりしたら、アップグレードか再インストールしてもいいかもね。俺は再インストールした。一応設定のバックアップは取ってから。

# apt upgrade
# apt update

再インストールしたければ以下。

# apt remove vsftpd
# apt install vsftpd

FTP用のユーザーを作ろう
既存のユーザーを使いたいっていうならスルーしてもOK。とにかくこの解説では「ftp-taro」というユーザーを使うので、追加。

# adduser ftp-taro

FTP用のフォルダを準備しよう
ユーザーディレクトリに「ftp」というディレクトリを作成、権限設定。

# mkdir /home/ftp-taro/ftp
# chown ftp-taro:ftp-taro /home/ftp-taro/ftp
# chmod 755 /home/ftp-taro/ftp

ここにアクセスさせる。ユーザーディレクトリへダイレクトにアクセスさせるのも、メールディレクトリとかもあるし、ちょっとねえ。ってことでFTP専用のディレクトリを作りましたが、個人の自由ですので、ここは必須ではないです。

vsftpdの設定フォルダの中に、以下のディレクトリがあるか確認する。なければ作っておこう。

/etc/vsftpd/chroot_list/
なければ、
mkdir /etc/vsftpd/chroot_list

/etc/vsftpd/user_conf/
中身はログインしていいユーザー名のファイルを作っておく。今回は「ftp-taro」のファイルを作る。そんでさらに

/etc/vsftpd/user_conf/ftp-taro
の中身はっていうと、ftp-taroがアクセスするルートフォルダを指定するのだ。
local_root=/home/ftp-taro/ftp
この設定がされていれば、このディレクトリより上にいったり、別のユーザーのフォルダを覗かれたりと徘徊されなくてすむ。絶対にやっておこう。

以下のファイルがあるかも確認です。なければ作っておこう。
/etc/vsftpd/user_list
中身はログインしていいユーザー名だけを改行区切りで連ねる。今回は1人なので独りぼっち「ftp-taro」だけ。

ftp-taro

とだけ書いて保存してOK。増やしたいときは

ftp-taro
ftp-jiro
ftp-saburo

となっていくわけだね。

SSL証明書を作る

元からあればそいつを使ってもよいか。でもvsftpd用に作り直してもいいかもね。

「/etc/ssl/private」のところはどこでもOK。都合のいいディレクトリに変えてよし。
「-days 365」のところは有効期限。更新するのがめんどいなら、長くしておいてもいいか。俺は10年分の3650にしておいた。
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem

このコマンドを叩くと、国や地域の質問が上がってくるので、JPとかTOKYOとか適当に記入していく。空欄でもOK。
opensslがないよ、となったら apt install opensslでインストール。でもこれだと最新じゃない場合があるとかで、最新にしたいって場合はこちらのページを参照。俺はあんま気にしてない…
https://note.com/onaonakinkin/n/n3fb818027d2b

ちなみに発行したSSLの中身を確認したいときには以下のコマンド。

# openssl x509 -text -noout -in /etc/ssl/private/vsftpd.pem
※このコマンドちとやべえかも?これを行ったあとにFTPクライアントからアクセスできなくなったっぽい??関係ないといいが…現在検証中。

サーバーのポートを開ける

# ufw allow 20/tcp
# ufw allow 21/tcp
# ufw allow 990/tcp
# ufw allow 9990:10000/tcp

※「9990:10000」というのは「9990から10000までのポート使います」という意味で、他のポートと被らなければ「30000:40000」とか自由に設定してOKです。
自宅サーバーとかだと、設定したレンジのルーターのポートを手動で開けていかないといけないので、あんまり広いとめんどいかと思うので、例として「9990:10000」にしてあります。
念のため確認しておこう。

# ufw status

ルーターのポートを開ける
自社、自宅のサーバーとかなら、ルーターのポートも開けておいてください。
例に挙げたとおりなら、

20、21、990、9990~10000

の14個かな。
俺はルーターのポート開けていないのが原因でずっとつながらなかった…ここ大事だね。

これで下準備は終わった。
けっこうやらないといけないこと多いね。
では設定を始めるかな。

こっからvsftpdの設定

設定はだいたい、4つに分けられるかな。俺はそうだった。

・基本的な設定
・PASSIVE パッシブ
・CHROOT
・SSL

[設定=YES]みたいな形式で、イコールの両脇にスペースはいれちゃダメ。

設定の一覧はこちらを参照
https://manpages.ubuntu.com/manpages/focal/ja/man5/vsftpd.conf.5.html
https://manpages.ubuntu.com/manpages/jammy/man5/vsftpd.conf.5.html

基本的な設定

#YES に設定した場合、スタンドアロンモードで起動する。これはinetdなどのスーパーサーバから起動してはいけないということを意味する。というわけでYES
listen=YES

#IPv4ソケットの代わりに IPv6ソケットを待ち受ける点を除けば、listenオプションと同じである。このオプションと listenオプションは、どちらか一方しか指定することができない。というわけでNO
listen_ipv6=NO

#anonymousログインを許可するかどうかを制御する。YES にした場合、ユーザー名 ftp とanonymous の両方を anonoymous ログインとして認識する。anonymousログインはさせないので、NO
anonymous_enable=NO

#ローカルユーザのログインを許可するかどうかを制御する。YESに設定した場合、/etc/passwd にある普通のユーザアカウントをログインに使う。というわけでYES
local_enable=YES

#ファイルシステムを変更するようなすべてのFTPコマンドを許可するかどうかを制御する。YESじゃないとなんもできないのでYES
write_enable=YES

#ローカルユーザが生成したファイルのumask値。デフォルトでいいか。
#注意! 8進数で指定したければ、先頭の"0" を忘れないように。そうしないと、指定した値は10進数の値として扱われてしまう。
local_umask=022

#YESに設定した場合、FTPサーバ上のユーザが新たなディレクトリに初めて入ったときに、メッセージを見せることができる。ディレクトリに .message というファイルを置いて、メッセージを書いとけばいいようだ。
dirmessage_enable=YES

#有効にした場合、ディレクトリリストの表示にローカルのタイムゾーンを使用する。外国とやりとりするわけじゃないならYESだね。
use_localtime=YES

#PORTでのデータ接続において、サーバが(送信元)ポートに 20(ftp-data) を使うかどうか制御する。セキュリティ上の理由から、いくつかのクライアントはポート20を要求する。逆に言えば、このオプションを無効にすることで、わずかではあるが vsftpdをより少ない特権で動作させることができる。
connect_from_port_20=YES

#日本語ファイル名を使えるようにするならYES
utf8_filesystem=YES

#YES に設定した場合、FTPのすべての要求と応答を記録し、xferlog_std_formatオプションを無効にする。デバッグに便利である。設定段階ならデバッグは命。とりあえずYES。
log_ftp_protocol=YES

#YES に設定した場合、デフォルトで /var/log/xferlog と /var/log/vsftpd.log という二つのログファイルを同時に生成する。 前者は wu-ftpd形式の転送ログで、標準的なツールによって解析することができる。 後者は vsftpd 独自形式のログである。もうログとかは常に出しておこうということでYES
dual_log_enable=YES

#有効にした場合、ログファイルにはアップロードとダウンロードの詳細が記録される。デフォルトでは、ログファイルは /var/log/vsftpd.log として置かれるが、 vsftpd_log_fileの設定によって変更することが可能である。ということなので、詳細にログに記載してもらいましょう。YES。
xferlog_enable=YES

#有効にした場合、wu-ftpdで使われているような標準的な xferlogフォーマットで 転送ログファイルを作成する。 既存の統計情報を生成するプログラムを再利用できるので、これは便利である。しかしデフォルトの書式は、より読み易いものである。この形式のログファイルのデフォルトの場所は/var/log/xferlogであるが、xferlog_fileの設定によって、これを変更することが可能である。ということなのだが、log_ftp_protocolでYESに設定していると無効になるそうなので、まあNOとしとこうか。
xferlog_std_format=NO

#制御接続において、FTPコマンドが何もない場合にタイムアウトと見なすまでの秒数。タイムアウトが発生した場合、リモートクライアントは蹴り出される。デフォルトが300だそうなので、一応600として、10分にしておいた。
idle_session_timeout=600

#YESに設定した場合、アップロード時のASCIIモードでのデータ転送を許可する。ということなのでYES。ASCIIってのは簡単に言えばテキストファイル。ASCIIモードでのアップロードでは改行コードが書き換えられることがあったので注意。
ascii_upload_enable=YES

#YESに設定した場合、ダウンロード時のASCIIモードでのデータ転送を許可する。ということなのでYES。ASCIIモードでのダウンロードでは改行コードが書き換えられることがあったので注意。
ascii_download_enable=YES

#サーバに接続したときに表示するテキストを格納するファイル名を指定する。このオプションが設定された場合、 ftpd_banner で指定される文字列よりも優先される。というわけで、デフォルトのまま。好きに変えてもいいかもね。
ftpd_banner=Welcome to blah FTP service.

#隠しファイル(.htaccessなど)を表示させる
force_dot_files=YES

↓ちなみに俺俺設定でいろいろ試してみたが、コメントアウトしてある設定

#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
#deny_email_enable=YES
#banned_email_file=/etc/vsftpd.banned_emails
#local_root=/mnt/ftp
#xferlog_file=/var/log/vsftpd.log
#data_connection_timeout=120
#nopriv_user=ftpsecure
#async_abor_enable=YES
#cmds_denied=OPTS

必要そうなのがあれば調べてみてね。

PASSIVE パッシブ
FTPでは新しい方の接続方式。接続方式にはアクティブとパッシブがあるのだが、アクティブは昔の接続方法。パッシブは新しい方法、とだけ覚えておけばよいか。いや、パッシブの方は理解しておいた方がいいな。パッシブは、ログインは通常のポートで行うが、ファイルの転送はランダムなポートで行って、追跡されにくくする方法、と、簡単に言ってしまえばこんな感じだ。なので、SSLを使うのは安全のためにももはや前提なので、

・990番ポートでログインを行い
・ファイル転送は指定したレンジ(幅)内でのポートを使用する(例:9990~10000 みたいな感じ)

なので、自宅サーバーなんかで運用するときには、ルーターのポート(990番と、例:9990番~10000番)を開けないといけないぞ。あんまりレンジが広いと、自宅のルーターを開ける手作業は大変なので、9990番~10000番とかの11個くらいが限度かな。あとは君の頑張り次第だ。普通どんくらいレンジをあければいいのか、理想はわからないので、気になるのであれば自分で調べてくれ。

FTPクライアント(FTPを使ってファイルをやり取りしようとするパソコン側のことね)のソフトでも通信方法の設定ができると思う。「デフォルト」だとパッシブが可能ならばパッシブで、ダメだったらアクティブで、と試してくれるだろうけれども、パッシブでしか接続しません、と明示的に接続するなら「パッシブ」を設定してもいいだろうね。俺としては勝手にやってくれる「デフォルト」でいいと思います。
というわけで設定は以下。

#NO に設定した場合、データ接続の開始において PASV を許可しない。 パッシブを許可しますので、YES
pasv_enable=YES

#PASVでのデータ接続に割り当てるポートの最小値。ファイアウォールで指定するポートの範囲を狭めるのに使用できる。というわけで例として「9990」を設定。任意でOK。
pasv_min_port=9990

#PASVでのデータ接続に割り当てるポートの最大値。ファイアウォールで指定するポートの範囲を狭めるのに使用できる。というわけで例として「10000」を設定。任意でOK。
pasv_max_port=10000

↓ちなみに俺俺設定でいろいろ試してみたが、コメントアウトしてある設定

#pasv_address=000.000.000.000

CHROOT
主に権限関係、と各ユーザーのログイン先とか。

#YES に設定した場合、ローカルユーザは(デフォルトで)ログイン後に ホームディレクトリへと chroot() される。
#警告: このオプションはセキュリティに密接に関連する。ユーザがアップロード権限を持っていたり、シェルでのアクセスができる場合は特にである。何をしているかを理解している場合にのみ有効にすること。これらのセキュリティの問題はvsftpdに特有の問題ではないことに注意してほしい。ローカルユーザを chroot() jailに入れることができるすべての FTP デーモンにおいて、この問題がある。
chroot_local_user=YES

#ホームディレクトリ内の choot() jail に入れられる ローカルユーザのリストを示すファイル名を指定する。このオプションは、chroot_list_enableが有効な場合にのみ意味を持つ。もしchroot_local_user が有効であれば、このリストは chroot() jail に入れられ*ない* ユーザのリストになる。
chroot_list_file=/etc/vsftpd/chroot_list

#ユーザーディレクトリ直下にアップロード可能にするかどうか。NOの方が好ましいが、俺の場合は管理者用のユーザーでは許可したいので、YES。
allow_writeable_chroot=YES

#いかなる設定オプションもユーザーごとに上書きすることができる。user_config_dirで /etc/vsftpd_userr_confのユーザ名ファイルにある設定が適用される。
#すべての設定がユーザーごとに効果があるわけではないことに注意してほしい。例えば、多くの設定はユーザーのセッションが開始される前に使用される。設定例の中で、ユーザーごとの動作に影響しないものには、listen_address,banner_file,max_per_ip,max_clients,xferlog_fileなどが含まれる。
user_config_dir=/etc/vsftpd/user_conf

#有効にした場合、 userlist_fileで指定したファイルをユーザ名のリストとして読み込む。とのことなのでYES。
userlist_enable=YES

#userlist_enableが有効な場合にのみ意味を持つ。NOにした場合、userlist_fileで指定したファイルに明示的にリストされたユーザ以外はログインが拒否される。ログインを拒否する場合、ユーザにパスワードを尋ねる前に拒否をする。とのことなのでNO。
userlist_deny=NO

#ファイル名を指定する。任意のファイル名でOK。ここでは「user_list」とした。
userlist_file=/etc/vsftpd/user_list

SSL
セキュリティ。暗号化は必須なので、絶対にやろう。TLSで行う。

#YESにすると、vsftpdはセキュアなSSL経由の接続をする。なのでYES。
ssl_enable=YES

#SSL v2を許可します。TLS v1.2 以降の接続が推奨されます。なのでこれは使わずTLSにするのでNO。
ssl_sslv2=NO

#SSL v3を許可します。TLS v1.2 以降の接続が推奨されます。なのでこれは使わずTLSにするのでNO。
ssl_sslv3=NO

#TLSを許可します。TLS v1.2 以降の接続が推奨されます。TLS1.2を使いたいところなのだが、、俺の環境ではTLS1しか使えないようだ。「500 OOPS: unrecognised variable in config file: ssl_tlsv1_2」と出てきてしまう。なのでYES。ssl_tlsv1_2かssl_tlsv1_3が使えればそっちをYESにしよう。
ssl_tlsv1=YES

#YESに設定すると、匿名ユーザーは安全な SSL 接続の使用が許可されます。匿名ユーザーはもともと利用自体を許可しないようにしているが、念のためYESかな。
allow_anon_ssl=YES

#YESの場合、すべての非匿名ログインはデータ送受信にSSL接続を必須とする。なのでYES。
force_local_data_ssl=YES

#YESの場合、すべての非匿名ログインはパスワードを送信するには、SSL接続を必須とする。なのでYES。
force_local_logins_ssl=YES

#SSLセッション再利用をするかどうかを決める。なのでできればYESだが、クライアント側で接続できない環境もあるようなので、NO。様子見でYESにしたい。
require_ssl_reuse=NO

#SSL暗号化に使用するRSA証明書の場所を指定。準備のときに作った認証ファイルだね。
rsa_cert_file=/etc/ssl/private/vsftpd.pem

#SSL暗号化に使用するRSA秘密鍵の場所を指定。このオプションが設定されていない場合、秘密鍵は証明書と同じファイルが使用されるとか。だが念のため明示的に準備で作ったファイルと同じものを指定しとく。
rsa_private_key_file=/etc/ssl/private/vsftpd.pem

↓ちなみに俺俺設定でいろいろ試してみたが、コメントアウトしてある設定

#ssl_tlsv1_2=YES
#implicit_ssl=YES
#listen_port=990
#ssl_ciphers=HIGH
#debug_ssl=YES
#ssl_ciphers=kEECDH+AESGCM+AES128:kEECDH+AESGCM:kEECDH+AES128:kEECDH+AES:!aNULL:!eNULL:!LOW:!EXP

設定完了

設定を書き込んだら、再起動する。

# service restart vsftpd

確認してみる。

# vsftpd

とコマンドすると、エラー部分があれば表示してくれるのだ。便利~、、と言っても、どこがどうエラーとかの詳しくは教えてくれないのだが、大いにヒントにはなる。

余談だが、FTPが通り、成功していても、オレオレ環境だと以下のように表示されてしまうのだが、問題なく動いてくれている。
500 OOPS: could not bind listening IPv4 socket
なので、500エラーが出ても、あんま気にしなくてもいいかも。ダメ?

とにかく設定はすべて終わった。パソコンから接続を試してみよう。
FTPソフトはFilezillaを使うことをお勧めします。(俺がFilezillaしか試してないから)
設定例は以下。

・プロトコル「FTP - ファイル転送プロトコル」
・ホスト 「192.168.1.x」 とか、「webteq.site」 って感じ。
・暗号化 「明示的なFTP over TLSが必要」
・ログオンタイプ 「通常」
・ユーザー 「ftp-taro」 自分で設定したユーザー
・パスワード 「xxxxx」 そのパスワード
・転送設定 「デフォルト」もしくは「パッシブ」

ではいざ、接続してみよう…………
どうだい?接続できたかい?
はっきり言っておく、一発で通じたんなら、それは奇跡。大抵はうまくいかないでしょう。接続できないときの確認方法も記しておこう。

ログを見る
なにかヒントが書かれているかもしれない。

# tail -n 20 /var/log/vsftpd.log
# tail -n 20 /var/log/syslog
# tail -n 20 /var/log/ufw.log

Filezillaのログパネルにもエラー内容が出ているはず。

※俺がもっとも躓いたエラーは
425 Can't open data connection.
つまり
「ログインはできた、けどそのあとリストが取得できないので、切断」
的なもので、ルーターのポートが空いてなかったのが原因だった。さらに詳しく言えば、
「990ポートでのログインはできていた。だが、そのあとパッシブの接続ができないのだよ」
という意味であることにようやく気が付いて、ルーターのポートを開けたら成功した。
エラー文が全部を教えてくれるわけではない。解読することで大きなヒントになる。エラー文をしっかりと解読して、設定した内容を把握することが大事だ。
最初は面倒くさがってエラー文も特に解読していなかった。パッシブの意味もわかっていなかった。繰り返し同じような設定を書き換えては、1ミリも進まなかった。次の日、頭がすっきりしたところで設定の一つ一つを調べていった。パッシブについてはずっと名前はしっていたが意味がわかっていなかった。意味がわかったところで、エラー文を読み解いていくと、パッシブのところで躓いていることに気が付けた。あとから考えると簡単なことなのだが、渦中にいるとどうしても余裕をもって考えることができなくなってしまう。そういうときは一旦離れて、眠り、体力も回復したところで、一から面倒なことに取り組んでみるのも近道だと思う。

とにかく根気を持って取り組めば、きっとできる。頑張ってくれ。

追記:
突然、クライアントからログイン自体できなくなってしまっていた…変えたことと言えば、単に
allow_anon_ssl=YES
をNOにしたりYESにしたりしただけだったのだが、その後、なにかの拍子にログインできなくなっていた。
ログを見ても特にヒントになりそうなものはなかったので、一旦サーバー自体を再起動した。するとログインできるようになっていた。むう、、なにが原因だったのかわからない。だが、困ったときは再起動。これが鉄則であることには違いないようだ。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA