1

Python の nftables JSON API を使用してマップ要素を動的に追加しようとしています。私のファイアウォールでは、ファミリのrouterテーブルに次のマップがあります。ip

map port_forwards {
    type inet_service: ipv4_addr . inet_service;
}

これが私がやろうとしていることの最小限の例です:

import nftables

nft_cmd = {"nftables": [
    { "add": { "element":{
        "family": "ip",
        "table": "router",
        "name": "port_forwards",
        "elem": { "map": {
            "key": "80",
            "data": "172.16.0.1 . 80"
        }}
    }}}
]}

nft = nftables.Nftables()
nft.json_validate(nft_cmd)
rc, _output, error = nft.json_cmd(nft_cmd)
if rc != 0:
    raise RuntimeError(f"Error running nftables command: {error}")

これにより、次のエラーが発生します。

RuntimeError: Error running nftables command: internal:0:0-0: Error: Unexpected JSON type object for immediate value.

internal:0:0-0: Error: Invalid set.

internal:0:0-0: Error: Parsing command array at index 0 failed.

どういうわけか仕様を誤解していると思いますが( https://manpages.debian.org/unstable/libnftables1/libnftables-json.5.en.html )、正しい使用法がわかりません。

nft更新:コマンドを json 形式でエコーできることを発見しました。これはコマンドです:

sudo nft -e -j add element ip router port_forwards '{80 : 172.16.0.1 . 8080 }'

そして応答はきれいに印刷されます:

{"nftables": [
    {"add": {"element": {
        "family": "ip",
        "table": "router",
        "name": "port_forwards",
        "elem": {"set": [[
            80,
            {"concat": ["172.16.0.1", 8080]}
        ]]}
    }}}
]}

残念ながら、これを上記の python コードにコピーしても、同じエラーが発生します

4

1 に答える 1