Python2: AWSとかNATの内側ホストから外側のActive限定FTPサーバに接続する

 AWSのVPCとかの環境でNATが被さっちゃってるせいでActive FTPがうまくいかないことがあるんで対応した。


 アクティブFTPは、クライアントからコントロール接続をサーバに送って、データ接続はサーバからクライアントに向かって行われる。
 この場合に対応が必要なのは、外から来る着信をNATが通してくれること、そしてホストのファイアウォールもコレを受け入れること。
 AWSだと、セキュリティグループ設定で全部通してしまって、ホスト側で普通にIPTABLESで対応、ip_conntrack_ftpを入れておきます。
※ip_conntrack_ftpは、FTPコントロールコネクションに対するデータコネクションを受け付けるためのモジュール。 良くセット扱いされるip_nat_ftpはFTPのNAT通過をサポートするモジュールで、AWSのNAT自体が外にあるためにここのNATは働かないからip_nat_ftpは特に必要ない。

 今回はPython2でFTP接続する場合の対応。
 対応方法は、標準のftplibを改造。

 変更内容は46行のSocket.inet_atonインポートと、112行のメンバ追加、306行からの処理。

 で、使うときは

みたいな感じ。

AWSの場合は

これでOK。 インスタンスからこのURLにアクセスすると、そのインスタンスのグローバルIPv4アドレスが帰ってくるAWSのサービス。 http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

 通常のFTPインスタンスを作った後に、ftp.externalip変数に自分の外側IP(EIPとか)を設定してやってから使う。
 ftpは通信でデータコネクションを使うタイミングで、クライアントからPORTコマンドで、自分のIPと受け付けるポートをサーバに送るんで、このときの自分のIPをexternalipでオーバーライドしてやることで、ActiveなFTPサーバと通信できるようになる。

 本当はサーバ側がPassiveサポートしてくれれば一番良いんだけど、大昔からの業者さんで仕様書にmust active modeと書かれちゃってるからちょいちょい対応した。

(41)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP]   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です