「FTP? 簡単でしょ!」
とか思っていたら、何も知らなくて対応に2-3日持っていかれたので、自分が勉強したことをまとめるための記事。
結論
- FTPはパッシブモードでアクセスする
- 制御コネクションとデータコネクションの2種のポートを開ける必要がある
FTPとは
正式名称:File Transfer Protocol
ファイルを転送するためのプロトコル。
制御コネクションのポートと、データコネクションのポートの2つ用意する必要がある。
ポートが異なるので、FWのポートを開けるのを失敗していると、
「FTPサーバに接続ができるが、ユーザでログインができない」
ということが発生する。
lsができない、cdができないで大混乱しました…。
制御コネクションは21番ポートで良いが、データ転送コネクションのポートで何番を開ければよいかわからず、私は苦戦しました。
アクティブモードとパッシブモード
今回の記事のメイン。
種類 | 特徴 |
---|---|
アクティブモード | サーバーからクライアントにランダムポートで接続する。クライアントが1024番以降の全ポートを空けないといけない。 |
パッシブモード | クライアントからサーバーにランダムポートで接続する。サーバがクライアントに接続してよいポートを教える |
FTPには「Active Mode」(PORTモード)と「Passive Mode」(PASVモード)の2つのモードがある。
基本的には、パッシブモードで接続すべき。
アクティブモード
アクティブモードは、データコネクションをサーバからクライアントに対して接続開始する。
この仕様で、クライアント側のファイアウォールが受け付けてないポートを指定されることがある。
パッシブモード
パッシブモードは、データコネクションをクライアントからサーバに対して接続開始する。
その際に、サーバ側が使用してよいポートを指定する。
これを知らずに、FTPサーバを適当に立てると全く動かない。
DockerでのFTPサーバの立て方は別の記事で。
クライアント側からアクセス開始するので、ポートが問題でアクセスできないということがない。
その他
以降は、自分がまたFTPについて調べるときのためのメモ。
派生プロトコル
FTPは平文でやり取りを行うため、セキュアではない。
セキュアではないので、「FTPS」「SFTP」「TFTP」等の派生プロトコルが生まれている。
いろいろあるが、それぞれ使用するポートが違うようだ。
なので、深く調べても実践で使えないと考えている。
よく使うSFTPだけ記載。
※ 有効なプロトコルがあれば、教えて欲しい。
SFTP
- 正式名称
- SSH File Transfer Protocol
- ポート
- 22
どのサーバでもデフォルトで入っている(はずの)コマンド。
少なくとも、Macには入っていた。
SSHの22番ポートを使用するので、基本的にこのポートは空いているはず。
(FWで踏み台からしかアクセスできない、等はあるでしょうが)
ブラウザでFTPディレクトリ確認
確認だけであれば、FTPサーバはクライアントアプリが無くてもブラウザで接続できる。
FTPのURLの構文はRFC 1738で定義されている。
ftp://[user[:password]@]host[:port]/
デフォルトでは、ファイアウォールを簡単に通過するために、パッシブモードを使用するらしい。
ブラウザの補足
Google Chrome 88でFTPクライアント機能は使えなくなるみたいですね。
確かに、調べてみるまでブラウザでFTPクライアントの代わりに使おうと思ってませんでした…。
弊社だと不要にFileZillaとかのFTPクライアントを入れて、アップデートしないと削除依頼が出ることがあるので、そういうの入れなくて便利!だと思っていたのですが…。
残念。
情報をくれたさっぴー(@sapi_kawahara)さん感謝です
補足
— さっぴー川原🍶 #技術書典 #技書博 サークル名:ブライトシステム (@sapi_kawahara) 2020年9月21日
Google Chrome 88でFTPが完全廃止の予定です。https://t.co/rinU3sxsWB
弊社でのFTPコマンドの扱い
弊社では、ファイル転送で個人情報を盗まれる可能性を加味して、FTPに限らずコマンドでのファイル転送はNGとしている。
安全にファイル転送を行うため、下記の機能を持ったシステムを提供している。
※ 転職したらこういう機能欲しいと思うので備忘録。
- ポートを固定
- 転送元/転送先ディレクトリを固定
- 正規表現で転送するファイル名を指定
- 転送履歴を取得できる
- 転送失敗時の再送機能付き
FTPコマンドを準備する
FTPはセキュアじゃないので、デフォルトのインストール対象から外れました。
SFTPはデフォルトで用意されています。
yumでinstall
yum install -y ftp
yumで削除
yum remove ftp
intellijでftp
ローカルにインストールしなくても、FTPできるようになります。
メインで使用しているIDE使えば、FTPするだけのクライアントアプリ入れなくていいのは嬉しいです。
終わりに
基本的に誰かがサクっと作っちゃうから、なかなか覚える機会が無いですね。
この記事を書いていて、自分が誤った認識をしていることも気づけました。
理解した後だとわかりますが、不要な知識だと捨て去ると地味につらいですね…。
捨て去った知識がいっぱいあるので、素振りできるようにいっぱい勉強したいです。
もしこの記事が役に立ったのであれば、はてぶ、Twitterでの記事の拡散、twitterのフォローもよろしくお願いします。
私の励みになります。
参考資料
類似記事
FTPサーバをDockerで建てる nainaistar.hatenablog.com