services: Add nftables-service-type.

* gnu/services/networking.scm (%default-nftables-ruleset): New variable.
(<nftables-configuration>): New record type.
(nftables-shepherd-service): New procedure.
(nftables-service-type): New service type.
* doc/guix.texi (Networking Services): Document it.
This commit is contained in:
宋文武 2019-09-13 17:53:59 +08:00
parent 62790449e6
commit 3c4f5ad7f4
No known key found for this signature in database
GPG Key ID: D415BF253B515976
2 changed files with 108 additions and 1 deletions

View File

@ -13041,6 +13041,33 @@ objects}).
@end table @end table
@end deftp @end deftp
@cindex nftables
@defvr {Scheme Variable} nftables-service-type
This is the service type to set up a nftables configuration. nftables is a
netfilter project that aims to replace the existing iptables, ip6tables,
arptables and ebtables framework. It provides a new packet filtering
framework, a new user-space utility @command{nft}, and a compatibility layer
for iptables. This service comes with a default ruleset
@code{%default-nftables-ruleset} that rejecting all incomming connections
except those to the ssh port 22. To use it, simply write:
@lisp
(service nftables-service-type)
@end lisp
@end defvr
@deftp {Data Type} nftables-configuration
The data type representing the configuration of nftables.
@table @asis
@item @code{package} (default: @code{nftables})
The nftables package that provides @command{nft}.
@item @code{ruleset} (default: @code{%default-nftables-ruleset})
The nftables ruleset to use. This may be any ``file-like'' object
(@pxref{G-Expressions, file-like objects}).
@end table
@end deftp
@cindex NTP (Network Time Protocol), service @cindex NTP (Network Time Protocol), service
@cindex ntpd, service for the Network Time Protocol daemon @cindex ntpd, service for the Network Time Protocol daemon
@cindex real time clock @cindex real time clock

View File

@ -11,6 +11,7 @@
;;; Copyright © 2018 Arun Isaac <arunisaac@systemreboot.net> ;;; Copyright © 2018 Arun Isaac <arunisaac@systemreboot.net>
;;; Copyright © 2019 Florian Pelz <pelzflorian@pelzflorian.de> ;;; Copyright © 2019 Florian Pelz <pelzflorian@pelzflorian.de>
;;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer@gmail.com> ;;; Copyright © 2019 Maxim Cournoyer <maxim.cournoyer@gmail.com>
;;; Copyright © 2019 Sou Bunnbu <iyzsong@member.fsf.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -144,7 +145,14 @@
iptables-configuration-iptables iptables-configuration-iptables
iptables-configuration-ipv4-rules iptables-configuration-ipv4-rules
iptables-configuration-ipv6-rules iptables-configuration-ipv6-rules
iptables-service-type)) iptables-service-type
nftables-service-type
nftables-configuration
nftables-configuration?
nftables-configuration-package
nftables-configuration-ruleset
%default-nftables-ruleset))
;;; Commentary: ;;; Commentary:
;;; ;;;
@ -1415,4 +1423,76 @@ COMMIT
(list (service-extension shepherd-root-service-type (list (service-extension shepherd-root-service-type
(compose list iptables-shepherd-service)))))) (compose list iptables-shepherd-service))))))
;;;
;;; nftables
;;;
(define %default-nftables-ruleset
(plain-file "nftables.conf"
"# A simple and safe firewall
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# early drop of invalid connections
ct state invalid drop
# allow established/related connections
ct state { established, related } accept
# allow from loopback
iifname lo accept
# allow icmp
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
# allow ssh
tcp dport ssh accept
# reject everything else
reject with icmpx type port-unreachable
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
"))
(define-record-type* <nftables-configuration>
nftables-configuration
make-nftables-configuration
nftables-configuration?
(package nftables-configuration-package
(default nftables))
(ruleset nftables-configuration-ruleset ; file-like object
(default %default-nftables-ruleset)))
(define nftables-shepherd-service
(match-lambda
(($ <nftables-configuration> package ruleset)
(let ((nft (file-append package "/sbin/nft")))
(shepherd-service
(documentation "Packet filtering and classification")
(provision '(nftables))
(start #~(lambda _
(invoke #$nft "--file" #$ruleset)))
(stop #~(lambda _
(invoke #$nft "flush" "ruleset"))))))))
(define nftables-service-type
(service-type
(name 'nftables)
(description
"Run @command{nft}, setting up the specified ruleset.")
(extensions
(list (service-extension shepherd-root-service-type
(compose list nftables-shepherd-service))
(service-extension profile-service-type
(compose list nftables-configuration-package))))
(default-value (nftables-configuration))))
;;; networking.scm ends here ;;; networking.scm ends here