柏崎@北海道です.

pf を使ったパケットフィルタリングをしていて,外部の ftp サイトへと
ftp コマンドで接続すると,プロンプトまではでるのですが ls コマンド
を発行すると 229 Entering Extended Passive Mode と表示されたまま,
最終的に 421 Service not available, remote server has closed 
connection. で終わります.

この ftp 問題に対処するべく ftp-proxy を inetd 経由で呼び出し,pf
からはリダイレクトするようにしたのですが,どうにもうまく接続できま
せん.というところで皆様のお知恵を拝借したく.環境は FreeBSD 7.1
です.

まずは pf.conf から.

 % cat pf_ftp-proxy_test.conf
 ext_if = "em0"
 
 ext_addr = "192.168.121.128"
 
 tcp_services = "{ domain, ftp, auth, 8021 }"
 udp_services = "{ domain, ntp }"
 
 rdr on $ext_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021
 
 block in log all
 block out log all
 
 pass out proto tcp to any port $tcp_services keep state
 pass proto udp to any port $udp_services keep state
 pass in inet proto tcp from any to $ext_addr port { ssh } keep state
 pass in inet proto tcp from any to 127.0.0.1 port { 8021 } keep state

inetd.conf では

 % grep ftp-proxy inetd.conf
 127.0.0.1:8021 stream tcp nowait root /usr/sbin/ftp-proxy ftp-proxy

としておりまして,とある ftp サーバに接続しますと

 % ftp 133.87.4.40
 Connected to 133.87.4.40.
 220 ProFTPD 1.3.0 Server (Debian) [133.87.4.40]
 Name (133.87.4.40:reo): reo
 331 Password required for reo.
 Password:
 230 User reo logged in.
 Remote system type is UNIX.
 Using binary mode to transfer files.
 ftp> ls
 229 Entering Extended Passive Mode (|||35483|)
 421 Service not available, remote server has closed connection.
 ftp>

と,229 Entering Extended Passive Mode (|||35483|) で1分ほど沈黙した後
421 となります.この時,pflog には

 17. 315549 rule 1/0(match): block out on em0: 192.168.121.128.61324 > 
133.87.4.40.35483: [|tcp]

が出力されます.pfctl -d で pf を無効化した後は問題なく接続できます.

 % sudo pfctl -d
 pf disabled
 % ftp 133.87.4.40
 Connected to 133.87.4.40.
 220 ProFTPD 1.3.0 Server (Debian) [133.87.4.40]
 Name (133.87.4.40:reo): reo
 331 Password required for reo.
 Password:
 230 User reo logged in.
 Remote system type is UNIX.
 Using binary mode to transfer files.
 ftp> ls hoge
 229 Entering Extended Passive Mode (|||54282|)
 150 Opening ASCII mode data connection for file list
 drwxr-xr-x   2 reo      reo          4096 Apr 14 11:28 .
 drwxr-xr-x  15 reo      reo          4096 Apr 14 11:28 ..
 226 Transfer complete.
 ftp>

また,例えば ftp4.jp.freebsd.org に接続した時などは pf が有効であって
も問題なく接続できることから,そもそも着眼点が違う ? という気がしない
でもありません.ftp サーバ側の問題なのか…… ?

 % sudo pfctl -e
 pf enabled
 % ftp ftp4.jp.freebsd.org
 Connected to ftp.sakura.ad.jp.
 220 FTP Server ready.
 Name (ftp4.jp.freebsd.org:reo): anonymous
 331 Anonymous login ok, send your complete email address as your password
 Password:
 230 Anonymous login ok, restrictions apply.
 Remote system type is UNIX.
 Using binary mode to transfer files.
 ftp> ls
 229 Entering Extended Passive Mode (|||38612|)
 500 Illegal EPRT command
 200 PORT command successful
 150 Opening ASCII mode data connection for file list
 drwxr-xr-x   3 ftp      ftp          4096 Oct 14  2008 .
 drwxr-xr-x   3 ftp      ftp          4096 Oct 14  2008 ..
 drwxr-xr-x  11 ftp      ftp          4096 Dec 22 03:11 pub
 226 Transfer complete
 ftp>

ということで,混乱しきっている私の脳みそに手を差し伸べていただければ
幸いです.

-- 
柏崎 礼生 (Hiroki Kashiwazaki)@HUIST
Assistant Professor @ Graduate School of Information Science and
Technology, Hokkaido University
mailto:r...@iic.hokudai.ac.jp
Tel:+81-11-706-2056 (Office), +81-11-706-2998 (Takai Lab.)

メールによる返信