Private network から少なくとも Passive で FTP を使いたくてずっと悩んでいたのだが以下で解決した.
% echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper
これをしないと modprobe nf_nat_ftp
や modprobe nf_conntrack_ftp
していても,これらの機能が働かない.他の iptables の設定は以下の通り.
iptables -F
iptables -t nat -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
つまり,基本 DROP で,特定のポートのみ以下で開けていく方式で運用している.
iptables -A FORWARD -i <interface> -s <network> -p tcp --dport <port> -j ACCEPT
Passive mode の場合は nf_conntrack_ftp
が使われて,PASV
コマンドをクライアントからサーバに送ったあとにサーバから返ってくるサーバの使用ポート番号向けのポートが自動で開く(RELATED として INPUT が許可される).
Active の場合は nf_nat_ftp
が使われて,PORT
コマンドでクライントからサーバに通知する情報が適切にNATで変換される.つまりプライベートネットワークから送出した PORT 10,0,0,X,202,171
といったコマンドが,NAT で PORT <Global IP>,202,171
に変換されてサーバに転送され,同時にサーバの IP address からの source port 20, destination port 50428 (= 202<<8 + 171)
のパケットが通るようになる.
ちなみに FTPS (FTP over TLS) も ftp と同じ 21番ポートを利用するが,通信が暗号化されてしまうので,上記のような変換等は全く効かない(そのサーバ向けに使いそうなポートを全開放するしかないっぽい).
以上,tcpdump
と iptables
ならびに lftp
を駆使して探ったのだが,以下 lftp
メモ.
open
しても実際にデータの転送(ls とか)がない限りは通信が発生しないdebug <level>
で debug verbosity を指定(もしくはlftp -d
で起動)- default は passive-mode.active にするには
set ftp:passive-mode off
とする - default は
set ftp:ssl-allow on
となっており,FEAT
コマンドでAUTH TLS
が返ってくると SSL 通信を行う.
Bool値としてはいろいろ使えるらしい(以下 man lftp
より).
Boolean settings can be one of (true, on, yes, 1, +) for a True value or one of (false, off, no, 0, -) for a False value.