マーキングしたパケットを通常のルーティングより優先度を上げた別のルーティングテーブルで転送する
このとき、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