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
すでに私この質問は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の使用源泉ポート20、決して目的地ポート 20. nf_conntrack_ftp/nf_nat_ftp はすでにこれを処理しています。 NAT 関連の接続をまったく試みないでください。それがアシスタントの使命です。
ファイアウォールを使用している場合は、ファイアウォールルール(filter
いいえnat
)には一般的なルールが必要です-m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
(長期的な解決策については、これに関するブログもお読みください)。たぶん、すべてのルールを設定していないか、ファイアウォールを使用していない可能性があります。