こんにちは、フルスタックエンジニアのryuです。
今回の記事では、ftpについて解説します。ftpとは、ファイル転送を行うプロトコルです。
linuxにvsftpdをインストールしてftpサーバーを構築してみましょう。ftpの仕組みなども分かりやすく解説します。
ポート番号の使い分けやアクティブモードとパッシブモードの違い、SFTPとの使い分けまで紹介します。実際にファイル転送を行い、ftpについて理解を深めましょう。
【linux】ftpとは?¶
ftpとは何なのか、どうやって構築するのかと疑問に思ったことはありませんか。
今回の記事では、ftpの概要からftpサーバーの構築方法まで解説します。前半で仕組みを理解して、後半で実際にLinuxへftpサーバーを構築する流れです。
読み終わるころには、自分の環境でファイル転送を試せるようになりますよ。ぜひ手を動かしながら読み進めてみてください。
ftpサーバーとはファイル転送を行うプロトコル¶
まず、ftpサーバーの概要について解説します。
ftpサーバーとはファイル転送のプロトコルです。
ftpはFile Transfer Protocolの略です。その名の通り、ネットワーク越しにファイルを送受信するために作られました。
代表的な使い道は、Webサーバーへのコンテンツのアップロードです。Webサーバーにftpを導入して、HTMLなどのWebコンテンツを転送します。
レンタルサーバーでホームページを公開するときに、FTPソフトを使った経験のある方も多いのではないでしょうか。あの裏側で動いているのが、まさにftpというプロトコルです。
しかし、ftpにはセキュリティ面で脆弱性があります。SSHと合わせたSFTPもあるので覚えておきましょう。
SFTPとの違いについては、記事の後半で表を使って詳しく整理します。まずはftpそのものを理解していきましょう。
vsftpdとはLinuxで定番のftpサーバーソフト¶
今回インストールするvsftpdについても、先に紹介しておきます。
vsftpdはVery Secure FTP Daemonの略で、名前の通りセキュリティを重視して開発されたftpサーバーソフトです。DebianやUbuntu、Red Hat系といった主要なディストリビューションで、パッケージとして提供されています。
最新の安定版は、2021年にリリースされた3.0.5です。長年大きな変更が無く、枯れて安定したソフトウェアと言えます。
Linuxでftpサーバーを立てるなら、まずvsftpdを選んでおけば間違いありません。それだけ実績のあるソフトウェアです。
ftpの仕組みについて¶
ここからは、ftpの仕組みについて解説します。構築の前に仕組みを知っておくと、設定項目の意味がすっと頭に入ってきますよ。
ftpは、2つのコネクションを用いてファイル転送を行います。データコネクションとコントロールコネクションの2本を使い分けているのが、ftpの大きな特徴です。
データコネクションとは、データを転送するためのコネクションです。コントロールコネクションは、ユーザー認証やファイルの転送方法を制御するためのコネクションです。
データコネクションはtcp/20番ポート、コントロールコネクションはtcp/21番ポートを使用します。それぞれのポート番号が違うので覚えておきましょう。
2つのコネクションの役割を、表に整理します。
| コネクション | ポート番号 | 役割 |
|---|---|---|
| コントロールコネクション | tcp/21 | ログイン認証やコマンドのやり取り |
| データコネクション | tcp/20(アクティブモード時) | ファイルそのものの転送 |
図にすると、次のようなイメージです。

命令のやり取りと実際のファイル転送で、通り道が分かれているわけですね。実際にftpを構築してみると仕組みも良く分かると思います。
アクティブモードとパッシブモードの違い¶
ftpの仕組みでもう1つ重要なのが、アクティブモードとパッシブモードです。データコネクションの張り方に、2つの方式があります。
アクティブモードでは、サーバー側からクライアントに向かってデータコネクションを接続します。一方のパッシブモードでは、クライアント側からサーバーへ接続します。
違いを表にまとめると、次のようになります。
| 比較項目 | アクティブモード | パッシブモード |
|---|---|---|
| データコネクションを張る向き | サーバーからクライアントへ | クライアントからサーバーへ |
| データ転送に使うサーバー側ポート | tcp/20 | サーバーが指定した任意のポート |
| ファイアウォールとの相性 | クライアント側で遮断されやすい | 比較的通信しやすい |
なぜ2つのモードがあるのか、不思議に思いますよね。理由は、アクティブモードだとクライアント側のファイアウォールに通信を遮断されやすいからです。
サーバー側から接続しに来る通信は、クライアントのファイアウォールから見ると外部からの侵入と区別がつきません。そこで、クライアント側から接続を始めるパッシブモードが生まれました。
現在の多くのftpクライアントは、パッシブモードを標準として動作します。接続がうまくいかないときは、どちらのモードで通信しているかを疑ってみてください。
Linuxにftpサーバーを構築してみる¶
では、Linuxにvsftpdをインストールして、ftpサーバーを構築してみましょう。
手元にLinux環境が無い方は、先に環境を用意してください。VirtualBoxでLinuxをインストールする手順や、WSLでLinuxを最速で構築する方法で環境構築のやり方を解説しています。
vsftpdのインストール¶
まず、vsftpdというパッケージのインストールを行います。コマンドは以下の通りです。
apt-get install vsftpd
これはDebianやUbuntuで使われるapt系のコマンドです。Red Hat系のディストリビューションを使っている方は、dnf install vsftpd でインストールできます。
パッケージのインストールが完了するまで、1分程度待ちましょう。

