memo

2023-03-12

いいかげん nftables を使い始める

  • だらだらと iptables を使い続けてきたけど、いい加減 nftables に移行しよう。

  • 用語メモ:

    • table:

    • chain:

      • https://wiki.nftables.org/wiki-nftables/index.php/Configuring_chains

      • iptables の chain と同様に、 rule を中に入れてくヤツ

      • フックポイント ("input" とか) に紐付けるか、もしくは他の chain から "jump" で飛ばしてトラフィックを流す

      • drop は即座に反映されるけど、 accept は次の chain に進む (のでそこで落される可能性がある) らしい?

    • rule:

      • 条件と、それにマッチしたパケットに対してどんなアクションをするかを定義するやつ

      • 1つのルールに対して、条件もアクションも複数定義可能

  • 設定方法:

    • nft コマンドで1行ずつ設定する方法

      • 例: nft add table ip mytable

      • 例: nft add rule mytable mychain tcp dport 80 accept

    • スクリプト (設定ファイル) に書いて nft -f で読み込ませる方法

      • https://wiki.nftables.org/wiki-nftables/index.php/Scripting

      • nft list table ... とか nft list ruleset とかの出力で見れるような書式 (設定ファイルっぽい書式) と、コマンドで設定するのと同様に1行ずつ書く書式がある。

        • どちらで書いても、設定の変更は atomic に行われる

  • よくあるクライアント PC 向けの設定例:

    #!/usr/bin/nft -f
    flush ruleset
    
    table inet filter {
        chain input {
            type filter hook input priority 0; policy drop;
    
            # accept any localhost traffic
            iif lo accept
    
            # accept traffic originated from us
            ct state established,related accept
    
            # accept neighbour discovery otherwize IPv6 connecticity breaks
            icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
    
            # accept ping
            icmp type echo-request accept
            icmpv6 type echo-request accept
    
            # ssh
            tcp dport 22 accept
    
        }
    }
    
    • 入ってきたパケットに対して:

      • lo のアクセスは全部許可

      • 自分から出したトラフィックの返答は許可

      • IPv6 の何かは許可

      • ping は許可

      • ssh への接続は許可

  • iptables からの移行:

  • 参考: