きり丸の技術日記

技術検証したり、資格等をここに残していきます。

【FTP】FTPを自分なりに整理する(特にActive ModeとPassive Mode)

「FTP? 簡単でしょ!」

とか思っていたら、何も知らなくて対応に2-3日持っていかれたので、自分が勉強したことをまとめるための記事。

結論


  • FTPはパッシブモードでアクセスする
  • 制御コネクションとデータコネクションの2種のポートを開ける必要がある

FTPとは


正式名称:File Transfer Protocol

ファイルを転送するためのプロトコル。

制御コネクションのポートと、データコネクションのポートの2つ用意する必要がある。

ポートが異なるので、FWのポートを開けるのを失敗していると、
「FTPサーバに接続ができるが、ユーザでログインができない」
ということが発生する。

lsができない、cdができないで大混乱しました…。

制御コネクションは21番ポートで良いが、データ転送コネクションのポートで何番を開ければよいかわからず、私は苦戦しました。

アクティブモードとパッシブモード


今回の記事のメイン。

種類 特徴
アクティブモード サーバーからクライアントにランダムポートで接続する。クライアントが1024番以降の全ポートを空けないといけない。
パッシブモード クライアントからサーバーにランダムポートで接続する。サーバがクライアントに接続してよいポートを教える

FTPには「Active Mode」(PORTモード)と「Passive Mode」(PASVモード)の2つのモードがある。
基本的には、パッシブモードで接続すべき。

アクティブモード


アクティブモードは、データコネクションをサーバからクライアントに対して接続開始する。

f:id:nainaistar:20200913222221p:plain
理想的なActiveMode

この仕様で、クライアント側のファイアウォールが受け付けてないポートを指定されることがある。

f:id:nainaistar:20200913222248p:plain
良く引っかかるActiveMode

パッシブモード


パッシブモードは、データコネクションをクライアントからサーバに対して接続開始する。

その際に、サーバ側が使用してよいポートを指定する。
これを知らずに、FTPサーバを適当に立てると全く動かない。
DockerでのFTPサーバの立て方は別の記事で。

クライアント側からアクセス開始するので、ポートが問題でアクセスできないということがない。

f:id:nainaistar:20200913222849p:plain
PassiveMode

その他


以降は、自分がまた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クライアントを入れて、アップデートしないと削除依頼が出ることがあるので、そういうの入れなくて便利!だと思っていたのですが…。
残念。

pc.watch.impress.co.jp

情報をくれたさっぴー(@sapi_kawahara)さん感謝です

弊社でのFTPコマンドの扱い


弊社では、ファイル転送で個人情報を盗まれる可能性を加味して、FTPに限らずコマンドでのファイル転送はNGとしている。

安全にファイル転送を行うため、下記の機能を持ったシステムを提供している。
※ 転職したらこういう機能欲しいと思うので備忘録。

  • ポートを固定
  • 転送元/転送先ディレクトリを固定
  • 正規表現で転送するファイル名を指定
  • 転送履歴を取得できる
  • 転送失敗時の再送機能付き

FTPコマンドを準備する


FTPはセキュアじゃないので、デフォルトのインストール対象から外れました。
SFTPはデフォルトで用意されています。

yumでinstall


yum install -y ftp

yumで削除


yum remove ftp

intellijでftp


ローカルにインストールしなくても、FTPできるようになります。
メインで使用しているIDE使えば、FTPするだけのクライアントアプリ入れなくていいのは嬉しいです。

f:id:nainaistar:20200913222411p:plain f:id:nainaistar:20200913222429p:plain f:id:nainaistar:20200913222439p:plain

終わりに


基本的に誰かがサクっと作っちゃうから、なかなか覚える機会が無いですね。

この記事を書いていて、自分が誤った認識をしていることも気づけました。

理解した後だとわかりますが、不要な知識だと捨て去ると地味につらいですね…。
捨て去った知識がいっぱいあるので、素振りできるようにいっぱい勉強したいです。


もしこの記事が役に立ったのであれば、はてぶ、Twitterでの記事の拡散、twitterのフォローもよろしくお願いします。

私の励みになります。

参考資料


qiita.com

ja.wikipedia.org

類似記事

FTPサーバをDockerで建てる nainaistar.hatenablog.com