このようにインストールの処理が進めば大丈夫です。エラーが出る場合は、管理者権限で実行できているかを確認してみてください。
設定ファイルの編集¶
次に設定ファイルの編集を行います。DebianやUbuntuの場合、設定ファイルは /etc/vsftpd.conf にあります。
vi /etc/vsftpd.conf と入力して、設定ファイルを開きましょう。viの操作に不安がある方は、viコマンドの使い方を先に読んでおくとスムーズです。
そして、以下の設定値を設定します。
anonymous_enable=NO
ascii_upload_enable=YES (←行頭にある # を削除)
ascii_download_enable=YES (←行頭にある # を削除)
行頭の # はコメントアウトの印です。この記号を削除すると、その行の設定が有効になります。
主な設定項目の意味を、表で確認しておきましょう。
| 設定項目 | 意味 |
|---|---|
| anonymous_enable | 匿名ユーザーのログインを許可するか |
| ascii_upload_enable | ASCIIモードでのアップロードを許可するか |
| ascii_download_enable | ASCIIモードでのダウンロードを許可するか |
| local_enable | Linuxのローカルユーザーによるログインを許可するか |
| write_enable | ファイルの書き込みやアップロードを許可するか |
| chroot_local_user | ユーザーの移動範囲をホームディレクトリ内に制限するか |
anonymous_enable=NO は、誰でも入れる匿名ログインを禁止する設定です。セキュリティの基本になるので、必ずNOになっているかを確認しましょう。
なお、Red Hat系では設定ファイルの場所が /etc/vsftpd/vsftpd.conf になります。パスが少し違うだけで、設定できる内容は同じです。
vsftpdの再起動と自動起動の設定¶
設定が完了したら、vsftpdを再起動します。
service vsftpd restart
systemdを採用している最近のディストリビューションでは、systemctl restart vsftpd でも再起動できます。サーバーの起動時にvsftpdを自動で立ち上げたい場合は、systemctl enable vsftpd も実行しておきましょう。
再起動を忘れると、編集した設定が反映されません。設定ファイルを変更したら再起動する、という流れをセットで覚えてください。
ファイアウォールの設定も忘れずに¶
ファイアウォールが有効な環境では、ftpの通信を許可する必要があります。ここを忘れると、設定が正しくても接続できないので注意してください。
ufwを使っている場合は ufw allow 21/tcp を実行します。firewalldを使っている場合は、firewall-cmd --add-service=ftp --permanent のあとに firewall-cmd --reload で設定を反映させましょう。
これで設定が完了です。あとは、クライアントからftpで接続できれば完了です。
クライアントからftpサーバーに接続してみよう¶
サーバーの準備ができたら、クライアントから接続できるかを確認してみましょう。実際にファイルを転送してみると、ftpの理解が一気に深まりますよ。
Linuxのクライアントから接続する場合は、ftpコマンドを使います。接続からファイル転送までの流れは、次のようになります。
$ ftp 192.168.1.10
Connected to 192.168.1.10.
220 (vsFTPd 3.0.5)
Name (192.168.1.10:user): user
331 Please specify the password.
Password:
230 Login successful.
ftp> put test.txt
ftp> bye
220 (vsFTPd 3.0.5) のような応答が返ってくれば、サーバーへの到達は成功しています。ユーザー名とパスワードを入力して、230 Login successful. と表示されればログイン完了です。
ログイン後は、put でアップロード、get でダウンロードができます。接続を終了するときは bye と入力してください。
ちなみに、ftpの応答に付いている数字は応答コードと呼ばれるものです。2で始まれば成功、5で始まれば失敗というように、状態を数字で伝えています。
WindowsからGUIで操作したい方には、WinSCPが定番です。ftpクライアントはこちらからダウンロードすることができます。
WinSCPならドラッグアンドドロップでファイルを転送できるので、初心者の方でも直感的に操作できます。うまく接続できないときは、パッシブモードの設定やファイアウォールを見直してみましょう。
ftpのセキュリティとSFTP・FTPSとの違い¶
ftpサーバーを構築できたところで、セキュリティの話にも触れておきます。実務では避けて通れない、とても大切なポイントです。
ftpは通信内容が暗号化されない平文のプロトコルです。ユーザー名もパスワードもそのままネットワークを流れるため、途中で盗聴されると認証情報が漏れてしまいます。
そこで現在は、暗号化に対応した方式を使うのが一般的になっています。代表的なのがSFTPとFTPSです。
それぞれの違いを表で整理します。
| 方式 | 暗号化 | 主なポート番号 | 特徴 |
|---|---|---|---|
| FTP | なし(平文) | tcp/20、tcp/21 | 仕組みがシンプルで学習に向く |
| FTPS | あり(TLS) | tcp/21など | 既存のftpをTLSで暗号化した方式 |
| SFTP | あり(SSH) | tcp/22 | SSHの仕組みを使ってファイル転送する |
| SCP | あり(SSH) | tcp/22 | コマンド1つでファイルをコピーできる |
SFTPはftpの改良版と思われがちですが、実はSSHをベースにした別物のプロトコルです。使うポートも22番の1つだけなので、ファイアウォールの管理も楽になります。
また、ファイル転送をするSCPというコマンドもあるので併せて覚えておきましょう。SCPについては、scpコマンドでファイルを送信する方法の記事で解説しています。
では、平文のftpを学ぶ意味は無いのでしょうか。決してそんなことはありません。
ftpの2つのコネクションやモードの考え方は、ネットワークとファイアウォールを理解する良い教材になります。社内の閉じたネットワークなど、今でもftpが現役で使われている場面もあります。
学習用としてftpを構築しつつ、実運用ではSFTPやFTPSを選ぶ、と覚えておけば安心です。
ftpでよくある疑問¶
最後に、ftpについて初心者の方からよく聞かれる疑問に答えていきます。気になるところだけ読んでいただいても大丈夫ですよ。
ポート20番と21番はどう使い分けられている?¶
20番と21番の役割は、混同しやすいポイントです。21番がコントロールコネクション、20番がデータコネクションで使われます。
ログインやコマンドのやり取りは常に21番を通り、ファイルの中身は20番側を流れるイメージです。ただし、パッシブモードのデータ転送では20番ではなく任意のポートが使われる点に注意してください。
この2つのポート番号は、LPICの試験でも頻出です。コマンドを実際に打ちながら覚えたい方は、LPICのコマンドを実機で勉強する方法も参考にしてください。
vsftpdに接続できないときは何を確認すればいい?¶
設定したのに接続できないと、焦ってしまいますよね。確認するポイントは大きく3つです。
1つ目はvsftpdが起動しているかどうかで、systemctl status vsftpd で確認できます。2つ目はファイアウォールで、21番ポートの通信が許可されているかを見直しましょう。
3つ目は設定ファイルの記述ミスです。スペルミスや余計な空白が無いか、編集した行を1つずつ確認してみてください。
ログを調べるのも有効な手段です。ログの仕組みから理解したい方は、syslogの設定方法の記事が参考になります。
匿名ログイン(anonymous)とは何?¶
設定ファイルに出てきたanonymousとは何なのか、気になった方もいるはずです。これは、ユーザー登録なしで誰でもftpサーバーに入れる匿名ログインの仕組みを指します。
かつては、ソフトウェアの配布サイトなどで匿名ftpが広く使われていました。しかし、誰でもアクセスできる状態は危険なので、自分で立てるサーバーでは anonymous_enable=NO にしておくのが鉄則です。
ログインしたユーザーにホームディレクトリの外を見せない方法は?¶
ftpでログインしたユーザーが、サーバー内を自由に移動できるのは少し怖いですよね。そんなときはchrootという仕組みを使います。
vsftpd.confで chroot_local_user=YES を設定すると、ユーザーはホームディレクトリより上の階層へ移動できなくなります。ホームディレクトリに書き込み権限がある場合は、allow_writeable_chroot=YES もあわせて設定してください。
複数人で使うftpサーバーでは、chrootの設定が定番です。セキュリティを一段高めたいときに思い出してみてください。
ftpとは?まとめ¶
今回の記事では、ftpについて解説しました。
ftpサーバーとはファイル転送を行うプロトコルで、データコネクションとコントロールコネクションの2つを使うのが特徴でしたね。Linuxならvsftpdをインストールするだけで、手軽にftpサーバーを構築できます。
構築の流れは、インストール、設定ファイルの編集、再起動、ファイアウォールの許可という4ステップでした。通信が平文である点には注意して、実運用ではSFTPやFTPSを検討しましょう。
ftpは基礎的なプロトコルなので覚えておきましょう。ポート番号やモードの違いは、資格試験でも実務でも必ず役に立ちます。
サーバー構築の練習をもっと積みたい方は、NTPサーバーの設定方法にも挑戦してみてください。構築の経験を重ねるほど、Linuxへの理解は深まっていきますよ。
このようなインフラに関連する技術を当ブログで紹介しているので興味のある方は是非ご覧ください。Linux入門講座一覧やネットワーク入門講座一覧、AWS入門講座一覧で体系的に学習できます。
さらにlinuxについて勉強したい方はこちらの参考書がオススメです。

![[試して理解]Linuxのしくみ ~実験と図解で学ぶOSとハードウェアの基礎知識](https://m.media-amazon.com/images/I/51CPvtuv+wL._SL500_.jpg)