Nftables:ソースアドレス制限があり、マッピングが1つしかないDnat

Nftables:ソースアドレス制限があり、マッピングが1つしかないDnat

当社のルータシステムには、WANインターフェイスに複数のパブリックIP(/ 27)があります。それでは、特定の組み合わせに一致するdportdnatsaddrルールを追加したいと思います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の使用はthmapとAの競合で動作するようです。間のルールは、少なくともnftables 1.0.7とカーネル6.1.xに適用されます。したがって、typeofここで使用または保管しないことをお勧めしますtype。それ以外の場合、この競合を避けるために、マッピングをUDP用とTCP用の2つの別々のマッピングに分割します。

同様のIPv6設定も分割する必要があります。ip6 nexthdr使用に安全ではありません代替ip protocolと正しい代替meta l4protoも協力しません。

おすすめ記事