それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

nftables output チェイン(hook)ルーティングができない。-> type routeする

nftablesでルーティングが効かかないことがあった。

ポリシ・ルーティングをしていて、ルーティングされないので頭を悩ませてた。しらべたら、 type routeを使うのが必須であった。

パケットを転送するときは、ポリシルーティングが効く、しかし、ルーティングできない時があってしばらく謎だった。あれこれ調べ上げたらlocalhost から通信したときにポリシルーティングが行われないので、気づいた。

公式Wikiを読んでいると

output は type route 

という記述がありました。

output hook は type routeを使う。

たとえば、次のように、output にフックしたパケットの経路を変更しようとしたら、type filter では動かないので、なんだろうと思って調べてた。

nft add chain reroute output { type route hook output priority -150\; }
nft add rule  reroute output ip daddr @$NSET mark set $MARK counter
## ルーティング(ip route)
ip rule add fwmark $MARK lookup $RTABLE
ip route add 0.0.0.0/0 dev eth2 src $IP table $RTABLE via 192.168.55.5

outputを使う理由

routing 決定のときにforwardingは prerouting で引っ掛けられる(hook)だけど、自サバからのパケットは output で引っ掛ける。postrouting は名前の通り、ルーティング決定後なので、経路を変えても影響が顕現しない。もし、どうしてもpostroutingでやりたければ、パケットの宛先を工夫してlo宛にしてローカルに戻すしか無い。

公式Wikiの記載

公式wiki の記載を参考にする (https://wiki.nftables.org/wiki-nftables/index.php/Configuring_chains)、説明が記載れていた。

特に重要なのは次の記述だった

nat ,, only for the output hook (for other hooks use type filter instead).

「chain type nat は、特にoutput に使う。(他hookではfilterでいい)」という点であった。

wiki の chains の項目には次のような記載があった(日本語訳は私が行った)

Base chain types
The possible chain types are:

filter, which is used to filter packets. This is supported by the arp, bridge, ip, ip6 and inet table families.

route, which is used to reroute packets if any relevant IP header field or the packet mark is modified. If you are familiar with iptables, this chain type provides equivalent semantics to the mangle table but only for the output hook (for other hooks use type filter instead). This is supported by the ip, ip6 and inet table families.

nat, which is used to perform Networking Address Translation (NAT). Only the first packet of a given flow hits this chain; subsequent packets bypass it. Therefore, never use this chain for filtering. The nat chain type is supported by the ip, ip6 and inet table families.

ざっくり訳

基点チェイン(ベースチェイン)
チェイン類型は次の通り

filter, パケット検索条件。次のテーブル族で使える arp, bridge, ip6, inet

route, パケット転送(経路変更)で使う。IPヘッダやパケットのmark変更に紐づいた経路変更。iptablesに習熟しているなら、route は iptablesのmangleテーブルと同等表現を取扱えると考えて良い。ただし、output hook ( 他hookはfilterで代用 )で使うことになる。ip / ip6 inet テーブル族で使える。

nat , これはネットワーク・アドレス変換(NAT)を実現するために使う。通信開始する初回パケットが、処理に的中し後続は迂回される。したがって、このチェインでフィルタリング(検索・マッチング)は不可能である。ip / ip6 / inet で使うことができる。

つまり、自ホストからのルーティングを書くときは、type route でoutput hookに書く必要がある。

どこで、なにが使えるか、使うかというもの、公式に表がある。