スポンサードリンク

2013年09月02日

【AWS】ftpの接続が「150 Opening ASCII mode data connection for file list」で停止する

備忘のため記載しておきます。

発生した問題は表題の通り、
「ftpの接続が「150 Opening ASCII mode data connection for file list」で停止する」
という問題です。
よくある話といえばよくある話です。

調査してみたら以下のことがわかりました。

1:ffftpでもコマンドプロンプトからのftpでも同じエラーが出る
2:cmdからのftpだとopenはできるがlsコマンドを打つと上記の場所で停止してそのまま帰ってこない
3:PASVモードだと何故かつながる
4:ACTIVEモードだとつながらない

また前提として、
・クライアントはAWSのアカウントNo.1
・ftpサーバはAWSのアカウントNo.2
と、AWSのアカウントを跨いでいました。
また、それぞれinstanceで存在しており、EC2及びVPCを利用しています。

で、IPは
クライアント:192.168.128.1(アカウント1に所属)
ftpサーバ:172.23.1.250(アカウント2に所属)
とします。

さて、AWSはVPCにあるNACLのブラックリストを除けば基本的にホワイトリストである
Security Groupしか利用しないと思います。
で、ここを確認してみたのですが・・・確認したときは、
192.168.128.1⇒172.23.1.250
においては、outboundはデフォルトの0.0.0.0/0のALL Trafic。
そしてinboundについては、特に意識してませんでした。

で、172.23.1.250側のinboundですけども、これは
192.168.128.1/32に対してTCPのALL portを許可。
うーん、問題なさそう。

次に、それぞれのwindows firewallを確認。
どちらも完全にOFF。
うーん、関係なさそう。

しょうがないので
192.168.128.1のinboundに
172.23.1.250/32でTCP ALL portを解放してみました。
じゃあOKに。

つまり、
「ftpのactive接続はinboudが必要」
ということがここでやっとわかった気がしました。
なんとPASVはoutboundしかいらない!!

ここで
http://www.infraexpert.com/study/tcpip20.html
http://www.infraexpert.com/study/acl12.htm
ここのサイトをみてみました。

ここのActiveモードの説明を見てびっくり。
まず、制御用のコントロールコネクションとデータ転送用のデータコネクションにわけられるんですけど、

Activeだと
【コントロール】
client → ftpサーバ
【データ】
client  ftpサーバ

ってなってます。やはり、これクライアント側のinboundだわ。
ここのコネクションの確立はサーバ側からなんです。知らなかった!
ってことは、サーバ側のoutboudの話でもあります。

PASVだと
【コントロール】
client → ftpサーバ
【データ】
client  ftpサーバ

どっちも→だ!!!
つまり、クライアント側のoutboundだけの話で完結します。

よって、この問題の解決策は以下の通りです。

■問題
前提として、AWSのアカウント1とアカウント2のそれぞれのInstance同士でftpで疎通しようとしている。
そのときにはどのようにftpに対するSecurity Groupを設定すればいいか?

■解決策
1:Activeの場合
この場合は、ftp clinet→ftp serverの接続に加えてftp clinet←ftp serverも必要になる。
つまり、ftp clinetのinbound/outboundとftp serverのinbound/outboundどちらも設定が必要。
・ftpクライアント:192.168.128.1(アカウント1に所属)
・ftpサーバ:172.23.1.250(アカウント2に所属)
とした場合、192.168.128.1では、172.23.1.250/32に対してinbound/outboundとも全port(1024番以上)の解放が必要。
172.23.1.250では、192.168.128.1/32に対してinbound21番/outbound20番portの解放が必要。
(※どちらもoutboundはデフォルトで全部解放されているので、inboundを追加しないといけない)

2:Passiveの場合
この場合は、ftp clinet→ftp serverの接続のみになる。
つまり、ftp clinetのoutboundとftp serverのinboundだけのシンプルな話になる。同じく
・ftpクライアント:192.168.128.1(アカウント1に所属)
・ftpサーバ:172.23.1.250(アカウント2に所属)
とした場合、192.168.128.1では、172.23.1.250/32に対してoutboundで1024番以上の全portの解放が必要。
同様に172.23.1.250では、192.168.128.1/32に対してinboundで1024番以上の全portの解放が必要。
(※outboundはデフォルトで全部解放されているため特に意識せずとも良いことが大半。inbound側を意識するのはサーバ側は当然なので、ここを設定してあげればいい。1024番以上については仕様⇒greater than 1023)

・細かい話
1023"より"でかいなので1024"以上"であってます

※クライアントとサーバのアカウントが別々にわかれていなくても良いんですけど、アカウントが一緒の場合は同じセキュリティグループに属させてしまうことが多いので、多分この問題には当たらないと思います

※追記
以下の知恵袋最強すぎる・・・。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1118264251

>・アクティブFTP
>・データコネクションは、サーバ側の20番から、クライアント側の1024以上の任意のポートに接続される。
>・クライアント側で、FTPサーバからのコネクションに対応できるよう1024以上のポートを開放しておかないといけない(開けるポートは複数あり、それはFTPサーバの仕様により異なり、固定するにはそれなりの知識が必要)
>・サーバ側は、21番の受けと、20番からの発信のみを許可するればよいので、サーバ側のセキュリティが上がる。
>・クライアント側は、不特定のポートを常に開放する必要があるので、セキュリティレベルが下がる。

関連記事:Amazon Web ServicesのEC2上にFTPサイトを構築する時に注意するポイント IISの場合

posted by hinata_hisa at 21:08 | 東京 ☀ | Comment(0) | IT関係 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。