FTP(File Transfer Protocol)、FTPS (File Transfer Protocol over SSL/TLS)について、接続がうまくいかず、クライアントの設定やプロトコルそのものについて色々調べたので備忘をまとめました。
クライアントはとくにこだわりはないのですが、WindowsでもMacでも最近よく使ってるのでFileZillaです。

前提

  • 自社FTPサーバーではなくて、レンタルサーバーに個人や社内から接続するような人向けの内容です。
  • クライアントはWindowsでもMacでも使えるのでFileZillaを使います。
  • FTP/FTPSプロトコルについての、基本的な知識をまとめました。
  • 社内ネットワークにNATファイアウォールがある場合にFTPSでの接続がうまくいかなかったので、その覚書。
  • 【参考】接続したことがあるレンタルサーバー:さくらインターネット、Xサーバー、ロリポップ、アルファメール(大塚商会)

FileZillaの設定方法

FTPクライアントにFileZillaを使ってサーバーに接続してみます。
FPTサーバーの設定にもよりますが最低限必要な設定について。
後述していますがFTPは使うべきではないので画面キャプはFTPSでの接続サンプルです。

FileZillaを起動して、「ファイル」-「サイトマネージャ」をクリック

「新しいサイト」をクリックし、サイト名(任意)を設定します。
「一般」タブにFTP接続情報を入力します。

ホスト (FTP接続情報を確認)
プロトコル FTP – ファイル転送プロトコル
暗号化 明示的なFTP over TLSが必要
ログオンの種類 通常
ユーザー (FTP接続情報を確認)
パスワード (FTP接続情報を確認)

FTPSでの接続の場合、暗号化はセキュリティを考慮して「明示的なFTP over TLSが必要」を選択します。
※「使用可能なら明示的な FTP over TLSを使用」はFTPSが使用できない時FTP接続してしまうのでできるだけ利用しない方が良い。

レンタルサーバーなら契約時に送られてくるであろうFTP接続情報を確認してください。

「詳細」タブは任意です。
よくわからない人は触らなくて良いと思います。

「転送設定」タブは転送モードに「パッシブ」を選択します。
サーバーの設定手順に書いていないこともありますが、アクティブモードでは繋がらない環境も多いのでパッシブでいいと思います。
アクティブとパッシブの違いについては後述。

「文字コード」は任意です。「接続」ボタンを押すとサーバーに接続します。

サーバーに接続できて、ディレクトリ一覧が表示されたらOKです。

個人がレンタルサーバーに接続するような状況では以上で問題ないのではと思いますが、繋がらなかった場合に途方にくれてしまいます。
自分でもうまくいかないことが何度かありましたので、次は繋がらないケースについて考えていきます。

FTPがつながらない時に確認したいこと

  • まずはFTPの接続情報(ホスト、ユーザー、パスワード)が正しいかを確認する!
  • プロトコルと暗号化が接続先サーバーに適しているか確認する。
  • 転送モードを「パッシブ」にしてみる。
  • FTPサーバーに接続元IP制限がかかっていないか確認する。
  • 別のFTPクライアントを試してしてみる。
  • 設定に問題がないなら、別のネットワークから接続してみる。

まずはFTPの接続情報(ホスト、ユーザー、パスワード)が正しいかを確認する!

繋がらない時にまず一番丁寧に確認すべきこと。つづりやパスワードの入力間違いを何度も確認しましょう。

プロトコルと暗号化がサーバーに適しているか確認する。

まれに出会うのですが、FTPしか接続できないサーバーがあったりします。サーバーがFTPSに対応しているか、どの暗号化方式に対応しているかを確認しましょう。
レンタルサーバーならQ&Aだとか設定手順だとかに書いてあることが多いです。
ちなみにアルファメールはFTPSは対応していませんでした。(2018/4 現在の情報です)

転送モードを「パッシブ」にしてみる。

これで何度かはまったことがあります。必須設定とは書いていないことが多いのですがパッシブモードにしないと繋がらないことがあります。

FTPサーバーに接続元IP制限がかかっていないか確認する。

