当社のルータシステムには、WANインターフェイスに複数のパブリックIP(/ 27)があります。それでは、特定の組み合わせに一致するdport
dnatsaddr
ルールを追加したいと思いますdaddr
。私の夢はこんな感じです。
map one2one_dnat {
# dst_addr . src_addr . proto . dst_port : dnat_to . dnat_to_port
type ipv4_addr . ipv4_addr . inet_proto . inet_service : ipv4_addr . inet_service
flags interval
counter
comment "1-1 dnat"
elements = {
42.42.42.5 . 0.0.0.0/0 . tcp . 8888 : 10.42.42.5 . 8888
}
}
# And then later in a chain
ip daddr . ip saddr . ip protocol . th dport dnat to @one2one_dnat
しかし、結果は次のようになります。
root@XXX# nft -c -f assembled.nft
assembled.nft:252:59-60: Error: syntax error, unexpected to, expecting newline or semicolon
ip daddr . ip saddr . ip protocol . th dport dnat to @one2one_dnat
^^
次の構文例は機能します(ただし、意図された高度なオールインワンマップには該当しません)。
dnat ip addr . port to ip saddr . tcp dport map { 42.42.42.5 . 8888 : 10.42.42.5 . 8888}
# And even with saddr restrictions
ip saddr 0.0.0.0/0 dnat ip addr . port to ip saddr . tcp dport map { 42.42.42.5 . 8888 : 10.42.42.5 . 8888}
どんなアイデア/提案でも高く評価いたします。
答え1
アイデアはここにありますが、名前付きマッピングケースには無効な構文を使用し、匿名マッピングケースには正しい構文を使用します。
見つかった場合、マップはキーをその値に置き換えます(または式がfalseと評価され、追加の処理が停止します)。dnat
という地図を使ってルールにもよキーと値のペア正しい構文を使用する必要があります。key map @keytovalue
. これら 3 つの部分は、パケットの属性に基づく値に置き換えられ、ルールの他の部分で使用されます。
OPの試みは、次の構文に従わない。
ip daddr . ip saddr . ip protocol . th dport dnat to @one2one_dnat
次のように書く必要があります。
dnat to ip daddr . ip saddr . ip protocol . th dport map @one2one_dnat
ここでは驚くことではありません。匿名マッピングで正常に使用されたOP構文と同じです。キー(接続で構成)、キーワード、map
マップ参照(匿名ケースの定義)が続きます。dnat [to]
結果 ip:port 値のコンシューマになります(一致する場合のみ)。
追加のコメント。
他の読者には、この内容も十分に最近の内容でなければなりません。nftablesNATを実行するために、ユーザーモードとカーネル部分の両方が以下をサポートします。nftables 0.9.4およびLinuxカーネル5.6:
関連付けられたNATマッピングを使用します。これアドレスとポートを指定できます。マップでNATを変更する場合。
nft add rule ip nat pre dnat ip addr . port to ip saddr map { 1.1.1.1 : 2.2.2.2 . 30 }
名前付きセットでこの新機能を使用することもできます。
nft add map ip nat destinations { type ipv4_addr . inet_service : ipv4_addr . inet_service \; } nft add rule ip nat pre dnat ip addr . port to ip saddr . tcp dport map @destinations
type
構文を次のように置き換えます。typeof
文法的エッジシリアル接続、一般的に読みやすく、関連するすべての型名を把握する必要はありません。そのうちのいくつかは正しく文書化されておらず、現在のOPの場合には適用されないようです。ip protocol
の使用はth
mapとAの競合で動作するようです。間のルールは、少なくともnftables 1.0.7とカーネル6.1.xに適用されます。したがって、typeof
ここで使用または保管しないことをお勧めしますtype
。それ以外の場合、この競合を避けるために、マッピングをUDP用とTCP用の2つの別々のマッピングに分割します。
同様のIPv6設定も分割する必要があります。ip6 nexthdr
使用に安全ではありません代替ip protocol
と正しい代替meta l4proto
も協力しません。