LinuxにFTPサーバを構築する方法

Linux(cdntos、AlmaLinux、RokeyLinux等)にVsftpを使用して、FTP(File Transfer Protocol)サーバを構築する方法及びFTPクライアントのインストール(Linux・Windows版)と使用する方法を記載

FTP概要

ファイル転送プロトコル(FTP)は、クライアント/サーバー型のファイル転送プロトコルです。FTPサービスのバックエンドに、NFSサーバを設置している場合や、FTPサーバの外部ストレージとしてiSCSIストレージが利用される場合もあります。現在も研究所の論文データのアップロードや商用アプリケーション、OSイメージのリポジトリサーバでは、現役でFTPサービスが利用されています。また、IoTで利用されるエッジ機器などでも、FTPが利用されます。

FTPサーバーは複数のFTPサーバーを起動し、ユーザー単位で利用するFTPサービスを分けることもあります。また、大量のデータをFTPでアップロードすることを想定し、FTPサービスを稼働させる物理サーバの内臓ディスクではなく、バックエンドのストレージ基盤(NFSファイルサーバ)にデータを保管するシステム構成もあります。

FTPサーバー構築図

FTPサーバー構成図
構成図

Linuxでは、FTPサービスを実現するソフトウェアとして有名なのがVsftpです。Vsftpサーバは、クライアントがLinux、Windowsを問わずアクセスが可能で、クライアント側のFTP接続ソフト(WinscpやFFFTP)を使ってファイルの送受信ができます。セキュリティを考慮した設計になっており、Vsftpサービスの暗号化通信にSSL/TLSを使うこともできます。

FTPサーバのインストール

インストール要件

サーバとクライアントは以下のIPアドレスを仮定してインストールします。OSは、RokeyLinuxにインストールします。

IPアドレス
Vsftpサーバ192.168.0.60
クライアント192.168.0.0/24
yum install vsftpd

実行結果

[root@centos ~]# yum install vsftpd
メタデータの期限切れの最終確認: 3:35:55 時間前の 2023年01月23日 07時47分34秒 に実施しました。
依存関係が解決しました。
=====================================================================================================================================================================================
 パッケージ                               アーキテクチャー                         バージョン                                      リポジトリー                                サイズ
=====================================================================================================================================================================================
インストール:
 vsftpd                                   x86_64                                   3.0.3-35.el8                                    appstream                                   180 k

トランザクションの概要
=====================================================================================================================================================================================
インストール  1 パッケージ

ダウンロードサイズの合計: 180 k
インストール後のサイズ: 347 k
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
vsftpd-3.0.3-35.el8.x86_64.rpm                                                                                                                       1.3 MB/s | 180 kB     00:00    
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                                                 323 kB/s | 180 kB     00:00     
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                                                                             1/1 
  インストール中   : vsftpd-3.0.3-35.el8.x86_64                                                                                                                                  1/1 
  scriptletの実行中: vsftpd-3.0.3-35.el8.x86_64                                                                                                                                  1/1 
  検証             : vsftpd-3.0.3-35.el8.x86_64                                                                                                                                  1/1 

インストール済み:
  vsftpd-3.0.3-35.el8.x86_64                                                                                                                                                         

完了しました!
[root@centos ~]# 

FTPサーバの設定

Vsftpの設定ファイルvsftpd.confファイルを編集します。設定ファイルは、「/etc/vsftpd/vsftpd.conf」を修正します。

以下は、デフォルトで有効になっている設定を抜き出しています。

[root@centos vsftpd]# cat /etc/vsftpd/vsftpd.conf | grep -v '^\s*#' #先頭の#(シャープ)行を除去
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES
[root@centos vsftpd]# 

下記の設定になっていない場合は、vsftpd.confファイルを修正する

#匿名でのログインを許可しない設定にする
anonymous_enable=NO

