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 についてご存じ無い方は、以下の記事が役に立つと思いますのでご一読をお願いします。
最初に 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 にご興味がある方はぜひご相談ください!