GCEちょい技 – FTPサーバを構築する

Author
Shohei Abe
Lv:6 Exp:11827

2017年10月より入社しました。これまでの技術分野は主にインフラ関係です。
今後はGCPでフルスタック対応できるエンジニアを目指し日々いろいろと活動しています。

Cloud Functions がGAになり、Cloud Run のような新しいサーバーレスサービスが提供されている今日この頃、いかがお過ごしでしょうか。こうしたGCPの魅力的で刺激的なサービスが提供されていく中、FTPのような古式ゆかしいサービスもオンプレ環境の移行で求められることが多いと個人的には考えています。しかし、FTPはGCPのマネージドサービスでは提供されておらず、Compute Engineで構築する手法のニーズはまだあるのではと個人的に考えています。そんなFTPサーバを構築する手順と、ハマるポイントを回避する設定についてご紹介したいと思います。

構築する環境

今回はCentOS7イメージでFTPサーバを構築してみようと思います。GCEインスタンスは以下のような構成にします。

GCEインスタンスの主な設定項目

設定項目 設定内容
インスタンス名 ftp-server
マシンタイプ n1-standard-1
ゾーン asia-northeast1-b
ブートディスク CentOS7 (サイズ: 30GB)
サービスアカウント Compute Default Account
Scope: Default
ネットワーク Default
ネットワークタグ ftp-server
外部IPアドレス 固定設定

FTPサーバ(vsftpd)の追加の設定項目は以下になります。

FTPサーバの主な設定項目

設定項目 設定内容 設定の意味
anonymous_enable NO Anonymous FTPを無効化する。(パスワード認証のみを許可したいため)
xferlog_std_format NO wu-ftpd形式ではなくvsftpd形式のログで出力する
listen YES IPv4で通信を行う
listen_ipv6 NO IPv6で通信を行わない
port_enable NO アクティブFTPの使用を許可しない(今回は基本的にパッシブFTPによる通信のみを許可するため)
pasv_min_port 50010 パッシブFTPでデータ通信に使うポートの開始番号
pasv_max_port 50020 パッシブFTPでデータ通信に使うポートの終了番号
pasv_address GCEインスタンスの外部IPアドレス パッシブFTPでクライアントに通知するデータ通信の外部IPアドレス

FTPサーバ構築手順

GCEインスタンス作成

何はともあれ、まずはGCEインスタンスを作成します。構築手順は極力コマンドラインで実施するため、当記事ではCloud Shellを使用します。Cloud Shell についてご存じ無い方は、以下の記事が役に立つと思いますのでご一読をお願いします。

HandsOn環境迷子に贈るCloud Shell

最初に Cloud Console から Cloud Shell を開きます。まずはGCEインスタンスの外部IPアドレスを予約します。下記のコマンドを実行してください。

gcloud compute addresses create ftp-server-ip --region=asia-northeast1

次に以下のコマンドを実行します。

FTP_IP=$(gcloud compute addresses describe ftp-server-ip --region=asia-northeast1 --format='value(address)')

最後に以下のコマンドを実行し、予約した外部IPアドレスが表示されることを確認してください。

echo $FTP_IP

次に、予約した外部IPアドレスを使ってGCEインスタンスを作成します。下記のコマンドを実行してください。

gcloud compute instances create ftp-server \
  --zone=asia-northeast1-b \
  --machine-type=n1-standard-1 \
  --image-family=centos-7 \
  --image-project=centos-cloud \
  --boot-disk-size=30GB \
  --tags=ftp-server \
  --address=$FTP_IP

しばらくしますと以下のような表示が出力され、ftp-server インスタンスが作成されます。EXTERNAL_IP に予約した外部IPアドレスが表示されていることを確認しましょう。

NAME        ZONE               MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
ftp-server  asia-northeast1-b  n1-standard-1               10.146.0.31  **.**.**.**  RUNNING

ファイアウォールルールの追加

