やるきなし

2017/12/27 23:38 / FTP の NAT 超え

Private network から少なくとも Passive で FTP を使いたくてずっと悩んでいたのだが以下で解決した.

% echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper

これをしないと modprobe nf_nat_ftpmodprobe 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番ポートを利用するが,通信が暗号化されてしまうので,上記のような変換等は全く効かない(そのサーバ向けに使いそうなポートを全開放するしかないっぽい).

以上,tcpdumpiptables ならびに lftp を駆使して探ったのだが,以下 lftp メモ.

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.

Related articles