これは GCPに関するこの質問 に非常に関連していますが、AWSであり、別のアプローチで解決しようとしています。
インターネット上にあるいくつかのftpサーバーにftpアクティブモードで接続しようとしているFTPクライアントがあります。 FTPクライアントにはプライベートアドレスがあり、NATインスタンスサーバー(NATゲートウェイではない)の背後にあります)
このNATサーバーにもプライベートアドレスがあり、それ自体がVPCインターネットGWの背後にあります。
図:
FTPクライアント(10.60.0.0/24)-> NATサーバー(10.254.254.0/24)-> IGW->インターネット->ファイアウォール/ NAT-> FTPサーバー
NATサーバーはAWS NAT Linux(カーネル4.9)で、マスカレードがオンになっています。
Active-FTP(ポートモード)では、これは機能しません。
CT FTPヘルパー(nf_nat_ftp)とそのトリガーiptablesルールを既にアクティブにしました。
iptables -A PREROUTING -t raw -p tcp --sport 1024: --dport 21 -j CT --helper ftp
「PORT」コマンドがFTPクライアントのプライベートIPアドレスからNATサーバーのプライベートIP)に正しく変換されていることがわかります。
残念ながら、これだけでは不十分です。FTPサーバーはまだプライベートアドレス(NATサーバーの1つ)を使用してFTP「PORT」コマンドを受信しているためです。
したがって、ftpサーバーから開始されたftpデータ接続は、もちろん決して戻りません。
少なくとも今のところ、ftpクライアントを「置き換える」ことはできません(これはレガシーアプリケーションの一部です)。
PORTコマンドでパブリックIPを「注入」する方法はありますか?いくつかのアイデアが思い浮かびましたが、それが現実的であるか、時間を無駄にしているのかを証明するものが見つかりませんでした。
パブリックIPアドレスを使用してNATサーバー上に「偽の」インターフェイスを作成し、CTヘルパーを選択的に有効/無効にしてPORTコマンドを変更します。しかし、これの正しいルーティングに問題があります(試してみる価値があると自分自身に納得させることは言うまでもありません)
ハードコードされたパブリックIPを使用してnf_nat_ftpヘルパーモジュールを変更する(とても醜い!)
ftpクライアント(Windowsマシン)でportコマンドを変更し、その目的のためのドライバー/ツールがすでに存在するかどうかわからない
ftpクライアントにブルートパッチを適用する(最も現実的な方法かもしれません...?)
オプション3について: [〜#〜] netsed [〜#〜] 、実際にPORTコマンドを変更できる 、しかし、ftpクライアントのNATを台無しにしているようです! :(
もちろん他の解決策も大歓迎です!
ありがとうございました。
私自身の質問に答えようとしています限られたユースケースで
制限は次のとおりです。NATサーバーの背後にあるアクティブモードのftpクライアントは1つだけです(マスカレードでは機能しません)
まず、NATサーバーのローカルポート21でネットを起動し、「ポート10、60、10、11」を含むすべてのパケットを「ポート1、2、3、4」に変換します(したがって、ポート番号は変更されません)。
./netsed tcp 21 0 0 s/PORT%2010,60,10,11,/PORT%201,2,3,4,
次に、トラフィックをftpクライアントからnetsedにリダイレクトします。
iptables -t nat -A PREROUTING -p tcp --dport 21 -j REDIRECT --to 21
これにより、ftpサーバーは「幸せ」になり、ポート20からパブリックIPへの新しい接続を効果的に開こうとします。 IGWは通過しますが、NATサーバーは接続の処理方法を認識していません(CTにはなく、新しい接続です)。
したがって、醜いの場合は、すべての着信トラフィックをポート20から内部FTPクライアントに転送します。
iptables -t nat -A PREROUTING -p tcp -d 10.254.254.203 --sport 20 --dport 1024:65535 -j DNAT --to-destination 10.60.10.11:1024-65535
これは機能しています!!
ただし、ハッキングの一部であるため、1つのftpクライアントのみに制限されているようです。
CT状態が設定されていないことを指摘してくれた@Steffenに感謝します。
PORTコマンドでパブリックIPを「注入」する方法はありますか?
これが可能であったとしても、これは役に立ちません。サーバーはおそらくパブリックIPアドレスを使用してPORTコマンドを受け入れますが、一致するNAT状態がないため、このIPアドレスとポートを使用してFTPクライアントに接続し直すことはできません。 IGW。
あなたの場合のように2つのNAT(NATサーバーとIGW)がある場合、これらの両方がPORTコマンドでアドレスを変換する必要がありますそして状態を作成しますサーバーから新しく接続を渡すために元のPORTコマンドからIP、portをIP、portに設定します。
FTPから離れて、FTPのように動的なデータ接続を必要としない代替手段を使用することを強くお勧めします。このような動的接続は、NATゲートウェイの1つがPORT/PASVを変換できない場合にのみ問題を引き起こします-おそらくFTPヘルパーがないため、またはFTPSを使用しているため(つまり、FTP TLS)ここで、NATゲートウェイは元のIP、ポートを確認することすらできず、必要に応じて制御接続を変更することもできません。代わりに、SFTP(FTP over SSH)などのプロトコルを使用してください。 NATは、単一のTCP接続のみを使用するため、問題はありません。