2018年のこのご時世にvsftpdがPhpStormからうまく繋がらなくてすごく困りました


はじめに

こんにちは! 2018年ですね!
「FTPなんて古の技術だ」なんて思っていたのですが、世の中ではまだまだFTPなんです。
若い子からは「SSHしか使ったこと無いけどFTPって何?」なんて言われることもあるんですが、ニーズがあったりしてFTPはまだまだ現役なんです。

僕がはじめてFTPサーバを立てたのは2000年ごろだったかなと思います。ProFTPDをFreeBSD立てた覚えがあります。

さて当時は家庭用ルータの配下にサーバを立てて、「NAPT配下のFTPサーバはパッシブモードだと繋がらない」ですとか「クライアント側のルータにパッシブモードのポート書き換え機能搭載」があったりしてて、当時もよく分かってないままだったんですが、20年近く経った今でもよく分かっていないです 😉

さて時は流れて2018年。でも自分もまさか20年近く経ってもまだFTPサーバを立てることに苦慮しているとは思いもよりませんでした。

FTPサーバに繋がらない

あるクラウドサーバでFTPを立てていたのですが、クライアントより「FTPが繋がらなくなった」との連絡が入りました。
それまではあまり問題もなくつながっていたのですが、一年ほど前から繋がらないとのことです。
ただしFTPクライアントによってはうまくつながったりしていて、サーバの問題なのかクライアントの問題なのかはっきりしないまま、なんとなく放置して「FTPクライアントソフトを変えてくださいね」ということで乗り切っていました。

ですが自分の使っているPhpStormのFTP機能(これがめっちゃ便利なんです!)でも繋がらない症状にあたってしまいました。
実はそれまでにもFTPが繋がらないことはあったのですが、管理者特権(!)でSSHを使ってSFTPでやりとりしていたため大きな問題ではなかったです。
ですが自分もFTPを使う必要性が出てきたため、どうしても不便になってしまいました。

FileZillaでは繋がる

さて改めて問題を確認しようとFileZillaで試したところうまく繋がります。
FileZillaではデバッグログを流すことができるため、そちらで確認しました。

これでログを確認してみると、パッシブモードで入る際にアドレスがおかしいよ、という警告が出ていました。

パッシブモードではサーバ側から「うちのグローバルアドレスはこれだからここにつないでね」というメッセージが送られます。
そこで送られているグローバルアドレスが0.0.0.0というものでした。
0.0.0.0は「全てのアドレス」という意味で、FTPや他のサービスを起動する場合の待ち受けアドレスとして利用される事が多いです。
ただこれはもちろんグローバルアドレスではなくて、なにかおかしいことになっていました。

FileZillaではパッシブモードのアドレスがおかしい場合、「FTPの接続先として指定しているサーバアドレスを使う」という設定があります。この設定をつかってよしなにパッシブモードの接続先をきりかえてくれている、ということが分かりました。

vsftpdの設定

ということでこのパッシブモードのアドレスを設定するconfを書きました。

/etc/vsftpd.conf
(中略)
# When "listen" directive is enabled, vsftpd runs in standalone mode and
# listens on IPv4 sockets. This directive cannot be used in conjunction
# with the listen_ipv6 directive.
listen=YES

# This directive enables listening on IPv6 sockets. By default, listening
# on the IPv6 "any" address (::) will accept connections from both IPv6
# and IPv4 clients. It is not necessary to listen on *both* IPv4 and IPv6
# sockets. If you want that (perhaps because you want to listen on specific
# addresses) then you must run two copies of vsftpd with two configuration
# files.
# Make sure, that one of the listen options is commented !!
#listen_ipv6=YES
listen_ipv6=NO

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=NO
userlist_deny=NO
use_localtime=YES
pasv_enable=YES
pasv_address=xxx.xxx.xxx.144
pasv_min_port=50000
pasv_max_port=50030
allow_writeable_chroot=YES

ポイントはlisten=YESlisten_ipv6=NOです。
ココを設定するとうまくいきました。

原因について

元々の設定でうまく動いていたのですが、いつの日か動かなくなりました。
IPv6の待ち受けをオフにするとうまくいようになったので、恐らくですがクライアント側の接続がIPv6でつなぎに行くようになったのではないかな…、と思っています。

ということで、今回の問題も @naname さんに助けてもらいました。
2000年ごろにFTPサーバを立てたときも @naname さんに助けてもらったのですが、今回も助けてもらいました。ありがとうございます!

PhpStormのDeployment

PhpStormでは「RemoteHost」の項目からFTPの設定ができます。

これを設定しておくとFTPの自動アップロードができるのでオススメです。

この中ではディレクトリを指定して自動アップロードの設定ができたり、特定ファイルを除外することもできます。
WordPress案件の場合にはthemespluginsを指定しておくと便利です。
また「同期」の機能もあり、差分のあるファイル一覧を設定してくれるのでこれもすごく便利です。

あとは .idea/deployment.xml をGitなどで共有すると、開発サーバやステージングサーバの設定をチームで共有できるのでこれも便利です。結構この設定が面倒なので、最初にやっておくとチームメンバーの満足度が上がること間違いなし!って思っています。
とにかくオススメです!