22.4. FTP プロトコルのフィルタリングルール

FTP プロトコルは、コントロールコネクション(制御用)のポート 21 番とデータコネクション(転送用)のポート 20 番の 2 つのポートを使用します。さらに FTP プロトコルはコネクションの張り方にも特徴があり、通常、コネクションはクライアントからサーバーへ向けて張られるのに対し、FTP プロトコルのデータコネクションは、サーバーの 20 番ポートからクライアントのランダムポートに向けてコネクションが張られます。このようなコネクションの張り方を Active モードと呼びます。なお、クライアントからサーバーに向けてコネクションを張ることも可能で、こちらは Passive モードと呼ばれます。

Active モードでコネクションを張る場合、クライアントは、制御用のコネクションを通して FTP サーバーへランダムなポート番号を伝えます。そして、FTP サーバーは通知されたクライアントのポート番号に対して接続要求を出します。したがって、内部のホストが外部の Anonymous FTP サーバーなどとコネクションを張るには、以下の条件を満たすルールを設定しなければなりません。

しかし、このルールを許可すると、ランダムなポート番号を使用している他の内部サーバーへの接続も可能になってしまいます。そこで、コネクショントラッキング機能を利用すると、FTP サーバーに通知した IP アドレスとポート番号を記憶し、そのパケットだけを許可できるようになります。

ここでは以下のネットワーク環境を例に解説します。

ホスト gateway は、インターネットと LAN を分離するゲートウェイとして動作しており、LAN 上のクライアントは、IP マスカレードによりインターネットに接続できます(IP マスカレードについては、項22.7 を参照)。そして、これらのネットワークインターフェイス間を通過するパケットを iptables でフィルタリングしています。当然のことながら FORWARD チェインのデフォルトポリシーは DROP に設定しているため、パケットの通過を許可する設定が必要になります。

はじめに、コネクショントラッキング機能を有効にするには、ip_conntrack_ftp モジュールをロードする必要があります。また、上図のように IP マスカレードを使用している場合は、ip_nat_ftp モジュールもロードします。

# modprobe ip_conntrack_ftp
# modprobe ip_nat_ftp

これらのモジュールを Turbolinux 11 Server の起動時にロードするには、/etc/rc.local に以下の記述を追加しておきます。

modprobe ip_conntrack_ftp
modprobe ip_nat_ftp

LAN 上のクライアントが外部 FTP サーバーとのコネクションを Active モードで確立できるようにするには、以下のようなルールを設定する必要があります。なお、データコネクションは --state RELATED で指定することができます。

# iptables -A FORWARD -i eth0 -m state --state NEW -j ACCEPT
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

ティップ

Passive モードでコネクションを張る場合は、コネクショントラッキング機能を利用する必要ありません。一般的なサービスと同じように、クライアントから FTP サーバーへのパケット(TCP/20、TCP/21)と、FTP サーバーからクライアントへの応答パケットを許可します。