web-dev-qa-db-ja.com

iptables / netfilter:「nf_nat_ftp」は最近のLinuxカーネルではうまく機能していません

Ubuntu-16.04.02-LTEに組み込まれているLinuxカーネル4.10-28-genericで次の問題に直面しています。私のマシンには2つのイーサネットアダプタ、つまり次のものがあります。

enp0s3:198.168.56.2(内部ネットワーク)
enp0s8:172.22.181.41(外部ネットワーク)

Enp0s3に接続されている内部ネットワークには、enp0s8を介して接続されている外部ネットワークからアクセスしたいFTPサーバーとTelnetサーバーがあります。
FTPモードがアクティブであることが要求されています。

このタスクを実行するために、次のiptablesルールを使用します。

modprobe nf_conntrack_ftp  
modprobe nf_nat_ftp  
sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"  

## Masquerade settings
iptables -A POSTROUTING -t nat -o enp0s3 -j MASQUERADE
iptables -A POSTROUTING -t nat -o enp0s8 -j MASQUERADE  

## ftp rules
iptables -t nat -I PREROUTING  -p tcp -m tcp --dport 20         -i enp0s8 -j DNAT --to-destination 192.168.56.2:20 
iptables -t nat -I PREROUTING  -p tcp -m tcp --dport 21         -i enp0s8 -j DNAT --to-destination 192.168.56.2
iptables -t nat -I PREROUTING  -p tcp -m tcp --dport 1024:65535 -i enp0s8 -j DNAT --to-destination 192.168.56.2:1024-65535

## telnet rules
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 23 -i enp0s8 -j DNAT --to-destination 192.168.56.2`

これらのルールは、Linuxカーネル2.6.32-38-genericを搭載したUbuntu-10で正常に機能しますが、新しいカーネルデータ接続を確立できません。クライアントがPORTコマンドを発行すると、サーバーはのIPアドレスを受け取ります。内部ネットワークではなく、外部ネットワーク。サーバー側で実行されている「netstat」によると、モジュール「nf_nat_ftp」はうまく機能していないようです。つまり、クライアントのIPアドレス(外部アドレス)を入力インターフェイスenp0s8(内部アドレス)のIPアドレスに置き換えていません。コマンドをサーバーに転送します。このため、サーバーは外部IPアドレス(SYN状態)との接続を確立しようとしてスタックします。
FTPがパッシブモードで動作し、Telnet接続でも問題ありません。

この問題を克服するための提案をお願いします。それはリグレッションですか、それともいくつかの新しい要件に従ってiptablesルールを変更する予定ですか?

前もって感謝します!

よろしく、ステファノ

1
Stefano

私はすでに superuser.comで答えました

基本的に、新しいカーネル(> = 4.7)は、明示的なルールを優先して、自動ヘルパーモジュールのポート割り当てを廃止しています。

古い動作を取得するための短い修正:

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

より良い長期的な修正(より多くの作業が必要ですが、より良い制御を提供します):

詳細については、iptables-extensions(8)のマニュアルページにあるCTターゲットの説明を参照してください。

例については、このブログも読んでください。

https://home.regit.org/netfilter-en/secure-use-of-helpers/

重要な注意:FTPルールの多くは意味がありません(2番目のルールのみが必要です)。たとえば、そのような--dport 20はありません。これまで。アクティブFTPはsourceポート20を使用し、destinationポート20は使用しません。nf_conntrack_ftp/nf_nat_ftpは、これらすべてをすでに処理しています。関連する接続をNAT変換しようとしないでください。それがヘルパーの仕事です。

ファイアウォールを使用している場合、ファイアウォールルール(filterではなくnat)では、通常の-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPTのみが必要です(ただし、長期的な解決策については、これについてのブログも読んでください)。おそらく、すべてのルールを設定しなかったのでしょうか、それともファイアウォールを使用しなかったのでしょうか。

3
A.B