FTPとSFTPのポート番号と簡単な説明
更新日:2019/08/11
私はいつも、FTPやSFTPのポート番号で悩みます。
なぜなら、ネットで調べてみると20とか21とかいろいろはっきりしないからです。
そこで今回は、FTPのポート番号は、本当は何番が正しいか調べてみました。
FTPとSFTPのデフォルトポート番号
FTPとSFTPのポート番号を調べてみると、FTPは20と21、SFTPは22を使用していることがわかりました。
とりあえず、表にしてみます。
サーバー側ポート番号 | クライアント側ポート番号 | 用途 |
---|---|---|
20(デフォルト) | 自動(エフェメラルポート) | FTP:データ転送用ポート |
21(デフォルト) | 自動(エフェメラルポート) | FTP:制御(コントロール)用ポート |
22(デフォルト) | 自動(エフェメラルポート) | SFTP:SSH用ポート |
こう書くと、いろいろ気になる点がありますね。
もう少し詳しく説明してみます。
FTPは20番と21番を使用
FTPは、なぜかポートを二つも使っていますね。
好きなほうを使えばいいのかと思っていたら、それぞれ役割があるようです。
どんな役割なんでしょうか。
順番的に、20番から説明するべきですが、21から説明したほうがしっくりいきそうなので、21から説明します。
ポート番号21:FTP制御ポート
ポート番号21はFTPの窓口。
実データを扱う前に、FTPの送受信に必要な情報をやりとりするためのポートです。
まずクライアントは、使用されていないポートから、FTPに使用するポートを自動で選択します。
このポートは、その場限りという意味のephemeral(儚い・泡沫)から、エフェメラルポートと呼ばれます。
そのポートからサーバーの21番ポートへアクセスすると、TCPという大きな通信の枠組み(プロトコル)を介して、制御用のコントロールコネクションが張られます。
で、やり取りは一回ではなくて、何度か情報を伝達しあいます。
イメージは、こんな感じ。
FTP接続できますかー?
いいよー。
ところで君は誰?
パソ子でーす。
なるほどー、パスワードは?
ネコ・ネコ・コネコです!
おーけー!
じゃあ、FTP通信を始めよう。
実際は、USERコマンドとか、PASSコマンドなどのコマンドを送信しています。
ポート番号20:FTPデータ転送ポート
無事ログインできたら、次はデータコネクションを確立して、実際にデータの転送(送受信)を行います。
と、その前に…
データコネクションを確立する方法には、「アクティブモード」と「パッシブモード」があって、20番ポートを使うのは、「アクティブモード」だけです。
そのためこの説明は、「アクティブモード限定」ということに注意してください。
モードの違いについては、次のページを参考にしてください。
参考:FTPのアクティブモードとパッシブモードは何が違うのか
では、説明に戻ります。
無事FTPにログインできたら、クライアント側はデータ転送に使用するエフェメラルポートを選択します。
そしてコントロールコネクション(21番ポート)を通じて、サーバーにポート番号を送信します。
データ転送したいので、XXXXポートに接続してくださーい!
ちなみにこちらのIPアドレスはXXX.XX.XX.XXです。
するとサーバーは、自分の20番ポートと、クライアントから申し出があったポートを接続して、データコネクションを確立します。
おーけー!
そのポートと、こちらの20番ポートを繋げるよー
無事にデータコネクションを確立できたら、データの転送が行われます。
そして転送が終わると…
じゃあ、データコネクションを切断するよ。
他のデータを転送するなら、コントロールコネクションから、もう一度連絡してねー
もう一度データ転送したいので、XXXXポートに接続してくださーい!
ちなみにこちらのIPアドレスはXXX.XX.XX.XXです。
つまり、複数のデータを送受信する場合は、そのたびにデータコネクションを確立しているのです。
FTPはどうしてポートを二つ使うのか
クライアントサーバー間で通信を行うプロトコルの多くは、一つのポートを使用しています。
FTPは二つ使うので、他と少し変わったことをしているんですね。
ではどうして、二つもポートをつかっているのかというと、データのやりとりをスムーズにおこなうためです。
大きなデータを転送している最中は、そのポートを使って他の情報を送ることができません。
例えば、転送をキャンセルしたいとサーバーに伝えたくても、データの転送が終わるまで伝えることができないのです。
そこで、データと制御のポートを分けることで、転送中にコマンドをサーバーに送信できるようにしたようです。
FTPは、30年前に考えられたプロトコルです。
当時の回線速度は、今の人には想像できないくらい遅いものでした。
そのため、少しでもパケットのやり取りを減らすことも、設計する上で重要なことでした。
二つのポートを使うのは、その考えがあってのことだと思います。
今のネット事情には少し合わない面があるかもしれませんね。
しかし、多くのサーバーで標準的に使用されている仕組みを、全く新しいものに変えるのは、大変ですし、やるだけ無駄という面があります。
そういうものだと、深く考えない方がいいのかもしれませんね。
ふーん、そうなんだー
20や21はサーバーのポートだということに注意
実は私は、もう20年くらい勘違いしていました。
それは、「クライアントとサーバーは、同じポート番号で通信する」という勘違いです。
そのためクライアントからサーバーに使用するポートを伝える理由がわからず、3時間くらい悩みました。
でも勘違いだとわかったら、スッキリ。
ポート番号を指定しているのは、相手が接続するときの目印のためで、実際に通信するのは何番でもいいのです。
だからクライアントは、
この番号あいてるから、ここを使おー
で、いいわけです。
20年ぶりのスッキリでした。
というか、よく考えたらちょっと恥ずかしい話だわ…(/ω\)
ちなみに、このように一時的に使用されるポートを「エフェメラルポート」といいます。
エフェメラル(ephemeral)は、つかの間とか短命という意味なので、そのままのイメージですね。
現在のシステムでは49152から65535の範囲が割り振られていることが多いようです。
その逆に、FTPの20や21のように、用途が限定されているポートは「ウェルノウンポート」と呼ばれています。
具体的には、1から1023までの範囲です。
SFTPは22番を使用
SFTPは、デフォルトで22番を使用します。
というか、SFTPはSSHを利用してやりとりをするので、ポート番号はSSHのものとなります。
SSHは、クライアントからサーバーのコマンドを実行することができるプロトコルですね。
なので外部からサーバーに侵入するために、22番ポートは狙われています。
そのため、別の番号に変更することが推奨されています。
SFTPでサーバーに接続するときは、サーバー管理者にポート番号を問い合わせる必要があります。
更新日:2019/08/11
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。