If the given table "t" does not exist, `pfctl -t t -T replace' and `pfctl -t t -T add ::1' will create it persistently:
# pfctl -sT # pfctl -tt -Tr 1 table created. no changes. # pfctl -vsT -pa---- t pf.conf(5) provides this information: Tables can be defined with any of the following pfctl(8) mechanisms. As with macros, reserved words may not be used as table names. manually Persistent tables can be manually created with the add or replace option of pfctl(8), before or after the ruleset has been loaded. [...] Tables may be defined with the following attributes: [...] persist The persist flag forces the kernel to keep the table even when no rules refer to it. If the flag is not set, the kernel will automatically remove the table when the last rule referring to it is flushed. But I miss it in pfctl(8)'s actual description of these table commands where users are probably referring to first when looking into manual table management. Being clear about it does not hurt and barely adds redundant information. Feedback? Suggestions for better wording? OK? Index: pfctl.8 =================================================================== RCS file: /cvs/src/sbin/pfctl/pfctl.8,v retrieving revision 1.173 diff -u -p -r1.173 pfctl.8 --- pfctl.8 21 Dec 2018 11:16:04 -0000 1.173 +++ pfctl.8 30 Dec 2018 15:09:52 -0000 @@ -459,7 +459,7 @@ Kill a table. Flush all addresses of a table. .It Fl T Cm add Add one or more addresses in a table. -Automatically create a nonexisting table. +Automatically create a persistent table if it does not exist. .It Fl T Cm delete Delete one or more addresses from a table. .It Fl T Cm expire Ar number @@ -471,7 +471,7 @@ For entries which have never had their s refers to the time they were added to the table. .It Fl T Cm replace Replace the addresses of the table. -Automatically create a nonexisting table. +Automatically create a persistent table if it does not exist. .It Fl T Cm show Show the content (addresses) of a table. .It Fl T Cm test