vsftpd の PASV モードで使用するポートの範囲を制限する (CentOS 5.5) : Linux の使い方


アクティブモードとパッシブモード

FTP 通信では、制御コマンドのやりとりを行うために、FTP サーバー側の 21/TCP へ接続します。その上で、さらにデータ転送用の接続をもう 1 つ作って、それを使ってファイルのデータを転送するという方式を取っています。

この、データ転送用の接続を作る方法として、FTP では "アクティブモード" と "パッシブモード" の 2 つの方法が用意されています。

 

例えばアクティブモードでは、ファイルのデータを転送するのに、FTP サーバー側の 20/TCP から FTP クライアント側の、クライアントが指定した任意のポート番号に対して接続を試みることになります。

これが昔ながらの FTP のデータ転送方法だったと思うのですけど、NAPT (Network Address Port Translation) が一般的になった今日では、サーバー側からクライアント側へ接続を確立するという方向が、通常の流れとは逆のため、特殊なケースになってきます。

もっとも、FTP のアクティブモードに対応した NAPT がほとんどなので、通常はそれで何か問題が発生するということは少ないのですけど、これが FTPS のように通信内容が暗号化されてしまうと対応が難しくなってきます。

アクティブ FTP 対応のルーターは FTP 通信の内容を監視して正しいアドレス変換が行えるように対処している都合、FTPS などにより通信が暗号化されてしまえば、普通に考えて、ルーター側で通信内容を監視するだけでは、どうにもならなくなってしまいます。

 

これに対してパッシブモードでは、ファイルのデータを転送するのに、FTP サーバー側が指定した任意のポートへ FTP クライアントが接続するという形に変わります。

クライアントがサーバーへ接続するという流れはとても自然なので、これであれば NAPT 環境が影響をすることはないため、NAPT が FTP の通信を監視して適切な対処を取ってくれるようになるまでの間、FTP を正常動作させるために良く採られた方法だったように思います。

ただ、パッシブモードの場合、FTP サーバーが指定した "任意のポート" へ FTP クライアントの "任意のポート" からの接続要求がある都合、パケットフィルター等で通信制限をかけているような場合には、通信制御が難しくなるという難点もあったように思います。

その場合、パッシブモードでサーバーがクライアントに示す接続用のポート番号の範囲を限定的にすることができる FTP サーバーソフトウェアであれば、パケットフィルターで解放しなければならない範囲を最小限にするといったことも可能になります。

 

vsftpd の PASV モードでの使用ポートを限定する

CentOS 5.5 では FTP サーバーとして "vsftpd" が利用できるようになっています。vsftpd では、パッシブモードで使用されるポート番号の範囲を予め指定できるようになっていますので、今回はその設定をやってみたいと思います。

vsftpd でパッシブモードで使用されるポート番号の範囲を設定するには、"/etc/vsftpd/vsftpd.conf" 内で、次のように設定します。

pasv_min_port=60000

pasv_max_port=60100

このように設定して vsftpd を再起動することで、vsftpd が FTP クライアントへ指定するパッシブモード接続先ポート番号が 60000 から 60100 の範囲に制限されます。

つまり、これでたとえば iptables などによって、--dport 60000:60100 というようにすることで、最小限のパケットフィルター開放で制御ができるようになります。