FTPなんもわからん

問題文

概要

あなたが所属している会社で後輩が「FTPなんもわからん」と嘆いています。

NAT配下でのFTPサーバの検証をしているんですが、FileZillaからどうしても接続できないんです。先輩助けてください。

後輩を助けてあげてください。

前提条件

  • FileZillaがインストールされた後輩の検証環境にはVNCで接続できる
  • FTP ServerはRouterのNAT下におり、踏み台サーバからは直接アクセスできない
  • FTP ServerはRouterを踏み台にしてSSHできる
  • FileZillaで入力するFTPサーバのアクセス情報は下記の通り
HostUsernamePassword
192.168.10.1userictsc2020

初期状態

  • FileZillaでFTP ServerにFTP接続すると、下記のようにエラーが発生する
Error: The data connection could not be established: ENCONNREFUSED - Connection refused by server

終了状態

  • VNC Server上のFileZillaを用いて、FTP ServerにFTP接続し、ファイルのアップロード及びダウンロードが実行できる
  • 適切な問題の原因と解決法が回答に記載されている

トポロジ

トポロジ

解説

第1の問題

この問題はFTP ServerがPASVコマンドの応答として、0.0.0.0をクライアントに返答していたことが主な原因です。vsftpdがIPv6で動作する設定になっているとこのような現象が発生します。

この現象の解決方法として2通りあります。

1) vsftpdをIPv4のみで動作させる

/etc/vsftpd.conflisten=NOlisten=YESに、listen_ipv6=YESlisten_ipv6=NOに変更し、IPv4のみでvsftpdを再起動すると正しいパッシブアドレスを通知するようになります。

user@ftp:~$ diff -u /etc/vsftpd.conf{.org,}
--- /etc/vsftpd.conf.org    2021-03-07 12:14:47.218160952 +0900
+++ /etc/vsftpd.conf    2021-03-07 12:14:23.443283890 +0900
@@ -11,7 +11,7 @@
 #
 # Run standalone?  vsftpd can run either from an inetd or as a standalone
 # daemon started from an initscript.
-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
@@ -19,7 +19,7 @@
 # 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.
-listen_ipv6=YES
+listen_ipv6=NO
 #
 # Allow anonymous FTP? (Disabled by default).
 anonymous_enable=NO

2) FileZillaからアクティブモードで接続する

今回の構成では、FTP ServerからVNC Server(FTPクライアント)までは自由に接続ができる状態ですので、File Zillaの設定を変えてアクティブモードで接続することによっても解決可能です。

第2の問題

前述の方法でFTP接続を行っても、まだファイルのアップロードができません。これはvsftpd.confにおいて#write_enable=YESとコメントアウトされているためです。write_enable=YESに変更してファイルの書き込みを許可します。

最終的なvsftpd.confの差分は以下のようになります。

user@ftp:~$ diff -u /etc/vsftpd.conf{.org,}
--- /etc/vsftpd.conf.org    2021-03-07 12:22:25.287108937 +0900
+++ /etc/vsftpd.conf    2021-03-07 12:21:03.346616102 +0900
@@ -11,7 +11,7 @@
 #
 # Run standalone?  vsftpd can run either from an inetd or as a standalone
 # daemon started from an initscript.
-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
@@ -19,7 +19,7 @@
 # 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.
-listen_ipv6=YES
+listen_ipv6=NO
 #
 # Allow anonymous FTP? (Disabled by default).
 anonymous_enable=NO
@@ -28,7 +28,7 @@
 local_enable=YES
 #
 # Uncomment this to enable any form of FTP write command.
-#write_enable=YES
+write_enable=YES
 #
 # Default umask for local users is 077. You may wish to change this to 022,
 # if your users expect that (022 is used by most other ftpd's)

第1の問題を解決して満足したのか、終了条件のファイルのアップロード及びダウンロードが実行できるを確認しなかったチームが数チームありました。

パッシブアドレスについて(余談)

FTP Serverが通知しているパッシブアドレスはvsftpd.confで設定されているとおり、172.16.0.2です。本来であればFTP ServerのこのアドレスはNAT配下におり、この問題の構成ではVNC Server(FTPクライアント)から接続することはできません。

user@ftp:~$ tail /etc/vsftpd.conf
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO

#

# Uncomment this to indicate that vsftpd use a utf8 filesystem.

#utf8_filesystem=YES

pasv_min_port=1024
pasv_max_port=1124
pasv_address=172.16.0.2

ところが実際にパケットキャプチャを実施すると以下のようになります。

FTP Server -> Router(Routerの172.16.0.1のインタフェース)

30 7.559306 172.16.0.2 192.168.10.2 FTP 112 Response: 227 Entering Passive Mode (172,16,0,2,4,29).

Router -> VNC Server(Routerの192.168.10.1のインタフェース)

70 5.750541 192.168.10.1 192.168.10.2 FTP 114 Response: 227 Entering Passive Mode (192,168,10,1,4,84).

パケットキャプチャの結果からわかるように、Routerがパッシブモードで通知するアドレスの変換を実施しています。カーネルモジュールのnf_nat_ftpがロードされている場合こういった変換が行われるようです。

このモジュールをアンロードして再度パケットを見てみると下記のように変換が実施されないことがわかります。

user@router:~$ sudo rmmod nf_nat_ftp

Router -> VNC Server(Routerの192.168.10.1のインタフェース)

421 46.928655 192.168.10.1 192.168.10.2 FTP 112 Response: 227 Entering Passive Mode (172,16,0,2,4,20).

そのため今回の問題ではvsftpd.confのpasv_address=172.16.0.2を編集する必要はありませんが、実際の運用においてはハマりどころの一つなのでぜひ頭の片隅入れておいてください。