CentOSは、iptables(ファイアウォール)の設定が自動的に有効になっており、初期設定では外部からFTPでの接続ができません。

そのため、アクティブモードのFTPアクセスできるようにするには以下のいずれからの方法をとらなくてはなりません。

  • iptablesを無効にする。
  • iptablesにFTP(20、21番ポート)でのアクセスを許可する設定を追加する。

「iptablesを無効にする」方法は前回の記事で行いましたが、サーバーを運用していく上でファイアウォールの機能を無効にするということはセキュリティ対策がまったくできていないということと同意のため、当然ですが、実運用ではやってはいけない行為です。

ですので今回は「iptablesにFTP(20、21番ポート)でのアクセスを許可する設定を追加する」方法について見ていきます。

アクティブモードで使用するポート

iptablesの設定を行う前にアクティブモードでFTPアクセスする際に使用するポート番号について確認しましょう。
FTPアクティブモード使用ポート
上図のようにアクティブモードの場合、FTPサーバー側で使用するポートは20番(送信元ポート)、21番(宛先ポート)で固定となります。

iptablesにFTPアクセス許可設定を追加

まずは現状のファイアウォール(iptables)設定を確認します。

# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

アクティブモードの場合、FTPサーバーで待ち受けるポートは21番になりますので21番ポートの入力(受信)パケットを許可する必要があります。21番ポートを開けるには以下コマンドを実行します。

# iptables -I INPUT 4 -p tcp --dport 21 -j ACCEPT

 ※ルールを挿入する場所は適宜変更してください。上記例では4番目に挿入しています。

データコネクションで20番ポートを使用しますが、その際使用するのはFTPサーバーから見た場合、送信元ポートに当たるため、出力(送信)パケットかつ送信元ポート20番のパケットを許可する必要があります。ただし、今回の例では出力(送信)パケットの制御は何も行っておらず、全て許可する設定となっているため、設定不要です。

続いて、設定を保存します。

# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

最後にiptablesを再起動させて設定は反映させます。

# service iptables restart
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]

以上でアクティブモードにおけるiptablesの設定は完了です。

FTPクライアントからのファイル送信

では早速、FTPサーバーに対してファイルを送信してみましょう。今回もWindows標準のFTP機能を使用して、ファイル送信の確認をします。

Windows標準のFTP機能はコマンドプロンプトから使用します。
(コマンドプロンプトの起動は画面左下のWindowsマークをクリックし「プログラムとファイル検索」欄に「cmd」と入力し、Enterキーを押下します。)

まずは送信するテスト用ファイルを作成します。

> type nul > testfile02

続けて、作成したテスト用ファイルをFTPサーバーに送信します。

C:\Users\user> ftp 172.16.0.10
172.16.0.10 に接続しました。
220 (vsFTPd 2.2.2)
ユーザー (172.16.0.10:(none)): anonymous
331 Please specify the password.
パスワード:
230 Login successful.
ftp> cd /pub/upload
250 Directory successfully changed.
ftp>
ftp> put "C:\Users\user\testfile02" ./testfile02
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.

putコマンドでファイル送信を試みましたが、失敗してしまいました。エラーメッセージからデータコネクションの確立に失敗しているようです。FTPサーバー側のファイアウォールの設定はしたはずですが、なぜでしょう。

それは、FTPクライアント側の設定に問題があります。アクティブモードの場合、ファイル転送用に使用するデータコネクションはFTPサーバーからFTPクライアントに対して接続することを思い出してください。

今回のケースでは、FTPクライアントとなるローカルホストのファイアウォールで、その接続要求がブロックされてしまっていました。

この問題を回避するには、Windowsファイアウォールの設定を変更する必要があります。

Windows7を例にすると、画面左下のWindowsマークをクリックし「コントロールパネル」→「Windows ファイアウォール」→「Windows ファイアウォールを介したプログラムまたは機能を許可する」をクリックします。

Windowsファイアウォール設定

「許可されたプログラムおよび機能」で「ファイル転送プログラム」にチェックが入っていることを確認し、入っていなければチェックを入れます。

これで、データコネクションも確立できるようになったはずです。

ではもう一度、ファイル送信してみます。

ftp> put "C:\Users\user\testfile02" ./testfile02
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.

今度はうまくいきました。

アクティブモードの問題

実際にアクティブモードでFTP送信を行ってみましたが、その過程でアクティブモードの問題が垣間見えたのではないでしょうか。

その問題とは、アクティブモードの場合、FTPクライアント側のファイアウォール設定を変更しないといけないということです。

FTPでファイルの送受信するのはパソコンに詳しい人だけではありませんのでファイアウォールの設定を変更させるということは簡単なようで敷居は高いです。例えば、以下のような構成となっているケースを考えてみます。

ネットワーク構成例

今回の例ではWindowsファイアウォールだけの設定変更で済みましたが、上図構成の場合はルータの設定も変更してやらなくてはいけません。例えば会社のネットワーク機器の設定を一般社員が変更することは社内の管理体制上の理由でできないのが普通です。仮に設定変更できたとしてもセキュリティを緩めてしまうことになります。

そもそも、FTPサーバーからFTPクライアントへの接続要求が必要なのが問題なのです。FTPサーバーからの逆接続をやめて、接続要求はあくまでFTPクライアントからとすることが理想です。

そこで登場するのがパッシブモードです。
パッシブモードでは接続要求を出すのはFTPクライアントからのみとなり、上記の問題を解決します。最近では、セキュリティを考慮してパッシブモードが使われることが多いです。

次回は、iptablesでパッシブモードでのFTPを許可する方法について見ていきます。