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

Active モードでコネクションを張る場合、クライアントは、制御用のコネクションを通して FTP サーバーへランダムなポート番号を伝えます。そして、FTP サーバーは通知されたクライアントのポート番号に対して接続要求を出します。したがって、内部のホストが外部の Anonymous FTP サーバーなどとコネクションを張るには、以下の条件を満たすルールを設定しなければなりません。
外部ホストの 20 番ポートから内部ホストのランダムポート宛へのパケットを許可する
しかし、このルールを許可すると、ランダムなポート番号を使用している他の内部サーバーへの接続も可能になってしまいます。そこで、コネクショントラッキング機能を利用すると、FTP サーバーに通知した IP アドレスとポート番号を記憶し、そのパケットだけを許可できるようになります。
ここでは以下のネットワーク環境を例に解説します。

ホスト gateway は、インターネットと LAN を分離するゲートウェイとして動作しており、LAN 上のクライアントは、IP マスカレードによりインターネットに接続できます(IP マスカレードについては、項21.7 を参照)。そして、これらのネットワークインターフェイス間を通過するパケットを iptables でフィルタリングしています。当然のことながら FORWARD チェインのデフォルトポリシーは DROP に設定しているため、パケットの通過を許可する設定が必要になります。
はじめに、コネクショントラッキング機能を有効にするには、ip_conntrack_ftp モジュールをロードする必要があります。また、上図のように IP マスカレードを使用している場合は、ip_nat_ftp モジュールもロードします。
# modprobe ip_conntrack_ftp # modprobe ip_nat_ftp |
これらのモジュールを Turbolinux 10 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 サーバーからクライアントへの応答パケットを許可します。 |