たれながし.info

とあるITエンジニアの備忘録

CentOSでFTPサーバーを建てた

急遽FTPサーバーを建てる必要があったので、CentOS7&vsftpdで建てた時のメモです。
セキュリティを考慮せず建てたので、あまり参考にはしないでください。

本来なら下記を考慮した方が良いと思います。

  • 最新のOSを使う(CentOSの開発は終了している)
  • FTPではなくFTPSやSFTPを使う
  • FTPを許可するユーザーを明示的に指定する
  • アクセスできるディレクトリを制限する

FTPサーバーの環境

構築環境

構築した環境です。

  • CentOS:7.6
  • vsftpd:3.0.2-29.el7_9

要件

FTPサーバーの要件です。

  • Anonymousの接続は許可しない
  • FTPサーバーにはPassiveで接続する(データのコネクションもクライアントから接続)

FTPサーバーの構築

事前準備

SELinuxは無効にする

# getenforce
Disabled

vsftpdのインストール

# yum -y install vsftpd

vsftpdの設定

# cd /etc/vsftpd
# cp -a vsftpd.conf{,.org}

# vi vsftpd.conf
※以下変更点だけ書きます。

# Anonymousの接続は許可しないに変更
anonymous_enable=YES
→anonymous_enable=NO

# パッシブモード有効化&ポート範囲を追記
# pasv_enableはDefaultっでYESなので書かなくても良いらしい
pasv_enable=YES
pasv_min_port=60100
pasv_max_port=60200

サービス起動

# systemctl start vsftpd
# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
   Active: active (running) since 月 2023-10-30 20:10:05 JST; 7s ago
  Process: 6711 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
 Main PID: 6712 (vsftpd)
   CGroup: /system.slice/vsftpd.service
           mq6712 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Firewalldの設定

21,60100-60200/tcpを許可する

# firewall-cmd --add-service=ftp --permanent
# firewall-cmd --add-port=60100-60200/tcp --permanent
# firewall-cmd --reload

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: ssh dhcpv6-client
  ports: 993/tcp 143/tcp 21/tcp 60100-60200/tcp
  ...

動作確認

無事接続できました。

注意点:Windowsの標準FTPクライアントはPassive接続に対応していない

Windowsに標準インストールされているFTPクライアントはPassive接続に対応していないそうです。
FTPクライアントのオプションやコマンド一覧を確認しても、Passiveで接続するようなものが存在しません。

>where ftp.exe
C:\Windows\System32\ftp.exe
>ftp -h

FTP サーバー サービス (デーモンとも呼ぶ) を実行するコンピューターとの間で、
ファイルの送受信を行います。FTP は対話的に使用できます。

FTP [-v] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-A] [-x:sendbuffer]
    [-r:recvbuffer] [-b:asyncbuffers] [-w:windowsize] [host]

  -v              リモート サーバーの応答を表示しません。
  -n              最初の接続時に自動ログインを行いません。
  -i              複数ファイルの転送中に、対話的なメッセージ表示を
                  無効にします。
  -d              デバッグを有効にします。
  -g              ファイル名のグロビングを無効にします (GLOB コマンドを参照)。
  -s:filename     FTP コマンドを記述したテキスト ファイルを指定します。
                  これらのコマンドは、FTP の開始後に自動実行されます。
  -a              データ接続のバインド時に、いずれかのローカル インターフェイ
                  スを使用します。
  -A              匿名でログインします。
  -x:send sockbuf SO_SNDBUF の既定のサイズである 8192 を上書きします。
  -r:recv sockbuf SO_RCVBUF の既定のサイズである 8192 を上書きします。
  -b:async count  既定の非同期数である 3 を上書きします。
  -w:windowsize   既定の転送バッファー サイズである 65535 を上書きします。
  host            接続先のリモート ホストのホスト名または IP アドレス
                  を指定します。

メモ:
  - mget および mput コマンドには、それぞれ yes/no/quit の意味を表す y/n/q を
    指定します。
  - コマンドを中止するには Ctrl+C キーを押します。
>ftp
ftp> ?
コマンドは省略することができます。コマンド:

!               delete          literal         prompt          send
?               debug           ls              put             status
append          dir             mdelete         pwd             trace
ascii           disconnect      mdir            quit            type
bell            get             mget            quote           user
binary          glob            mkdir           recv            verbose
bye             hash            mls             remotehelp
cd              help            mput            rename
close           lcd             open            rmdir