知人がこれではまっていました。会社などでレンタルサーバーを利用する場合、セキュリティ面から社外からのFTP接続をブロックし社内からしか接続できないようにしていたりします。
サーバー契約者などサーバーを管理している人に聞くか、自分で見られるならサーバーのコンパネなどからアクセス制限を確認しましょう。

別のFTPクライアントを試してしてみる。

たまに「うちのサーバーはそのFTPクライアントとは相性が悪い」と言われることがあります。
どういう問題があるのかはよくわかりませんが、うまくいかないときは問題切り分けの意味で別のクライアントで試してみるのもありです。

設定に問題がないなら、別のネットワークから接続してみる。

この記事を書くにあたりはまっていた問題がネットワーク。
自宅とかパブリックネットワークからは接続できるのに、社内からは接続できない・・・という状態だったのでネットワークに問題があるようでした。

大体このあたりの問題を解決すれば接続できるのではないかと思います。
最後のネットワークの問題にあたった際、FTP/FTPSを使えるようにするにはファイアウォールのポート解放だとかそういうのしなきゃだめなんじゃ?ってことであやふやだったFTP/FTPSの基本について色々調べました。
(実際NATファイアウォールのポート開放設定で接続できるようになりました。)

FTP(File Transfer Protocol)

ネットワークでファイルの転送を行うための通信プロトコル。
通信プロトコルっていうとよくわからない感じがしますが、レンタルサーバーにファイルをアップ&ダウンロードする時なんかにサーバーとクライアントを接続してくれるものです。

[サーバー] <--- FTP ---> [クライアント]

FTPはユーザ名やパスワードなどを含むすべての通信内容を暗号化せずに平文で転送してしまうなど、セキュリティに大きな問題があります。
なので、実用する場合FTPではなくFTPSやSFTPなど通信が暗号化されるプロトコルを使いましょう。

今でもFTPしか対応していないサーバーやクライアントもあると思いますが、可能であれば避けましょう。他にもいいサーバーがすぐ見つかるとおもいます。。

FTPの基本的なこと

  • 「接続先ホスト」、「ユーザー」、「パスワード」で接続する。
  • FTPは通信内容を暗号化せずに平文で転送してしまい使用するのは危険。FTPSを使うこと。
  • データコネクションには「アクティブモード」、「パッシブモード」の2つの転送モードがある。レンタルサーバーなどへの接続なら「パッシブ」を使う。
  • FTPはコントロールコネクション(ポート:TCP/21)とデータコネクション(ポート:TCP/20)の2つを必要とする。

データコネクションについては後述。つづいてはFTPSについて。

FTPS(File Transfer Protocol over SSL/TLS)

FTPで送受信するデータをTLSまたはSSLで暗号化する通信プロトコル。

  • 通信が暗号化されているのでFTPと比べてセキュリティが高い。
  • 「Explicit(明示的)モード」、「Implicit(暗黙的)モード」の2つの暗号化の種類がある。
  • 「Explicit(明示的)モード」はFTPと同じポートを利用。コントロールコネクション(ポート:TCP/21)とデータコネクション(ポート:TCP/20)
  • 「Implicit(暗黙的)モード」はコントロールコネクション(ポート:TCP/990)とデータコネクション(ポート:TCP/989)を利用。

暗号化方式:Explicit(明示的)モード・Implicit(暗黙的)モード

【Explicit(明示的)モード】
サーバーにコネクションを張った後にFTPクライアントがAUTHコマンドを実行し、使用するプロトコル(SSLまたはTLS)のネゴシエーションを行う。
適合したプロトコルでのハンドシェイク完了後、暗号化された通信がおこなわれる。

調べていると「サーバーに接続した後に暗号化」っていう説明が多いので、「FTPSでもユーザーIDとパスワードは平文で送信される?!」って不安になりましたがさすがにそんなことはありません。
「サーバーに接続」っていうのがすごく紛らわしいんですよね・・・。FTPSのハンドシェイクのあみだくじみたいな図を探していたのですがなかなか見つからなかったので、もう少し調べてみたいところです。

