Help us understand the problem. What is going on with this article?

AWS EC2からFTP アクティブモードでファイル転送する

問題になる部分

昨今では使われることもなくなってきたと思われるFTPですが、このFTPは環境によって微妙に使いにくいプロトコルであります。
その原因としてはアクティブとパッシブの2つのモードの存在があります
違いは以下のページが分かりやすいです。
https://www.infraexpert.com/study/tcpip20.html

アクティブモードは環境によって使えないケースが多く(特に所謂NAT越えの場合)、AWS EC2インスタンスからインターネット上のFTPサーバーに通信する時もうまくいきません。
パッシブモードで使えればいいのですが、アクティブモードしか受け付けていないサーバーというのもあるので、どんな状態になっているかちょっと調べてみました。

パケットのキャプチャ

EC2インスタンスにログイン
まずは普通にログインします。

その後、FTPの通信を確認する為にtcpdumpを実行

sudo tcpdump -A -p host xxx.xxx.xxx.xxx

オプション -A はAsciiで出力。文字列で読めるところは文字列になります。

-p は自ホストに関連する通信のみ出力。
host でターゲットのIPを指定。
そうするとこんな表示が出てくるところがあります。

PORT 192,168,1,1,228,200

前半4個の数字がIPアドレス、後ろ2つがポート番号。
ポート番号は最初の数字に256をかけて次の数字と足したものになる。
この場合は
228 * 256 + 200 = 58568

今回の問題はIPアドレスの方です。

送信できない原因

EC2インスタンスに割り当てられたプライベートIPを送っているのですが、AWSがこの辺りをよしなに変換してくれるということはなく、相手側は送られたプライベートIPに接続しようとします。

その結果、当然接続できないので通信が正常に行えないという事になるのでした。

PORTコマンドのIPを外に出て行くときのグローバルIPに変更すれば接続できそうですが、よく入っているFTPクライアントでは変更ができません。

他のコマンドで対応してみる

この状態でFTP転送する場合、コマンドレベルであればlftpというコマンドを使うのが便利です。
インストールはyumで可能です。

sudo yum install lftp

使い方はこんな感じ

# まずは接続先を指定
lftp example.jp
# userコマンドでユーザー指定
user hogehoge
# パスワードを聞かれるので入力
Password:
# パッシブモードをオフにする
set ftp:passive-mode off
# 相手に送るグローバルIPを指定
set ftp:port-ipv4 xx.xx.xx.xx

これでアクティブモードで使えました。

ryuseino
lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away