🚪

nftables で NAPT する

に公開

nftablesでNAPT(IPアドレスとポートの両方を変換中継)する設定のズバリな情報が意外と少なかったので記録しておく。

経緯

クライアントから宛先サーバのポート22にアクセスしたいが以下の条件のだったので、中継サーバにNAPTを設定した。

  • 宛先サーバのポートをグローバルに直接はオープンしない
  • 宛先サーバと中継サーバはVPNで接続されている
  • 接続元クライアントはVPNに参加させない
  • 中継サーバのポート22は既に使用中

設定

nft add table inet nat
nft add chain inet nat prerouting { type nat hook prerouting priority -100 \; }
nft add chain inet nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule inet nat prerouting ip daddr 172.16.0.1 tcp dport 2222 dnat 10.0.0.3:22
nft add rule inet nat prerouting ip6 daddr [グローバルIPv6アドレス] tcp dport 2222 dnat [fd00::3]:22
nft add rule inet nat postrouting masquerade

設定結果

table inet nat {
        chain prerouting {
                type nat hook prerouting priority dstnat; policy accept;
                ip daddr 172.16.0.1 tcp dport 2222 dnat ip to 10.0.0.3:22
                ip6 daddr [グローバルIPv6アドレス] tcp dport 2222 dnat ip6 to [fd00::3]:22
        }

        chain postrouting {
                type nat hook postrouting priority srcnat; policy accept;
                masquerade
        }
}

Discussion