Stateless NATでポート番号に基づいてNATを実行するには?

Stateless NATでポート番号に基づいてNATを実行するには?

あるIP:ポートペアで受信したRTPパケットを別のIP:ポートペアに転送したいと思います。私はiptablesでこれをしました。 iptables は conntrack モジュールを使用します。しかし、私のアプリケーションにはconntrackは必要ありません。だから私はStateless NATを使ってこれをしたいと思います。 「ip Route add nat」コマンドを使用してステートレスNATルールを実行できることがわかりました。

ip route add nat 205.254.211.17 via 192.168.100.17

このコマンドは、205.254.211.17に送信されたすべてのパケットに対してネットワークアドレス変換を実行するようにカーネルに指示します。 viaパラメータは、NATコードに205.254.211.17にバインドされたパケットを新しい宛先アドレス192.168.100.17に書き換えるように指示します。

私が理解したのは、問題は、これが205.254.211.17に向かうすべてのパケットを192.168.100.17に転送することです。 205.254.211.17特定のポートで受信したRTPパケットを別のIP:ポートに転送するオプションはありますか?

ベストアンサー1

渡すパケットヘッダフィールドの変更そしてnftablesip route add natレイヤ4(TCP、UDP、...)ではなくレイヤ3(IP)に制限されている単純なルータ機能として使用しないことも可能です。

警告:nftables> = 0.6(notrackを使用している場合> = 0.7)とカーネル> = 4.10が必要です。ここでは、nftables 0.8.3とカーネル4.15.xを使ってテストしました。

nftablesは複数のターゲットを組み合わせることができるので非常に簡単です(ここには3つのターゲットがあります)。

# nft add table raw
# nft 'add chain raw prerouting {type filter hook prerouting priority -300;}'
# nft add rule raw prerouting ip daddr 205.254.211.17 udp dport 5004 notrack ip daddr set 192.168.100.17 udp dport set 5006

シェルの解釈を避けるために2行目を引用しました。テストしている場合は、すべてのnftを削除する最速の方法はnft flush ruleset

したがって、読み取るだけでルールは、宛先が205.254.211.17のIPパケット(ポート5004が宛先であるUDP)のみを選択するように指示します。追跡不可能としてマーク(ロードされている場合はconntrack経由)宛先IPを192.168.100.17に設定し、宛先ポートを5006に設定します。

両方のテーブルで同時にテーブルを使用しない限り(とにかくテーブルを使用したくありませんが)、nftables問題なくルールを混在させることができます。明確に表現できるiptablesnatチェーン優先順位rawnftables フックが対応する iptables フックの前または後に実行されるかどうかを選択することもできます。たとえば、必要に応じて、ここで -301 または -299 を選択して、iptables テーブルの前または後に実行することができます。

おすすめ記事