nftables
nftables ã¯æ¢åã® ip-, ip6-, arp-, ebtables ãã¬ãŒã ã¯ãŒã¯ã眮ãæãã Netfilter ã®ãããžã§ã¯ãã§ããæ°ãããã±ãããã£ã«ã¿ãªã³ã°ãã¬ãŒã ã¯ãŒã¯ãæ°ãããŠãŒã¶ãŒã¹ããŒã¹ãŠãŒãã£ãªã㣠(nft)ããã㊠ip- ãš ip6tables ã®äºæã¬ã€ã€ãŒãæäŸããŸããçŸè¡ã®ããã¯ãæ¥ç¶è¿œè·¡ã·ã¹ãã ããŠãŒã¶ãŒã¹ããŒã¹ã®ãã¥ãŒã€ã³ã°ã³ã³ããŒãã³ãããã㊠netfilter ã®ãã°ãµãã·ã¹ãã ã䜿ã£ãŠããŸãã
nftables ã¯3ã€ã®ã¡ã€ã³ã³ã³ããŒãã³ãããæ§æãããŠããŸã: ã«ãŒãã«ã®å®è£ ãlibnl netlink communication ãã㊠nftables ãŠãŒã¶ãŒã¹ããŒã¹ããã³ããšã³ããã«ãŒãã«ã¯ netlink ã®èšå®ã€ã³ã¿ãŒãã§ã€ã¹ã ãã§ãªããå°ããªã¯ã©ã¹èšèªã€ã³ã¿ããªã¿ã䜿çšããã©ã³ã¿ã€ã ã®ã«ãŒã«ã»ããã®è©äŸ¡ãæäŸããŸããlibnl ã«ã¯ã«ãŒãã«ãšéä¿¡ããããã®ããŒã¬ãã«ãªé¢æ°ãå«ãŸããŠããŸããnftables ããã³ããšã³ãã¯ãŠãŒã¶ãŒã察話ãããã®ã§ãã
nftables ã®å ¬åŒ wiki ã«ã¯è©³ããæ å ±ãèŒã£ãŠããŸãã
ã€ã³ã¹ããŒã«
ãŠãŒã¶ãŒã¹ããŒã¹ãŠãŒãã£ãªãã£ããã±ãŒãž nftables ãã€ã³ã¹ããŒã«ããŠãã ããã
iptables-legacy ãã€ã³ã¹ããŒã«ãããŠããå Žåã¯ãiptables ãã€ã³ã¹ããŒã«ããŠãã ãããããã«ãã iptables-legacy ãèªåçã«ã¢ã³ã€ã³ã¹ããŒã«ãããnftables ãšã®ç«¶åãé²ããŸãã
iptables ã³ãã³ãã®å®è£
ãæäŸããŸãããã ããå€ã iptables-legacy ããŒã«ã§äœæãããã«ãŒã«ã¯å¥ã®ãªããžã§ã¯ãã§ãããããããååšããå Žåãiptables ã¯èŠåã衚瀺ããŸããããã³ããšã³ã
- firewalld (firewall-cmd) — ãããã¯ãŒã¯ãšãã¡ã€ã¢ãŠã©ãŒã«ãŸãŒã³ã®èšå®ãããã³ãã¡ã€ã¢ãŠã©ãŒã«ã«ãŒã«ã®èšå®ãšæ§æãè¡ãããŒã¢ã³ããã³ã³ã³ãœãŒã«ã€ã³ã¿ãŒãã§ã€ã¹ã
- nft-blackhole — åœå¥ããã³ãã©ãã¯ãªã¹ãã«ãã£ãŠ nftables ã§ IP ããããã¯ããã¹ã¯ãªãã / ããŒã¢ã³ã
- ufw — Ufw 㯠Uncomplicated Firewall ã®ç¥ã§ãnetfilter ãã¡ã€ã¢ãŠã©ãŒã«ã管çããããã®ããã°ã©ã ã§ãã
- reaction — ããã°ã©ã ã®åºåããç¹°ãè¿ãåºçŸãããã¿ãŒã³ãã¹ãã£ã³ããã¢ã¯ã·ã§ã³ãå®è¡ããããŒã¢ã³ãfail2ban ã®è»œéãªä»£æ¿ã§ãã
äœ¿çšæ¹æ³
nftables ã¯ãã³ãã³ãã©ã€ã³ã§äœæãããäžæçãªã«ãŒã«ãšããã¡ã€ã«ããèªã¿èŸŒãŸããããŸãã¯ãã¡ã€ã«ã«ä¿åãããæ°žç¶çãªã«ãŒã«ãåºå¥ããŸããã
ãã¹ãŠã®ã«ãŒã«ã¯ nft ã³ãã³ãã©ã€ã³ãŠãŒãã£ãªãã£ã䜿ã£ãŠäœæãŸãã¯èªã¿èŸŒãå¿
èŠããããŸãã
äœ¿çšæ¹æ³ã«ã€ããŠã¯ #èšå® ã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
çŸåšã® ruleset ã¯æ¬¡ã®ã³ãã³ãã§è¡šç€ºã§ããŸã:
# nft list ruleset
ãã¹ãŠã® ruleset ãåé€ããã·ã¹ãã ã«ãã¡ã€ã¢ãŠã©ãŒã«ããªãç¶æ ã«ããŸã:
# nft flush ruleset
nftables.service ãåèµ·åããããšã§ã/etc/nftables.conf ãã ruleset ãèªã¿èŸŒã¿ãŸãã
ã·ã³ãã«ãªãã¡ã€ã¢ãŠã©ãŒã«
nftables ã«ã¯ã/etc/nftables.conf ãã¡ã€ã«ã«ä¿åãããã·ã³ãã«ã§å®å
šãªãã¡ã€ã¢ãŠã©ãŒã«èšå®ãä»å±ããŠããŸãã
nftables.service ã¯ãèµ·å/æå¹åããããšãã«ããã®ãã¡ã€ã«ããã«ãŒã«ãèªã¿èŸŒã¿ãŸãã
èšå®
nftables ãŠãŒã¶ãŒã¹ããŒã¹ãŠãŒãã£ãªã㣠nft ã¯ãruleset ãã«ãŒãã«ã«æž¡ãåã«ãã«ãŒã«ã»ããè©äŸ¡ã®å€§éšåãå®è¡ããŸããã«ãŒã«ã¯ãã§ã€ã³ã«æ ŒçŽããããã§ã€ã³ã¯ããŒãã«ã«æ ŒçŽãããŸãã以äžã®ã»ã¯ã·ã§ã³ã§ã¯ããããã®æ§é ãäœæããã³å€æŽããæ¹æ³ã瀺ããŸãã
ãã¡ã€ã«ããå
¥åãèªã¿èŸŒãã«ã¯ã-f/--file ãªãã·ã§ã³ã䜿çšããŸã:
# nft --file filename
æ¢ã«èªã¿èŸŒãŸããŠããã«ãŒã«ã¯èªåçã«ã¯ãã©ãã·ã¥ãããªãããšã«æ³šæããŠãã ããã
ãã¹ãŠã®ã³ãã³ãã®å®å šãªäžèЧã«ã€ããŠã¯ nft(8) ãåç §ããŠãã ããã
ããŒãã«
ããŒãã«ã¯ãã§ã€ã³ãä¿æããŸããiptables ã®ããŒãã«ãšéã£ãŠãnftables ã«ã¯åãããçµã¿èŸŒãŸããŠããããŒãã«ã¯ãããŸãããããŒãã«ã®æ°ãååã¯ãŠãŒã¶ãŒãèªç±ã«æ±ºããããšãã§ããŸãããåããŒãã«ã«ã¯ã¢ãã¬ã¹ãã¡ããªãŒãã²ãšã€ããä¿æããããšãã§ããŸããã5ã€ã®ãã¡ããªãŒã®ãã¡æå®ãããã¡ããªãŒã®ãã±ããã«ã ãé©çšãããŸã:
| nftables ãã¡ããªãŒ | iptables ãŠãŒãã£ãªã㣠|
|---|---|
| ip | iptables |
| ip6 | ip6tables |
| inet | iptables ãš ip6tables |
| arp | arptables |
| bridge | ebtables |
ip (IPv4) ãããã©ã«ãã®ãã¡ããªãŒã§ããç¹ã«æå®ããªããã° ip ã䜿ãããŸãã
IPv4 ãš IPv6 ã®äž¡æ¹ã«é©çšãããã«ãŒã«ãäœæããã«ã¯ inet ã䜿ããŸããinet ã䜿ãã«ã¯ Linux 3.15 以äžãå¿
èŠã§ãip ãš ip6 ãã¡ããªãŒãçµ±äžããŠã«ãŒã«ãç°¡åã«å®çŸ©ã§ããŸãã
inet 㯠nat ã¿ã€ãã®ãã§ã€ã³ã§ã¯äœ¿ãããfilter ã¿ã€ãã®ãã§ã€ã³ã䜿ãå¿
èŠããããŸã (ãœãŒã¹)ãã¢ãã¬ã¹ããã¡ããªãŒã®å®å
šãªå®çŸ©ã¯ nft(8) ã® ADDRESS FAMILIES ã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
以äžã§äŸç€ºããŠããã³ãã³ãã® family ã¯å
šãŠä»»æã§ãããæå®ããªãã£ãå Žå㯠ip ã䜿ãããŸãã
ããŒãã«ã®äœæ
以äžã®ã³ãã³ãã§æ°ããããŒãã«ã远å ãããŸã:
# nft add table family table
ããŒãã«ã®äžèŠ§è¡šç€º
å šãŠã®ããŒãã«ã衚瀺ããã«ã¯:
# nft list tables
ããŒãã«å ã®ãã§ã€ã³ãšã«ãŒã«ã®è¡šç€º
æå®ããããŒãã«ã®å šãŠã®ãã§ã€ã³ãšã«ãŒã«ã衚瀺ããã«ã¯:
# nft list table family_type table_name
äŸãã°ãinet family ã® my_table ããŒãã«ã®ãã¹ãŠã®ã«ãŒã«ãäžèŠ§è¡šç€ºããã«ã¯:
# nft list table inet my_table
ããŒãã«ã®åé€
ããŒãã«ãåé€ããã«ã¯:
# nft delete table family_type table_name
ããã«ãããããŒãã«å ã®ãã¹ãŠã®ãã§ã€ã³ãç Žæ£ãããŸãã
ããŒãã«ã®ã¯ãªã¢
ããŒãã«ããå šãŠã®ã«ãŒã«ãæ¶å»ããã«ã¯:
# nft flush table family_type table_name
ãã§ã€ã³
ãã§ã€ã³ã®çšéã¯ã«ãŒã«ãä¿æããããšã§ããiptables ã®ãã§ã€ã³ãšéã£ãŠãnftables ã«ã¯åãããçµã¿èŸŒãŸããŠãããã§ã€ã³ã¯ãããŸããããã®ãããã§ã€ã³ã netfilter ãã¬ãŒã ã¯ãŒã¯ã«ããã¿ã€ããããã¯ãã©ãã䜿ããªãå Žåãiptables ãšã¯ç°ãªããã§ã€ã³ãéãæãããã±ãã㯠nftables ã®åœ±é¿ãåããŸããã
ãã§ã€ã³ã«ã¯2ã€ã®ã¿ã€ãããããŸããbase ãã§ã€ã³ã¯ãããã¯ãŒã¯ã¹ã¿ãã¯ããã®ãã±ããã®ãšã³ããªãã€ã³ããšãªããŸããããã¯ã®å€ãæå®ããããšãã§ããŸããregular ãã§ã€ã³ã¯ãžã£ã³ãã¿ãŒã²ãããšããŠäœ¿çšããããšãã§ããŸãã
以äžã®ã³ãã³ãã§äœ¿ã£ãŠãã family_type ã¯å
šãŠä»»æã§ãããæå®ããªãã£ãå Žå㯠ip ã䜿ãããŸãã
ãã§ã€ã³ã®äœæ
Base chain
base chain ã远å ããã«ã¯ãtypeãhookãpriority ã®å€ãæå®ããå¿ èŠããããŸã:
# nft add chain family_type table_name chain_name '{ type chain_type hook hook_type priority priority_value ; policy policy ;}'
chain_type ã«ã¯ filterãrouteãnat ãæå®ã§ããŸãã
IPv4/IPv6/Inet address family ã§ã¯ãhook_type ã« preroutingãinputãforwardãoutputãpostrouting ãæå®ã§ããŸãããµããŒãããã family_typeãchain_typeãhook_type ã®çµã¿åããäžèЧã«ã€ããŠã¯ nft(8) § CHAINS ãåç
§ããŠãã ããã
priority_value ã«ã¯ priority åãŸãã¯æŽæ°å€ãæå®ã§ããŸããæšæº priority åãšå€ã®äžèЧã«ã€ããŠã¯ nft(8) § CHAINS ãåç
§ããŠãã ãããæ°å€ãå°ãããã§ã€ã³ã»ã©å
ã«åŠçãããè² ã®å€ã䜿çšã§ããŸãã[5]
ä»»æã§ãbase chain ã«ã¯ policy (drop ãŸãã¯ããã©ã«ãã® accept) ãæå®ã§ããŸããããã«ããããã§ã€ã³å
ã®ã«ãŒã«ã§æç€ºçã« accept ãŸã㯠refuse ãããªãã£ããã±ããã«äœãèµ·ããããå®çŸ©ããŸãã
äŸãã°ãå ¥åãã±ããããã£ã«ã¿ãªã³ã°ãã base chain ã远å ããã«ã¯:
# nft add chain inet my_table my_chain '{ type filter hook input priority 0; }'
äžèšã®ãããã§ã add ã create ã«çœ®ãæãããšãæ°ãããã§ã€ã³ã远å ããŸããããã§ã€ã³ãæ¢ã«ååšããå Žåã¯ãšã©ãŒãè¿ããŸãã
Regular chain
次ã®ã³ãã³ãã¯ãtable_name ãšããååã®ããŒãã«ã« chain_name ãšããååã® regular chain ã远å ããŸã:
# nft add chain family_type table_name chain_name
äŸãã°ãinet address family ã® my_table ããŒãã«ã« my_tcp_chain ãšãã regular chain ã远å ããã«ã¯:
# nft add chain inet my_table my_tcp_chain
ãã§ã€ã³ã®äžèŠ§è¡šç€º
次ã®ã³ãã³ãã¯ãfamily_type ã®ãã¹ãŠã®ãã§ã€ã³ããã«ãŒã«ãªãã§äžèŠ§è¡šç€ºããŸã (#ã«ãŒã«ã®äžèŠ§è¡šç€º ãåç §):
# nft list chains family_type
äŸãã°ã次ã®ã³ãã³ã㯠IPv6 ã®ãã§ã€ã³ãäžèŠ§è¡šç€ºããŸã:
# nft list chains ip6
family_type ãçç¥ããå Žåããã¹ãŠã®ãã§ã€ã³ã衚瀺ãããŸãã
ãã§ã€ã³ã®ç·šé
ãã§ã€ã³ãç·šéããããšãã¯ããã§ã€ã³ã®ååãæå®ããŠå€æŽãããã«ãŒã«ãå®çŸ©ããŸã:
# nft chain family_type table_name chain_name '{ [ type chain_type hook hook_type device device_name priority priority_value ; policy policy_type ; ] }'
äŸãã°ãããã©ã«ãããŒãã«å
ã® my_input ãã§ã€ã³ã® policy ã accept ãã drop ã«å€æŽããã«ã¯:
# nft chain inet my_table my_input '{ policy drop ; }'
ãã§ã€ã³ã®åé€
ãã§ã€ã³ãåé€ããã«ã¯:
# nft delete chain family_type table_name chain_name
åé€ãããã§ã€ã³ã«ã¯ã«ãŒã«ããžã£ã³ãã¿ãŒã²ãããå«ãŸããŠããŠã¯ãããŸããã
ãã§ã€ã³ã®ã«ãŒã«ãæ¶å»
ãã§ã€ã³ããã«ãŒã«ãæ¶å»ããã«ã¯:
# nft flush chain family_type table_name chain_name
ã«ãŒã«
ã«ãŒã«ã¯è¡šçŸãŸãã¯å®£èšããæ§æããããã§ã€ã³ã®äžã«æ ŒçŽãããŸãã
ã«ãŒã«ã®è¿œå
ãã§ã€ã³ã«ã«ãŒã«ã远å ããã«ã¯:
# nft add rule family_type table_name chain_name handle handle_value statement
ã«ãŒã«ã¯ handle_value ã®äœçœ®ã«è¿œå ãããŸããããã¯ä»»æã§ããæå®ããªãå Žåãã«ãŒã«ã¯ãã§ã€ã³ã®æ«å°Ÿã«è¿œå ãããŸãã
ã«ãŒã« handle ã確èªããã«ã¯ãä»»æã®æå¹ãª list ã³ãã³ãã« --handle ã¹ã€ããã远å ããå¿
èŠããããŸãããã®ã¹ã€ããã«ãããnft ã¯åºåã« handle ã衚瀺ããŸãã--numeric åŒæ°ã¯ãæªè§£æ±ºã® IP ã¢ãã¬ã¹ãªã©ãäžéšã®æ°å€åºåã確èªããã®ã«äŸ¿å©ã§ãã
# nft --handle --numeric list chain inet my_table my_input
table inet my_table {
chain input {
type filter hook input priority 0;
ip saddr 127.0.0.1 accept # handle 10
}
}
æå®äœçœ®ã®åã«ã«ãŒã«ãæ¿å ¥ããã«ã¯:
# nft insert rule family_type table_name chain_name handle handle_value statement
handle_value ãæå®ãããŠããªãå Žåãã«ãŒã«ã¯ãã§ã€ã³ã®å
é ã«æ¿å
¥ãããŸãã
衚çŸ
statement ã«ã¯ããããã衚çŸãšå€æå®£èšãå
¥ããŸãã倿宣èšã«ã¯ accept, drop, queue, continue, return, jump chain, goto chain ãªã©ãååšããŸãã倿宣èšä»¥å€ã®å®£èšãæå®ã§ããŸãã詳ãã㯠nft(8) ãåç
§ããŠãã ããã
nftables ã§ã¯æ§ã
ãªè¡šçŸã䜿ãããšãã§ããã»ãšãã©ã¯ãiptables ãšå¯Ÿå¿ããããã«ãªã£ãŠããŸããäžçªå€§ããªéãã¯æ±çšçãªããããšæé»çãªããããååšããªãããšã§ããæ±çšçãªããããšã¯ã--protocol ã --source ã®ããã«ããã€ã§ã䜿ãããšãã§ãããããã§ãæé»çãªããããšã¯ã--sport ã®ããã«ãç¹å®ã®ãããã³ã«ã§ãã䜿ããªããããã®ããšã§ãã
以äžã¯å©çšã§ãããããã®äžéšã§ã:
- meta (ã¡ã¿ããããã£ãäŸ: ã€ã³ã¿ãŒãã§ã€ã¹)
- icmp (ICMP ãããã³ã«)
- icmpv6 (ICMPv6 ãããã³ã«)
- ip (IP ãããã³ã«)
- ip6 (IPv6 ãããã³ã«)
- tcp (TCP ãããã³ã«)
- udp (UDP ãããã³ã«)
- sctp (SCTP ãããã³ã«)
- ct (æ¥ç¶ã®ãã©ããã³ã°)
以äžã¯ãããåŒæ°ã®äžéšã§ã (å®å šãªãªã¹ã㯠nft(8) ãèŠãŠäžãã):
meta: oif <output interface INDEX> iif <input interface INDEX> oifname <output interface NAME> iifname <input interface NAME> (oif and iif accept string arguments and are converted to interface indexes) (oifname and iifname are more dynamic, but slower because of string matching) icmp: type <icmp type> icmpv6: type <icmpv6 type> ip: protocol <protocol> daddr <destination address> saddr <source address> ip6: daddr <destination address> saddr <source address> tcp: dport <destination port> sport <source port> udp: dport <destination port> sport <source port> sctp: dport <destination port> sport <source port> ct: state <new | established | related | invalid>
ããæå³ã§ã¯ãiif ãš oif ã«å¯Ÿãã iifname ãš oifname ã®éãã¯ãstatic ãš dynamic ã®éãã«äŒŒãŠããŸãããŸãã¯ãããã°ã©ãã³ã°æŠå¿µã§ãã definition ãš declarationãããã㯠early binding ãš delayed binding ã«äŒŒãŠããŸãã䜿çšäŸãšè¿œå 説æãžã®ãªã³ã¯ã«ã€ããŠã¯ [6] ãåç §ããŠãã ããã
ã«ãŒã«ã®äžèŠ§è¡šç€º
次ã®ã³ãã³ãã¯ãã§ã€ã³å ã®ãã¹ãŠã®ã«ãŒã«ãäžèŠ§è¡šç€ºããŸã:
# nft list chain family_type table_name chain_name
äŸãã°ãmy_table ãšãã inet ããŒãã«å
ã® my_output ãšãããã§ã€ã³ã®ã«ãŒã«ãäžèŠ§è¡šç€ºããã«ã¯:
# nft list chain inet my_table my_output
åé€
åã
ã®ã«ãŒã«ã¯ãã³ãã«ã䜿ããªããšåé€ããããšãã§ããŸãããnft --handle list ã³ãã³ãã䜿ãããšã§ã«ãŒã«ã®ãã³ãã«ã確èªã§ããŸããäŸãã°æ¬¡ã®ãããªå Žå:
# nft --handle --numeric list chain inet my_table my_input
table inet my_table {
chain input {
type filter hook input priority 0;
ip saddr 127.0.0.1 accept # handle 10
}
}
次ã®ã³ãã³ãã§åé€ã§ããŸã:
# nft delete rule inet my_table my_input handle 10
ããŒãã«å
ã®ãã¹ãŠã®ãã§ã€ã³ã¯ nft flush table ã³ãã³ãã§ãã©ãã·ã¥ã§ããŸããåå¥ã®ãã§ã€ã³ã¯ nft flush chain ãŸã㯠nft delete rule ã³ãã³ãã§ãã©ãã·ã¥ã§ããŸãã
# nft flush table table_name # nft flush chain family_type table_name chain_name # nft delete rule family_type table_name chain_name
æåã®ã³ãã³ãã¯ãip table_name ããŒãã«å
ã®ãã¹ãŠã®ãã§ã€ã³ããã©ãã·ã¥ããŸãã2 çªç®ã®ã³ãã³ãã¯ãfamily_type table_name ããŒãã«å
ã® chain_name ãã§ã€ã³ããã©ãã·ã¥ããŸãã3 çªç®ã®ã³ãã³ãã¯ãfamily_type table_name ããŒãã«å
ã® chain_name ãã§ã€ã³ã®ãã¹ãŠã®ã«ãŒã«ãåé€ããŸãã
ã»ãã
ã»ããã«ã¯ååä»ãã»ãããšå¿åã»ããããããŸããã»ãã㯠1 ã€ä»¥äžã®èŠçŽ ã§æ§æãããèŠçŽ ã¯ã«ã³ãã§åºåãããæ³¢æ¬åŒ§ã§å²ãŸããŸããå¿åã»ããã¯ã«ãŒã«ã«åã蟌ãŸããæŽæ°ã§ããŸãããã«ãŒã«ãåé€ããŠå远å ããå¿ èŠããããŸããäŸãã°ã次㮠dports ã»ãããã "http" ã ããåé€ããããšã¯ã§ããŸãã:
# nft add rule ip6 filter input tcp dport {telnet, http, https} accept
ååä»ãã»ããã¯æŽæ°ã§ããåä»ãããã©ã°ä»ããå¯èœã§ããsshguard ã¯ããããã¯ããããã¹ãã® IP ã¢ãã¬ã¹ã«ååä»ãã»ããã䜿çšããŸãã
table ip sshguard {
set attackers {
type ipv4_addr
flags interval
elements = { 1.2.3.4 }
}
ã»ããã«èŠçŽ ã远å ãŸãã¯åé€ããã«ã¯ã次ã®ããã«ããŸã:
# nft add element ip sshguard attackers { 5.6.7.8/32 }
# nft delete element ip sshguard attackers { 1.2.3.4/32 }
ipv4_addr åã«ã¯ CIDR netmask ãå«ããããããšã«æ³šæããŠãã ãã (ããã§ã® /32 ã¯å¿
é ã§ã¯ãããŸããããå®å
šæ§ã®ããã«å«ããŠããŸã)ããŸããããã§ TABLE ip sshguard { SET attackers } ã«ãã£ãŠå®çŸ©ãããã»ããã¯ãip sshguard attackers ãšããŠåç
§ãããããšã«ã泚æããŠãã ããã
NFTSet= ã®èª¬æãš #systemd-networkd ã䜿ã£ãåçååä»ãã»ãã ã®äŸãåç
§ããŠãã ãããã¢ãããã¯ãªããŒã
çŸåšã®ã«ãŒã«ã»ããããã©ãã·ã¥ãã:
# echo "flush ruleset" > /tmp/nftables
çŸåšã®ã«ãŒã«ã»ããããã³ããã:
# nft list ruleset >> /tmp/nftables
/tmp/nftables ãç·šéããŠæ¬¡ã®ã³ãã³ãã§å€æŽãé©çš:
# nft -f /tmp/nftables
ãµã³ãã«
ã¯ãŒã¯ã¹ããŒã·ã§ã³
/etc/nftables.conf
flush ruleset
table inet my_table {
set LANv4 {
type ipv4_addr
flags interval
elements = { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16 }
}
set LANv6 {
type ipv6_addr
flags interval
elements = { fd00::/8, fe80::/10 }
}
chain my_input_lan {
udp sport 1900 udp dport >= 1024 meta pkttype unicast limit rate 4/second burst 20 packets accept comment "Accept UPnP IGD port mapping reply"
udp sport netbios-ns udp dport >= 1024 meta pkttype unicast accept comment "Accept Samba Workgroup browsing replies"
}
chain my_input {
type filter hook input priority filter; policy drop;
iif lo accept comment "Accept any localhost traffic"
ct state invalid drop comment "Drop invalid connections"
fib daddr . iif type != { local, broadcast, multicast } drop comment "Drop packets if the destination IP address is not configured on the incoming interface (strong host model)"
ct state { established, related } accept comment "Accept traffic originated from us"
meta l4proto { icmp, ipv6-icmp } accept comment "Accept ICMP"
ip protocol igmp accept comment "Accept IGMP"
udp dport mdns ip6 daddr ff02::fb accept comment "Accept mDNS"
udp dport mdns ip daddr 224.0.0.251 accept comment "Accept mDNS"
ip6 saddr @LANv6 jump my_input_lan comment "Connections from private IP address ranges"
ip saddr @LANv4 jump my_input_lan comment "Connections from private IP address ranges"
counter comment "Count any other traffic"
}
chain my_forward {
type filter hook forward priority filter; policy drop;
# Drop everything forwarded to us. We do not forward. That is routers job.
}
chain my_output {
type filter hook output priority filter; policy accept;
# Accept every outbound connection
}
}
NFTSet= ã䜿ã£ãŠæ¥ç¶ã®ãããã¯ãŒã¯ãã¬ãã£ãã¯ã¹ãååŸããããšã§ããããã¯ãŒã¯ãµããããã®ããŒãã³ãŒãã£ã³ã°ãé¿ããããŸãã#systemd-networkd ã䜿ã£ãåçååä»ãã»ãã ãåç
§ããŠãã ããããµãŒããŒ
/etc/nftables.conf
flush ruleset
table inet my_table {
set LANv4 {
type ipv4_addr
flags interval
elements = { 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16 }
}
set LANv6 {
type ipv6_addr
flags interval
elements = { fd00::/8, fe80::/10 }
}
chain my_input_lan {
meta l4proto { tcp, udp } th dport 2049 accept comment "Accept NFS"
udp dport netbios-ns accept comment "Accept NetBIOS Name Service (nmbd)"
udp dport netbios-dgm accept comment "Accept NetBIOS Datagram Service (nmbd)"
tcp dport netbios-ssn accept comment "Accept NetBIOS Session Service (smbd)"
tcp dport microsoft-ds accept comment "Accept Microsoft Directory Service (smbd)"
udp sport { bootpc, 4011 } udp dport { bootps, 4011 } accept comment "Accept PXE"
udp dport tftp accept comment "Accept TFTP"
}
chain my_input {
type filter hook input priority filter; policy drop;
iif lo accept comment "Accept any localhost traffic"
ct state invalid drop comment "Drop invalid connections"
fib daddr . iif type != { local, broadcast, multicast } drop comment "Drop packets if the destination IP address is not configured on the incoming interface (strong host model)"
ct state { established, related } accept comment "Accept traffic originated from us"
meta l4proto { icmp, ipv6-icmp } accept comment "Accept ICMP"
ip protocol igmp accept comment "Accept IGMP"
udp dport mdns ip6 daddr ff02::fb accept comment "Accept mDNS"
udp dport mdns ip daddr 224.0.0.251 accept comment "Accept mDNS"
ip6 saddr @LANv6 jump my_input_lan comment "Connections from private IP address ranges"
ip saddr @LANv4 jump my_input_lan comment "Connections from private IP address ranges"
tcp dport ssh accept comment "Accept SSH on port 22"
tcp dport ipp accept comment "Accept IPP/IPPS on port 631"
meta l4proto { tcp, udp } th dport { http, https, 8008, 8080 } accept comment "Accept HTTP (ports 80, 443, 8008, 8080)"
udp sport bootpc udp dport bootps ip saddr 0.0.0.0 ip daddr 255.255.255.255 accept comment "Accept DHCPDISCOVER (for DHCP-Proxy)"
}
chain my_forward {
type filter hook forward priority filter; policy drop;
# Drop everything forwarded to us. We do not forward. That is routers job.
}
chain my_output {
type filter hook output priority filter; policy accept;
# Accept every outbound connection
}
}
ã¬ãŒãå¶é
table inet my_table {
chain my_input {
type filter hook input priority filter; policy drop;
iif lo accept comment "Accept any localhost traffic"
ct state invalid drop comment "Drop invalid connections"
fib daddr . iif type != { local, broadcast, multicast } drop comment "Drop packets if the destination IP address is not configured on the incoming interface (strong host model)"
meta l4proto icmp icmp type echo-request limit rate over 10/second burst 4 packets drop comment "No ping floods"
meta l4proto ipv6-icmp icmpv6 type echo-request limit rate over 10/second burst 4 packets drop comment "No ping floods"
ct state { established, related } accept comment "Accept traffic originated from us"
meta l4proto { icmp, ipv6-icmp } accept comment "Accept ICMP"
ip protocol igmp accept comment "Accept IGMP"
tcp dport ssh ct state new limit rate 15/minute accept comment "Avoid brute force on SSH"
}
}
ãžã£ã³ã
èšå®ãã¡ã€ã«ã§ãžã£ã³ãã䜿ããšãã¯ãå
ã«ã¿ãŒã²ãããã§ã€ã³ãå®çŸ©ããå¿
èŠããããŸããããããªããš Error: Could not process rule: No such file or directory ãšãããšã©ãŒãçºçããŸãã
table inet my_table {
chain web {
tcp dport http accept
tcp dport 8080 accept
}
chain my_input {
type filter hook input priority filter;
ip saddr 10.0.2.0/24 jump web
drop
}
}
ã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ãŠã«ãŒã«ãå€ãã
è€æ°ã®ãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ãååšããå Žåãããããã®ã€ã³ã¿ãŒãã§ã€ã¹ããšã«å¥ã
ã®ãã£ã«ã¿ãŒãã§ã€ã³ãèšå®ãããå ŽåããããããããŸãããäŸãã°ãããŒã ã«ãŒã¿ãŒãæ§ç¯ãããšããLAN äžã§ã¢ã¯ã»ã¹ã§ãããŠã§ããµãŒããŒãå®è¡ãã€ã€ (nsp3s0 ã€ã³ã¿ãŒãã§ã€ã¹)ãã€ã³ã¿ãŒãããããã¯ã¢ã¯ã»ã¹ã§ããªãããã«ãããå Žå (enp2s0 ã€ã³ã¿ãŒãã§ã€ã¹) ãªã©ã¯ä»¥äžã®ããã«èšå®ããŸã:
table inet my_table {
chain my_input { # this chain serves as a dispatcher
type filter hook input priority filter; policy drop;
iif lo accept comment "always accept loopback"
iifname enp2s0 jump my_input_public
iifname enp3s0 jump my_input_private
}
chain my_input_public { # rules applicable to public interface interface
ct state {established,related} accept
ct state invalid drop
udp dport bootpc accept
tcp dport bootpc accept
}
chain my_input_private {
ct state {established,related} accept
ct state invalid drop
udp dport bootpc accept
tcp dport bootpc accept
tcp port http accept
tcp port https accept
reject with icmpx port-unreachable comment "all other traffic"
}
chain my_output { # we let everything out
type filter hook output priority filter;
accept
}
}
ãããã¯ãåäžã® upstream interface ã«å¯Ÿãã iifname statement ã ããéžã³ããã以å€ã®ãã¹ãŠã®ã€ã³ã¿ãŒãã§ã€ã¹ã«å¯Ÿããããã©ã«ãã«ãŒã«ã 1 ãæã«çœ®ãããšãã§ããŸããåã€ã³ã¿ãŒãã§ã€ã¹ããšã« dispatch ããå¿
èŠã¯ãããŸããã
ãã¹ã«ã¬ãŒã
nftables ã«ã¯ç¹æ®ãªããŒã¯ãŒã masquerade ãååšããéä¿¡å
ã¢ãã¬ã¹ãèªåçã«åºåã€ã³ã¿ãŒãã§ã€ã¹ã®ã¢ãã¬ã¹ã«èšå®ãããŸã (ãœãŒã¹)ãã«ãŒã¿ãŒã®ã€ã³ã¿ãŒãã§ã€ã¹ã倿°ã® ISP ã«æ¥ç¶ãããŠãããšããªã©ãã€ã³ã¿ãŒãã§ã€ã¹ã® IP ã¢ãã¬ã¹ãäžå®ã§ãªãå Žåã«æçšã§ããéåžžã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã® IP ã¢ãã¬ã¹ãå€ãããã³ã«ãããã¯ãŒã¯ã¢ãã¬ã¹å€æ (NAT) ã®ã«ãŒã«ãæŽæ°ããå¿
èŠããããŸãã
masquerade ã䜿çšããã«ã¯:
- masquerading ãã«ãŒãã«ã§æå¹ã«ãªã£ãŠããããšã確èªããŠãã ãã (ããã©ã«ãã«ãŒãã«ã䜿çšããŠããå Žå㯠true ã§ã)ãããã§ãªãå Žåã¯ãã«ãŒãã«èšå®ã§
CONFIG_NFT_MASQ=mãèšå®ããŸãã masqueradeããŒã¯ãŒãã¯nattype ã®ãã§ã€ã³ã§ã®ã¿äœ¿çšã§ããŸãã- masquerading 㯠source NAT ã®äžçš®ã§ãããããoutput path ã§ã®ã¿åäœããŸãã
2 ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ãæã€ãã·ã³ã®äŸã§ã: LAN 㯠enp3s0 ã«æ¥ç¶ãããpublic internet 㯠enp2s0 ã«æ¥ç¶ãããŠããŸã:
table inet my_nat {
chain my_masquerade {
type nat hook postrouting priority srcnat;
oifname "enp2s0" masquerade
}
}
ããŒãã« type ã inet ãªã®ã§ãIPv4 ãš IPv6 ã®äž¡æ¹ã®ãã±ããã masquerade ãããŸããIPv6 ã¯è¿œå ã® address space ã«ãã NAT ãäžèŠãªãããIPv4 ãã±ããã ãã masquerade ãããå Žåã¯ãmeta nfproto ipv4 expression ã oifname "enp2s0" ã®åã«äœ¿çšããããããŒãã« type ã ip ã«å€æŽããŸãã
NAT ãšããŒããã©ã¯ãŒãã£ã³ã°
ãã®äŸã§ã¯ãeth0 ãšãã WAN ã€ã³ã¿ãŒãã§ã€ã¹ãéã£ãŠåºãŠãããã©ãã£ãã¯ã masquerade ããããŒã 22 ãš 80 ã 10.0.0.2 ã«è»¢éããŸããsysctl ã«ãã£ãŠ net.ipv4.ip_forward ã 1 ã«èšå®ããå¿
èŠããããŸãã
table nat {
chain prerouting {
type nat hook prerouting priority dstnat;
iif eth0 tcp dport {22, 80} dnat to 10.0.0.2
}
chain postrouting {
type nat hook postrouting priority srcnat;
oif eth0 masquerade
}
}
IP ããšã®æ°èŠæ¥ç¶æ°ãã«ãŠã³ã
HTTPS æ¥ç¶ãã«ãŠã³ãããã«ã¯ã次ã®ã¹ããããã䜿çšããŸã:
/etc/nftables.conf
table inet filter {
set https {
type ipv4_addr;
flags dynamic;
size 65536;
timeout 60m;
}
chain input {
type filter hook input priority filter;
ct state new meta l4proto { tcp, udp } th dport 443 update @https { ip saddr counter }
}
}
ã«ãŠã³ã¿ãŒã衚瀺ããã«ã¯ãnft list set inet filter https ãå®è¡ããŠãã ããã
åç blackhole
ãã®ã¹ããããã¯ã10/second ã®å¶éãè¶ ãã source IP (ãŸã㯠/64 IPv6 range) ããã®ãã¹ãŠã® HTTPS æ¥ç¶ã 1 åé drop ããŸãã
/etc/nftables.conf
table inet dev {
set blackhole_ipv4 {
type ipv4_addr;
flags dynamic, timeout;
size 65536;
}
set blackhole_ipv6 {
type ipv6_addr;
flags dynamic, timeout;
size 65536;
}
chain input {
type filter hook input priority filter; policy accept;
ct state new meta l4proto { tcp, udp } th dport 443 \
meter flood_ipv4 size 128000 { ip saddr timeout 10s limit rate over 10/second } \
add @blackhole_ipv4 { ip saddr timeout 1m }
ct state new meta l4proto { tcp, udp } th dport 443 \
meter flood_ipv6 size 128000 { ip6 saddr and ffff:ffff:ffff:ffff:: timeout 10s limit rate over 10/second } \
add @blackhole_ipv6 { ip6 saddr and ffff:ffff:ffff:ffff:: timeout 1m }
ip saddr @blackhole_ipv4 counter drop
ip6 saddr and ffff:ffff:ffff:ffff:: @blackhole_ipv6 counter drop
}
}
blackhole ããã IP ã衚瀺ããã«ã¯ãnft list set inet dev blackhole_ipvX ãå®è¡ããŠãã ããã
ãã³ããšãã¯ããã¯
çŸåšã® rule set ã®ä¿å
nft list ruleset ã³ãã³ãã®åºåã¯ããã®ãŸãŸæå¹ãªå
¥åãã¡ã€ã«ãšããŠã䜿çšã§ããŸããçŸåšã® rule set ããã¡ã€ã«ã«ä¿åããåŸã§èªã¿æ»ãããšãã§ããŸãã
# nft -s list ruleset | tee filename
nft list ã¯å€æ°å®çŸ©ãåºåããŸããã倿°ã¯å€±ãããŸããã«ãŒã«å
ã§äœ¿ãããŠãã倿°ã¯ããã®å€ã«çœ®ãæããããŸããã·ã³ãã«ãªã¹ããŒããã«ãã¡ã€ã¢ãŠã©ãŒã«
ã·ã³ãã«ãªã¹ããŒããã«ãã¡ã€ã¢ãŠã©ãŒã«ã®èšäºãåç §ããŠãã ããã
ã·ã³ã°ã«ãã·ã³
çŸåšã®ã«ãŒã«ã»ãããæ¶å»:
# nft flush ruleset
ããŒãã«ã远å :
# nft add table inet filter
input, forward, output ããŒã¹ãã§ã€ã³ã远å ãinput ãš forward ã®ããªã·ãŒã¯ç Žæ£ã«ããŠãoutput ã®ããªã·ãŒã¯èš±å¯ã«ãã:
# nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
# nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
# nft add chain inet filter output { type filter hook output priority 0 \; policy accept \; }
ã¬ã®ã¥ã©ãŒãã§ã€ã³ã远å ã㊠tcp ãš udp ã«é¢é£ä»ãã:
# nft add chain inet filter TCP # nft add chain inet filter UDP
é¢é£ã»ç¢ºç«æžã¿ãã©ãã£ãã¯ã¯èš±å¯ãã:
# nft add rule inet filter input ct state related,established accept
ã«ãŒãããã¯ã€ã³ã¿ãŒãã§ã€ã¹ã®ãã©ãã£ãã¯ã¯å šãŠèš±å¯ãã:
# nft add rule inet filter input iif lo accept
äžæ£ãªãã©ãã£ãã¯ã¯å šãŠç Žæ£ãã:
# nft add rule inet filter input ct state invalid drop
æ°ãããšã³ãŒèŠæ± (ping) ã¯èš±å¯ãã:
# nft add rule inet filter input ip protocol icmp icmp type echo-request ct state new accept
æ°ãã udp ãã©ãã£ãã¯ã¯ UDP ãã§ã€ã³ã«ãžã£ã³ããã:
# nft add rule inet filter input ip protocol udp ct state new jump UDP
æ°ãã tcp ãã©ãã£ãã¯ã¯ TCP ãã§ã€ã³ã«ãžã£ã³ããã:
# nft add rule inet filter input ip protocol tcp tcp flags \& \(fin\|syn\|rst\|ack\) == syn ct state new jump TCP
ä»ã®ã«ãŒã«ã«ãã£ãŠåŠçãããªãã£ããã©ãã£ãã¯ã¯å šãŠæåŠãã:
# nft add rule inet filter input ip protocol udp reject # nft add rule inet filter input ip protocol tcp reject with tcp reset # nft add rule inet filter input counter reject with icmp type prot-unreachable
ãããã TCP ãš UDP ãã§ã€ã³ã§åŠçããæ¥ç¶ã§éãããããŒããæ±ºããŸããäŸãã°ãŠã§ããµãŒããŒã®æ¥ç¶ãéãã«ã¯:
# nft add rule inet filter TCP tcp dport 80 accept
ããŒã 443 ããã®ãŠã§ããµãŒããŒã® HTTPS æ¥ç¶ãèš±å¯ããã«ã¯:
# nft add rule inet filter TCP tcp dport 443 accept
ããŒã 22 ã® SSH æ¥ç¶ãèš±å¯ããã«ã¯:
# nft add rule inet filter TCP tcp dport 22 accept
DNS ãªã¯ãšã¹ããèš±å¯ããã«ã¯:
# nft add rule inet filter TCP tcp dport 53 accept # nft add rule inet filter UDP tcp dport 53 accept
èšå®ã«æºè¶³ããã倿Žãä¿åããŠæ°žç¶åãããŠãã ããã
ãã«ãŒããã©ãŒã¹æ»æã®å¯Ÿç
Sshguard ã¯ãã«ãŒããã©ãŒã¹æ»æãæ€åºããŠäžæçã« IP ã¢ãã¬ã¹ã«åºã¥ããããã¯ããããã«ãã¡ã€ã¢ãŠã©ãŒã«ãç·šéããŸããSshguard ã§ nftables ã䜿ãããã«èšå®ããæ¹æ³ã¯ Sshguard#nftables ãèŠãŠãã ããã
ãã©ãã£ãã¯ã®ãã°èšé²
log action ã䜿ã£ãŠãã±ããããã°ã«èšé²ã§ããŸãããã¹ãŠã®åä¿¡ traffic ããã°ã«èšé²ããæãåçŽãªã«ãŒã«ã¯æ¬¡ã®ãšããã§ã:
# nft add rule inet filter input log
詳ãã㯠nftables wiki ãåç §ããŠãã ããã
Monitor
ãã¹ãŠã®ã€ãã³ããç£èŠããnative nft format ã§å ±åããŸãã
# nft monitor
nft(8) § MONITOR ãåç §ããŠãã ããã
ruleset debugging trace temporary
meta nftrace set 1 㯠ruleset packet tracing ã on/off ããŸããtrace ãèŠãã«ã¯ monitor trace ã³ãã³ãã䜿çšããŸãã
å¥ã® shell ã§ãinteractive shell å ã«ãã¡ã€ã«ã "include" ããŸã:
# nft -i nft> include "/root/nftables.trace"
å¿ èŠã«å¿ããŠèª¿æŽããäŸã§ã:
/root/nftables.trace
add table ip temp-trace {comment "Temporary table!!"; flags owner;}
add chain ip temp-trace icmp-prerouting { type filter hook prerouting priority raw - 1 ; }
add rule ip temp-trace icmp-prerouting ip protocol icmp meta nftrace set 1
ãã®ãã¡ã€ã«ã¯äžæããŒãã« (flags owner) ã远å ããŸãããã®ãããåŒã³åºãå ã® interactive nft ããã»ã¹ãéãããããšèªåçã«åé€ãããŸããBase Chain ã¯çšéã«å¿ããŠèª¿æŽããå¿ èŠããããŸããè€æ°ã®ãã§ã€ã³ãè€æ°ã® "meta nftrace set 1" ã«ãŒã«ãäœæã§ããŸãã"ip protocol icmp" ã¯åãªãäŸã§ãããå¿ é ã§ã¯ãããŸãããåæ§ã®å¹æãåŸãæ¹æ³ã¯å€æ°ãããŸãããã®æ¹æ³ã®å©ç¹ã¯ãinteractive shell ãéããããšã§ä»¥åã®ç¶æ ãèªåçã«åŸ©å ãããããšãšããã¡ã€ã«å ã«ãšã©ãŒãããå Žåã«äœãå®è¡ãããªãããšã§ãã
詳ãã㯠nftables wiki ãšããã®åŠçãèªååããŠè²ä»ããã python tool ãåç §ããŠãã ããã
iptables-nft ã®äœ¿çš
å€ã iptables èšèªã¯ Linux ããã¥ã¡ã³ãã§ã¯äŸç¶ãšããŠããªãæ¯é çã§ãããDocker ã®ãããã¯ãŒã¯ãªã©ãiptables ã«äŸåããŠåäœãããã®ãå°ãªããããŸãããlegacy iptables ãš nftables ãåæã«äœ¿ãããšãå¯èœã§ã¯ãããŸãããiptables-nft ã®å€æã䜿ãããšãæšå¥šãããŸããçç±ã¯æ¬¡ã®ãšããã§ã:
- ãã¹ãŠãæ°ãããããå¹ççã§ãããã¯ãå¿ èŠãšããªããã¬ãŒã ã¯ãŒã¯ã®åãå Žæã«é 眮ããŸãã
- ç«¶åããã§ãã¯ããŸãã
nftables ã§å€ã iptables èšèªã䜿çšããæ¹æ³ã¯ 2 ã€ãããŸã:
iptables-translateãšiptables-restore-translate(ip6tablesãebtablesãªã©ãåæ§) ã¯ãiptables èšèªãåãåã nft èšèªãåºåããŸããå®è¡äžã® nft èšå®ã¯å€æŽããŸãããxtables-translate(8) ãåç §ããŠãã ããã
- åŸã§ä¿å®ãããèšå®ã«ã€ããŠã¯ã
-translateããŒã«ã䜿ãããã®çµæã®ã³ãŒããæ¢åã®ã«ãŒã«ã«çµ±åããã®ãããã§ããããäŸãã°ãã·ã³ãã«ãªã¹ããŒããã«ãã¡ã€ã¢ãŠã©ãŒã«ãã€ã³ã¿ãŒãããäžã§äŸ¿å©ãªãã®ãèŠã€ããå Žåããããã nft èšå®ã«å ¥ããããããã«å€æã§ããŸãã
iptablesãšiptables-restore(ip6tablesãªã©ãåæ§) ã¯äžèšã®å€æã䜿ããããã«å®è¡äžã® nft èšå®ã«åæ ããŸããéåžžã® iptables ãšåãããã«çµ±èšæ å ±ãæäŸããŸããxtables-nft(8) ãåç §ããŠãã ããã
- ãããã®ã³ãã³ãã¯ãããã¹ãããšãèããã°ååã«ããŸãåäœããŸããåçŽãªäœ¿ãæ¹ã§ã¯ããã®ãŸãŸåããã¯ãã§ããããšãã©ãæåã§ã®ãããã°ãå¿ èŠã«ãªãããšããããŸãã
systemd-networkd ã䜿ã£ãåçååä»ãã»ãã
systemd-networkd ã®æ¥ç¶ã¯ãNFTSet= ãªãã·ã§ã³ã䜿çšããŠãäºåå®çŸ©ãããååä»ãã»ããã«ãã¹ã IP ã¢ãã¬ã¹ããããã¯ãŒã¯ãã¬ãã£ãã¯ã¹ãã€ã³ã¿ãŒãã§ã€ã¹ã€ã³ããã¯ã¹ãæå
¥ã§ããŸããããã«ããã/etc/nftables.conf ã«ããããããŒãã³ãŒãã£ã³ã°ããããšãé¿ããããŸããNFTSet= ãªãã·ã§ã³ã¯ã[Address]ã[DHCPv4]ã[DHCPv6]ã[IPv6AcceptRA] ã»ã¯ã·ã§ã³ã§ãµããŒããããŠããŸããsystemd.network(5) § [ADDRESS SECTION OPTIONS] ãåç
§ããŠãã ããã
äŸãã°ãããŒã«ã«ãããã¯ãŒã¯ããã®æ¥ç¶ (IP ã¢ãã¬ã¹ã DHCP ãŸã㯠SLAAC ã§å²ãåœãŠãããå Žå) ãå¥ã® my_input_lan ãã§ã€ã³ã§åŠçããã«ã¯:
/etc/nftables.conf
...
table inet my_table {
set eth_ipv4_prefix {
type ipv4_addr
flags interval
comment "Populated by systemd-networkd"
}
set eth_ipv6_prefix {
type ipv6_addr
flags interval
comment "Populated by systemd-networkd"
elements = { fe80::/10 }
}
set eth_ifindex {
type iface_index
comment "Populated by systemd-networkd"
}
...
chain my_input {
type filter hook input priority filter; policy drop;
iif @eth_ifindex ip6 saddr @eth_ipv6_prefix jump my_input_lan comment "Connections from LAN"
iif @eth_ifindex ip saddr @eth_ipv4_prefix jump my_input_lan comment "Connections from LAN"
}
...
}
/etc/systemd/network/my-network.network
... [DHCPv4] NFTSet=prefix:inet:my_table:eth_ipv4_prefix NFTSet=ifindex:inet:my_table:eth_ifindex [DHCPv6] NFTSet=prefix:inet:my_table:eth_ipv6_prefix NFTSet=ifindex:inet:my_table:eth_ifindex [IPv6AcceptRA] NFTSet=prefix:inet:my_table:eth_ipv6_prefix NFTSet=ifindex:inet:my_table:eth_ifindex ...
ãã©ãã«ã·ã¥ãŒãã£ã³ã°
Docker ãšå ±ã«äœ¿ã
- 次ã®ã»ããã¢ããã§ã¯ã
--net host --privilegedã䜿çšããŠãã³ã³ããå ã§AF_BLUETOOTHãªã©ã®ãããã³ã«ãå©çšã§ããªããªããŸãã - ã«ãŒãã¬ã¹ Dockerã³ã³ããã¯ãã§ã«å¥ã®ãããã¯ãŒã¯åå空éã§å®è¡ãããŠããŸããäœãããå¿ èŠããªããããããŸããã
nftables ã䜿çšãããšãDocker ã®ãããã¯ãŒã¯ (ããããä»ã®ã³ã³ããã©ã³ã¿ã€ã ãåæ§) ã«å¹²æžããå¯èœæ§ããããŸãã iptables ã«ãŒã«ã«ããããé©çšããŠå®çŸ©ããããµãŒãã¹éå§é åºã確ä¿ããããdocker ã®äœ¿çšãéåžžã«å¶éããã dockerã®iptablesã®ç®¡çãå®å šã«ç¡å¹ã«ãããªã©ãããŸããŸãªåé¿çãã€ã³ã¿ãŒãããäžã§èŠã€ãããŸãã (ããŒããã©ã¯ãŒãã£ã³ã°ã docker-compose ãèããŠãã ãã)
ä¿¡é Œã§ããæ¹æ³ã¯ãdocker ãå¥ã®ãããã¯ãŒã¯åå空éã§å®è¡ãããããã§ä»»æã®åŠçãå®è¡ã§ããããã«ããããšã§ãã Docker ã nftables ãš iptables ã«ãŒã«ãæ··åšãããªãããã«ãiptables-nft ã䜿çšããªãæ¹ãè¯ãã§ãããã
以äžã® docker ãµãŒãã¹ ããããã€ã³ãã¡ã€ã« ã䜿çšããŠãã ãã:
/etc/systemd/system/docker.service.d/netns.conf
[Service] PrivateNetwork=yes PrivateMounts=No # cleanup ExecStartPre=-nsenter -t 1 -n -- ip link delete docker0 # add veth ExecStartPre=nsenter -t 1 -n -- ip link add docker0 type veth peer name docker0_ns ExecStartPre=sh -c 'nsenter -t 1 -n -- ip link set docker0_ns netns "$$BASHPID" && true' ExecStartPre=ip link set docker0_ns name eth0 # bring host online ExecStartPre=nsenter -t 1 -n -- ip addr add 10.0.0.1/24 dev docker0 ExecStartPre=nsenter -t 1 -n -- ip link set docker0 up # bring ns online ExecStartPre=ip addr add 10.0.0.100/24 dev eth0 ExecStartPre=ip link set eth0 up ExecStartPre=ip route add default via 10.0.0.1 dev eth0
ã»ããã¢ããã«ãããŠIPã¢ãã¬ã¹ 10.0.0.* ãé©åã§ãªãå Žåã¯ã調æŽããŠãã ããã
以äžã®ãã¹ãã«ãŒãã£ã³ã°ã«ãŒã«ã§ãdocker0 ã®IPãã©ã¯ãŒãã£ã³ã°ãæå¹ã«ããNATãèšå®ããŸã:
iifname docker0 oifname eth0 masquerade
次ã«ãkernel IP forwarding ãæå¹ã«ãªã£ãŠããããšã確èªããŸãã
ããã§ãnftables ã䜿çšã㊠docker0 ã€ã³ã¿ãŒãã§ã€ã¹ã®ãã¡ã€ã¢ãŠã©ãŒã«ãšããŒããã©ã¯ãŒãã£ã³ã°ãå¹²æžããããšãªãã»ããã¢ããã§ããããã«ãªããŸãã
åç §
- netfilter nftables wiki
- debian:nftables
- gentoo:nftables
- First release of nftables
- nftables quick howto
- The return of nftables
- What comes after âiptablesâ? Its successor, of course: `nftables`
- Gene's Tech Blog â ã¯ãŒã¯ã¹ããŒã·ã§ã³ããã³ãã¡ã€ã¢ãŠã©ãŒã«åãã®è¿œå nftables ãµã³ãã«