問題になる部分
昨今では使われることもなくなってきたと思われる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
これでアクティブモードで使えました。