web-dev-qa-db-ja.com

UDPのiptablesリダイレクトルールが機能しない

着信IP:PORTから同じLinuxボックス上の他のポートへのsyslogUDPトラフィックのリダイレクトを作成しようとしています。その目的は、サーバー上の異なるIPアドレスに送信されるトラフィックを、宛先アドレスに応じてより高いポート番号で実行されているサービスにルーティングすることです。

OS:RHEL 7.2

ルール:

iptables -A PREROUTING -t nat -p udp --dport 514 -d A.D.D.R -j REDIRECT --to-port 1514

デバッグのために私もテストしました:

iptables -A PREROUTING -t nat -p udp --dport 514 -d A.D.D.R -j LOG --log-prefix "SYSLOG_REDIRECT"

iptables -t nat -L -v -n 

カウンターに0が表示され、ログは記録されません

tcpdumpは、入力ポート514で着信するトラフィックを表示します

宛先IPアドレス(A.D.D.R)がサブインターフェイス/エイリアスインターフェイスenoXXXX:1に割り当てられます

誰かが同様のケースを持っていますか?

3
mrbeat

あなたのNATルールは正しいようで、あなたが期待したことをするはずです。しかし、それがあなたのUDPトラフィックがリダイレクトされない理由であると私が信じていることを確認する1つのポイントがあります。

UDPトラフィックのリダイレクトは、TCPのリダイレクトよりも注意が必要です。これは主に、TCPはコネクション型プロトコルであり、UDPはコネクションレス型であるためです。

NATルールは、「connection」の状態を追跡する接続追跡モジュールに依存しています。 TCPの場合、新しい接続を示す特別なTCPパケットがあるため、それが何を意味するかは明らかです。UDPでは、接続確立フェーズはありません。あなたのボックスが最初のパケットを見ると、それは "connection"を開始すると見なされ、応答パケットは "接続が確立されました "。

接続を閉じるのはどうですか? TCPでは、TCPは接続が閉じたことを示すために特別なフラグを使用するため、これも明らかです。表示されると、ボックスはそれらを利用でき、接続状態を適宜クリアします。ただし、UDP "connection"がいつ終了するかはわかりません。そのため、接続トラックエントリは、 UDPパケットなしでタイムアウトに達しました(私のマシンでは180秒に設定されています)。

これは問題とどのように関連していますか?ボックスがsyslogのUDPトラフィックを継続的に受信している場合、UDPの「接続」タイムアウトは期限切れにならず、接続状態は常に保持されます。 NATルールしない]接続追跡テーブルに状態がある限り適用されます。

新しいNATルールを強制する方法?以下のコマンドを使用して、接続追跡エントリを手動で削除することができます(他のパラメータなしで使用しないでください)。テーブル全体を空にして、現在の接続をすべて中断します。その他のパラメータについては、マニュアルを確認してください。

$ Sudo conntrack -D
0
Khaled