それマグで!

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

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

nftables でポリシールーティング

マーキングしたパケットを通常のルーティングより優先度を上げた別のルーティングテーブルで転送する

このとき、nf_tables でパケットの条件を指定して、マーキングする。

該当のパケットをマーキングする

wireguardのインターフェイスから来たパケットは0x65番(101)をマーキングする。ルーティング処理より先にマーキングしてルーティングを書き換えるためprerouting にフックする。

nft_table_name=radiko_mangle
iif=wg1
mark_num=101
to_addr='203.211.199.181/32'
# -- ルーティング
ip rule add fwmark $mark_num table $mark_num
# -- nftables でマーク
nft insert rule ip $nft_table_name prerouting \
   iifname $iif ip daddr $to_addr \
   counter meta mark set $mark_num \
   comment \"takuya:radiko-osaka\"

この実行結果は次のようになる。

ip route show table 101

ip route show のコマンド結果

203.211.199.120 dev wg1 scope link
203.211.199.181 dev wg1 scope link

nf_tables

nft list table radiko_mangle

nft のコマンド結果 テーブルとルール

table ip radiko_mangle {
    chain prerouting {
        type filter hook prerouting priority filter; policy accept;
        iifname "wg1" ip daddr 203.211.199.181 counter packets 0 bytes 0 meta mark set 0x00000065 comment "takuya:radiko-osaka"
        iifname "wg1" ip daddr 203.211.199.120 counter packets 0 bytes 0 meta mark set 0x00000065 comment "takuya:radiko-osaka"
    }
}

注意点( hook output )

nftables output チェイン でポリシルーティングができない。-> type routingする

output hook は type routeを使う。

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