「適合したプロトコル」には設定次第ではFTPが含まれる場合もあるので、FTPSでつないでると思ってたけどFTPで接続していた・・・ってことにならないように設定に注意しましょう。

【Implicit(暗黙的)モード】
FTPサーバーにコネクションを張る時点で暗号化を行い、すべての通信が暗号化される。21番ポートの代わりに990番ポートを使用。

レンタルサーバーは、Explicit(明示的)モードだけに対応しているところも多いようです。サーバーがどの暗号化に対応しているか確認しましょう。

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

用途によるのかもしれませんが、レンタルサーバーに接続する場合はだいたい「パッシブモード」に設定します。
アクティブモードとパッシブモードの違いは、データコネクションの向き。
ファイアウォールの通過に関係してきます。

【アクティブモード】
・サーバーからクライアントの方向にデータコネクションを接続要求。

[クライアント](任意) --- コントロールコネクション ---> (TCP/21)[サーバー]
[クライアント](任意※) <--- データコネクション --- (TCP/20)[サーバー]
※クライアントが通知したポート番号 

【パッシブモード】
・クライアントからサーバーの方向にデータコネクションを接続要求。

[クライアント](任意) --- コントロールコネクション ---> (TCP/21)[サーバー]
[クライアント](任意) --- データコネクション ---> (任意※)[サーバー]
※サーバーが通知したポート番号

アクティブモードだと外部から内部ネットワークにコネクションを張ることになり、さらにポート番号が不定であるのでセキュリティ上使用できないということが多いでしょう。
対してパッシブモードはクライアントからサーバーにコネクションを張るので、ファイアウォールをスムーズに通過できるというわけです。

ただしFTPSを使う場合に会社などNATファイアウォールのある環境になると、パッシブモードでもすんなり接続といかない場合があります。

【参考】NATファイアウォールとFTPSは相性が悪かった?

参考サイト様の記事がわかりやすかったです。
記事ではFTPサーバーがNATファイアウォールの内側にある例ですね。

参考:NAT ファイアウォールを通して FTPS を使用したい

うーん、難しい。。
NATが何なんだとかコネクションがどう張られてるのとかすらわからなかったので最初は読んでもちんぷんかんぷんでした^^;

筆者の問題の環境では、クライアント側にNATファイアウォールがあるのでサーバーのIPアドレスはグローバル・・・ということは記事のパターンのIPアドレスの変換には問題ない?
エラーとしては「コントロールコネクションは通って接続OKと返ってくのに、ディレクトリ一覧が返ってこないくてタイムアウトする」という状態でした。
FTPSだとそうなってしまうんですが、FTPは通ります。

以下の環境を想定して、パッシブモードでのFTPS制御を考えてみます。(合ってるかは不明です。。すみません・・・)

[クライアント <--- 内部ネットワーク ---> NATファイアウォール] <--- 外部ネットワーク ---> [サーバー]
  1. データコネクションを張るためにクライアントからサーバーにPASVコマンドを送信
  2. NATが1を受信、クライアントの代わりにPASVコマンドをサーバーに送信
  3. サーバーがPASVコマンドを受信、PASV応答(データコネクションを待ち受けるグローバルIP:ポート番号)をクライアントに送信
  4. NATが3を受け取り、クライアントに送信
  5. クライアントがPASV応答を受信、指定されたグローバルIP:ポート番号にデータコネクションオープンを送信
  6. NATが5を受信、クライアントの代わりにサーバーにコネクションオープンを送信
  7. クライアント・サーバー間にデータコネクションオープン。6の応答でサーバーがディレクトリ一覧をクライアントに送信
  8. NATが7を受信、クライアントにディレクトリ一覧を送信
  9. クライアントがディレクトリ一覧を受信

こんな感じなのではないでしょうか。
つまりこのケースではNATの変換は関係ないと予想して、単純にポート開放が問題ということでクライアント→サーバー方向のポートの開放を実施したところ接続に成功しました・・・。

泥沼にはまって難しく考えて色々調べまわりましたが、ただのポート開放だったとは。。
知識が増えたし解決もできたのでよかったことにしておきます・・・^^;

おわり