次にdefaultネットワークに今回のFTPサーバに対する通信許可を行うファイアウォールルールを追加します。下記のコマンドを実行してください。

gcloud compute firewall-rules create default-allow-ftp \
  --network=default --action=ALLOW \
  --rules=tcp:21,tcp:50010-50020 \
  --source-ranges=0.0.0.0/0 \
  --target-tags=ftp-server

FTPサーバ(vsftpd)インストール

次にFTPサーバのソフトウェアであるvsftpdをインストールするため、 ftp-server にSSHログインしましょう。今回は Cloud Shell で以下のコマンドを実行してログインします。もちろん、その他の方法でSSHログインしても大丈夫です。

gcloud compute ssh ftp-server --zone=asia-northeast1-b

次に、以下のコマンドで vsftpd をインストールします。

sudo yum install -y vsftpd

この時点では、まだFTPサーバのサービスは起動していません。

FTPサーバ設定

FTPサーバ(vsftpd)の設定ファイル(/etc/vsftpd/vsftpd.conf)に、GCEで必要な設定を追加します。最初に GCEインスタンスの外部IPアドレスを取得します。

FTP_IP=$( curl -sH "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip)

念のため、外部IPアドレスを表示確認します。

echo $FTP_IP

インスタンスの外部IPアドレスが表示されたことを確認したら、以下の3つのコマンドを実行し、FTPサーバに必要な設定を追加します。
最初に、vsftpdの設定ファイルをバックアップします。

sudo cp -a /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.orig

次に、既存のvsftpd.confから変更が必要な設定を上書きします。

sudo sed -i \
  -e "/^anonymous_enable=/s/YES/NO/g" \
  -e "/^xferlog_std_format=/s/YES/NO/g" \
  -e "/^listen=/s/NO/YES/g" \
  -e "/^listen_ipv6=/s/YES/NO/g" \
  /etc/vsftpd/vsftpd.conf

最後に、パッシブFTPの通信で必要な設定を最終行に追記します。

sudo sed -i -e "\$a port_enable=NO" \
  -e "\$a pasv_enable=YES" \
  -e "\$a pasv_min_port=50010" \
  -e "\$a pasv_max_port=50020" \
  -e "\$a pasv_address=$FTP_IP" \
  /etc/vsftpd/vsftpd.conf

念のため、設定ファイルに反映されているかを確認します。

diff -u /etc/vsftpd/vsftpd.conf.orig /etc/vsftpd/vsftpd.conf

差分情報として、以下のように変更差分が表示されていれば問題ありません。
※行頭-の行が変更前、行頭+が変更後の設定になります。

--- /etc/vsftpd/vsftpd.conf.orig        2018-10-30 19:45:09.000000000 +0000
+++ /etc/vsftpd/vsftpd.conf     2019-05-09 08:51:46.838584788 +0000
@@ -9,7 +9,7 @@
 # capabilities.
 #
 # Allow anonymous FTP? (Beware - allowed by default if you comment this out).
-anonymous_enable=YES
+anonymous_enable=NO
 #
 # Uncomment this to allow local users to log in.
 # When SELinux is enforcing check for SE bool ftp_home_dir
@@ -54,7 +54,7 @@
 #
 # If you want, you can have your log file in standard ftpd xferlog format.
 # Note that the default log file location is /var/log/xferlog in this case.
-xferlog_std_format=YES
+xferlog_std_format=NO
 #
 # You may change the default value for timing out an idle session.
 #idle_session_timeout=600
@@ -112,7 +112,7 @@
 # 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=NO
+listen=YES
 #
 # This directive enables listening on IPv6 sockets. By default, listening
 # on the IPv6 "any" address (::) will accept connections from both IPv6
@@ -121,8 +121,13 @@
 # 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=YES
+port_enable=NO
+pasv_enable=YES
+pasv_min_port=50010
+pasv_max_port=50020
+pasv_address=**.**.**.**

FTPログインユーザ追加

FTPはLinuxユーザーアカウントでログインするため、ログインユーザーを追加する必要があります。今回は ftpuser01 というユーザーを追加します。下記のコマンドを実行してユーザー作成してください。「New password:」が表示されたらFTPユーザーのパスワードを入力します。パスワードは何でもよいですが、インターネットに公開されるためある程度複雑な文字列にすることをお薦めします。

sudo useradd ftpuser01 && sudo passwd ftpuser01

FTPサービス起動

最後に、 FTPサービスの起動を設定します。

sudo systemctl enable vsftpd
sudo systemctl start vsftpd

ここまでの手順で、FTPサーバを使う準備が整いました。

FTPサーバ接続確認

FTPサーバに接続するためにはFTPクライアントソフトウェアを用意する必要があります。
また、今回設定したFTPサーバはパッシブFTPのみ許可しているため、パッシブFTPに対応したFTPクライアントである必要があります。(といっても、今日のFTPクライアントはだいたいパッシブFTPに対応していると思います。)

今回は例としてCyberduckというクライアントソフトウェアを使用して動作確認しました。また、私の端末はWindows10のため、Windows端末の場合の例になります。

1.以下の「Download for macOS or Windows」をクリックします。

2.お使いのOSに合わせて Windows または macOS のインストーラダウンロードリンクをクリックします。この例では「Cyberduck for Windows.」の方をクリックしています。

3.「Cyberduck-installer-****.exe」というファイル(****はその時点のCyberduckのバージョン番号)がダウンロードされます。ダウンロード後、インストーラを起動してインストールを実施します。[Install]ボタンを押すと、管理者権限を求めるユーザーアカウント制御が表示されますので、許可してインストールを続行します。

4.インストールが完了しますと、Windowsの場合スタートメニューに「Cyberduck」が表示されます。うまく見つからない場合は Cortana(タスクバーの検索ボックス)で「Cyberduck」と入力すると見つかります。Cyberduckを起動したら「新規接続」をクリックします。

5.新規接続画面が表示されたら、以下の項目を入力し、「接続」ボタンをクリックします。

  • サーバ … 今回作成したFTPサーバの外部IPアドレス
  • ユーザ名 … FTPサーバログインに使うユーザ名、今回は「ftpuser01」
  • パスワード … ftpuser01 ユーザのパスワード

※「非セキュアなFTP接続」という警告が出る場合がありますが、「続ける」を選択してください

6.以下のような画面が表示されます。試しにCyberduckのインストーラーをアップロードしてみます。「アップロード」ボタンを押してアップロードファイルを選択するか、または、この画面に直接ファイルをドラッグ&ドロップしてください。

7.転送ウィンドウが表示され、アップロードされます。

8.転送ウィンドウを閉じてCyberduckのメインウィンドウを表示すると、以下のように無事アップロードされた状態になっていることがわかります。

GCEにFTPサーバを構築する際のポイント

如何でしたでしょうか?FTPサーバは単純にTCP21番ポートを許可するだけではハマるポイントがあり、以下のような設定を追加で行うことについて紹介しました。

  • パッシブFTPのデータ転送で使用する外部IPアドレスは予約し固定にする
  • TCP21番の他に、パッシブFTPのデータ転送で使用するポートも通信許可する
  • パッシブFTP設定を有効にするために以下のパラメータの設定を行う
    • pasv_min_port
    • pasv_max_port
    • pasv_address

上記の設定に注意して構築すれば、あとはLinuxのFTPサーバの構築に関する設定のみになりますので、オンプレ環境のFTPサーバをGCEに移行することが可能になると思います。

弊社クラウドエースは、こうしたオンプレ環境からのGCP移行も含め様々な技術をもっております。何かお困りのことや、Google Cloud にご興味がある方はぜひご相談ください!

次の記事を読み込んでいます