#アスキーモードでの転送を許可する
ascii_upload_enable=YES  (←行頭にある # を削除)
ascii_download_enable=YES (←行頭にある # を削除)

# chroot有効化・chrootリストファイルの指定
chroot_local_user=YES
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/chroot_list

#ディレクトリごと一括転送の許可
ls_recurse_enable=YES

#ローカルタイム指定を最終行に追記
use_localtime=YES
パラメータ意味
anonymous_enable=NO匿名ユーザーでの利用を禁止する
local_enable=YESローカルユーザのログインを許可する
write_enable=YESFTPのwriteコマンドを許可する
local_umask=022ローカルユーザのumask値を022に変更する
anon_upload_enable=NO匿名ユーザでのファイルのアップロードを禁止する
anon_mkdir_write_enable=NO匿名ユーザでのディレクトリの作成を禁止する
dirmessage_enable=YESディレクトリに移動した際にメッセージを表示する
xferlog_enable=YESアップロードやダウンロードのログを記録する
commnect_from_port_20=YES転送接続が20番ポートから発信されていることを確認する
xferlog_std_format=YES標準のftpd xferlog形式のログファイルを作成する
chroot_local_user=YESローカルユーザは、ログイン後にホームディレクトリのchroot() jailに配置される
chroot_list_enable=YESログイン時にホームディレクトリのchroot() jailに配置されるローカルユーザのリストを提供する。
ただし、chroot_local_userがYESに設定されている場合、リストファイルは、chroot() jailに配置されないユーザのリストになる
chroot_list_file=/etc/vsftpd/chroot_listホームディレクトリのchroot() jailに配置されるローカルユーザのリストを含むファイルを指定する。
chroot_local_userがYESに設定されている場合、リストファイルは、chroot() jailに配置されないユーザのリストになる
ls_recurse_enable=YESビルトインされているlsコマンドの-Rオプションを有効にする
listen=NO
listen_ipv6=YES
IPv4とIPv6の両方でリッスンする
pam_service_name=vsftpdvsftpd用PAMサービス名をvsftpdとする
userlist_enable=YESユーザをリストアップしたファイル(userlist_fileで指定)を有効にする
local_root=public_htmlログイン直後の初期ディレクトリをホームディレクトリ内のpublic_htmlにする
use_localtime=YESタイムスタンプの表示をローカルタイムで行う

ユーザの作成

Vsftpサーバにユーザ「roi」を作成します。パスワードは、p@ssw0rdとしています。

useradd -m roi
echo "p@ssw0rd" | passwd roi --stdin

chrootを適用しないユーザリストの作成(上層へのディレクトリ移動を許可するユーザの設定)

Vsftpサーバにログインした際に、chrootをしないユーザのリストを作成します。リストのパスは、vsftpd.confファイルのchroot_list_fileパラメータの記述と矛盾がないようにします。以下の例では一般ユーザの「roi」を登録します。

vi /etc/vsftpd/chroot_list
roi

サービスの起動

Vsftpdサービスを起動します

systemctl restart vsftpd
systemctl is-active vsftpd
systemctl enable vsftpd
[root@centos vsftpd]# systemctl restart vsftpd
[root@centos vsftpd]# systemctl is-active vsftpd
active
[root@centos vsftpd]# systemctl enable vsftpd
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.
[root@centos vsftpd]# 

プロセスを確認します。プロセスが無事起動できていることを確認します。

[rin@centos ~]$ pgrep -a vsftpd
646086 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
[rin@centos ~]$ 

ファイヤーウォールの設定

クライアントからアクセスができるようにファイヤーウォールにVsftpサービスを設定します。

firewall-cmd --zone=public --add-service=ftp --permanent
firewall-cmd --reload

FTPクライアントのインストール(Linux)

FTPクライアントマシンからFTPサーバへ接続するためのクライアントソフトウェアとして、lftpコマンドかftpコマンドを使用します。ここでは、lftpコマンドでFTPサーバへ接続してみます。

yum install lftp

FTPクライアントによる接続

lftpコマンドは、ユーザ名と接続先のFTPサーバを指定します。先ほど、Vsftpサーバ側で作成した一般ユーザ「roi」でFTPサーバ(192.168.0.60)にアクセスする

lftp -u roi 192.168.0.60

ファイルのアップロード

ファイルアップロードする場合は、putコマンドを利用します。また、ファイルがアップロードしたか確認する場合は、lsコマンドを使用します。

lftp roi@192.168.0.60:~> put /tmp/uptest.txt                            
5 bytes transferred
lftp roi@192.168.0.60:~> ls
-rw-r--r--    1 1003     1003            5 Jan 23 06:28 uptest.txt
lftp roi@192.168.0.60:~> 

クライアントマシンに保管されたファイルをVsftpサーバにputコマンドで転送するには、Vsftpサーバ側のvsftpd.confファイル内でlocal_enable=YESの設定が必要です。

ディレクトリ全体のアップロード

クライアントマシンの指定したディレクトリ全体をアップロードします。ディレクトリ以下すべてをアップロードする場合は、「mirror -R」を実行します。lsコマンドで/tmp/testディレクトリ全体がアップロードされていることが確認できます。

lftp roi@192.168.0.60:~> mirror -R /tmp/test
新規: 1 個のファイル、0 個のシンボリックリンク
5 bytes transferred
lftp roi@192.168.0.60:~> ls -R /home/roi
drwxr-xr-x    2 1003     1003           24 Jan 23 06:38 test
-rw-r--r--    1 1003     1003            5 Jan 23 06:28 uptest.txt
lftp roi@192.168.0.60:~> 

ダウンロード

ダウンロードは、getコマンドを使用します。/tmp/uptest.txtをダウンロードします。

lftp roi@192.168.0.60:~> pwd
ftp://roi@192.168.0.60/%2Fhome/roi
lftp roi@192.168.0.60:~> ls
drwxr-xr-x    2 1003     1003           24 Jan 23 06:38 test
-rw-r--r--    1 1003     1003            5 Jan 23 06:28 uptest.txt
lftp roi@192.168.0.60:~> get uptest.txt
5 bytes transferred
lftp roi@192.168.0.60:~> exit
[rin@centos ~]$ 

ftpコマンドから抜ける場合は、exitコマンドを使用します。

FTPクライアントのインストール(Windows)

Windowsクライアントの場合は、WinSCPかFFFTPクライアントが有名です。FFFTPクライアントは、FFFTPクライアントのダウンロードからダウンロードすることができます。WinSCPはFTPプロトコル以外にもSFTPやSCPプロトコルなども使用できるためお勧めです。

ダウンロードした以下のアイコンをダブルクリックで起動します。

ffftp-v5.7-x64.msi

「ffftpセットアップウィザードへようこそ」画面の次へボタンをクリック

ffftpセットアップウィザードへようこそ

「インストール先フォルダー」画面の次へのボタンをクリック

インストール先フォルダー画面

「ffftpのインストール準備完了」のインストールボタンをクリック

ffftpのインストール準備完了

「セットアップウィザードが完了しました」が表示されれば、インストール完了です。

セットアップウィザードが完了しました

初期設定

デスクトップにある下記のアイコンダブルクリックで起動します。

FFFTPアイコン

ホスト一覧画面の新規ホストボタンをクリック

FFFTPホスト一覧

ホストの設定画面で、接続先の「ホストの設定名」、「ホスト名(アドレス)」、「ユーザー名」、「パスワード」を入力しOKボタンをクリックします。

FFFTPホストの設定

使用方法

登録された接続先を選択し接続ボタンをクリックします。

ホスト一覧

FFFTPメインからファイルを右クリックすることでダウンロードすることもできますし、ファイルをドラッグ&ドロップすることでアップロードすることもできます。

FFFTPメイン画面