forked from gentoo/gentoo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'remotes/nvinson/nftables'
Gentoo Bug: #540198
- Loading branch information
Showing
6 changed files
with
366 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,150 @@ | ||
#! /bin/sh | ||
|
||
main() { | ||
local NFTABLES_SAVE=${2:-'/var/lib/nftables/rules-save'} | ||
local retval | ||
case "$1" in | ||
"clear") | ||
if ! use_legacy; then | ||
nft flush ruleset | ||
else | ||
clear_legacy | ||
fi | ||
retval=$? | ||
;; | ||
"list") | ||
if ! use_legacy; then | ||
nft list ruleset | ||
else | ||
list_legacy | ||
fi | ||
retval=$? | ||
;; | ||
"load") | ||
nft -f ${NFTABLES_SAVE} | ||
retval=$? | ||
;; | ||
"store") | ||
local tmp_save="${NFTABLES_SAVE}.tmp" | ||
if ! use_legacy; then | ||
nft list ruleset > ${tmp_save} | ||
else | ||
save_legacy ${tmp_save} | ||
fi | ||
retval=$? | ||
if [ ${retval} ]; then | ||
mv ${tmp_save} ${NFTABLES_SAVE} | ||
fi | ||
;; | ||
esac | ||
return ${retval} | ||
} | ||
|
||
clear_legacy() { | ||
local l3f line table chain first_line | ||
|
||
first_line=1 | ||
if manualwalk; then | ||
for l3f in $(getfamilies); do | ||
nft list tables ${l3f} | while read line; do | ||
table=$(echo ${line} | sed "s/table[ \t]*//") | ||
deletetable ${l3f} ${table} | ||
done | ||
done | ||
else | ||
nft list tables | while read line; do | ||
l3f=$(echo ${line} | cut -d ' ' -f2) | ||
table=$(echo ${line} | cut -d ' ' -f3) | ||
deletetable ${l3f} ${table} | ||
done | ||
fi | ||
} | ||
|
||
list_legacy() { | ||
local l3f | ||
|
||
if manualwalk; then | ||
for l3f in $(getfamilies); do | ||
nft list tables ${l3f} | while read line; do | ||
line=$(echo ${line} | sed "s/table/table ${l3f}/") | ||
echo "$(nft list ${line})" | ||
done | ||
done | ||
else | ||
nft list tables | while read line; do | ||
echo "$(nft list ${line})" | ||
done | ||
fi | ||
} | ||
|
||
save_legacy() { | ||
tmp_save=$1 | ||
touch "${tmp_save}" | ||
if manualwalk; then | ||
for l3f in $(getfamilies); do | ||
nft list tables ${l3f} | while read line; do | ||
line=$(echo ${line} | sed "s/table/table ${l3f}/") | ||
nft ${SAVE_OPTIONS} list ${line} >> ${tmp_save} | ||
done | ||
done | ||
else | ||
nft list tables | while read line; do | ||
nft ${SAVE_OPTIONS} list ${line} >> "${tmp_save}" | ||
done | ||
fi | ||
} | ||
|
||
use_legacy() { | ||
local major_ver minor_ver | ||
|
||
major_ver=$(uname -r | cut -d '.' -f1) | ||
minor_ver=$(uname -r | cut -d '.' -f2) | ||
|
||
[[ $major_ver -ge 4 || $major_ver -eq 3 && $minor_ver -ge 18 ]] && return 1 | ||
return 0 | ||
} | ||
|
||
CHECK_TABLE_NAME="GENTOO_CHECK_TABLE" | ||
|
||
getfamilies() { | ||
local l3f families | ||
|
||
for l3f in ip arp ip6 bridge inet; do | ||
if nft create table ${l3f} ${CHECK_TABLE_NAME} > /dev/null 2>&1; then | ||
families="${families}${l3f} " | ||
nft delete table ${l3f} ${CHECK_TABLE_NAME} | ||
fi | ||
done | ||
echo ${families} | ||
} | ||
|
||
manualwalk() { | ||
local result l3f=`getfamilies | cut -d ' ' -f1` | ||
|
||
nft create table ${l3f} ${CHECK_TABLE_NAME} | ||
nft list tables | read line | ||
if [ $(echo $line | wc -w) -lt 3 ]; then | ||
result=0 | ||
fi | ||
result=1 | ||
nft delete table ${l3f} ${CHECK_TABLE_NAME} | ||
|
||
return $result | ||
} | ||
|
||
deletetable() { | ||
# family is $1 | ||
# table name is $2 | ||
nft flush table $1 $2 | ||
nft list table $1 $2 | while read l; do | ||
chain=$(echo $l | grep -o 'chain [^[:space:]]\+' | cut -d ' ' -f2) | ||
if [ -n "${chain}" ]; then | ||
nft flush chain $1 $2 ${chain} | ||
nft delete chain $1 $2 ${chain} | ||
fi | ||
done | ||
nft delete table $1 $2 | ||
} | ||
|
||
main "$@" | ||
exit $? |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
#!/sbin/runscript | ||
# Copyright 2014 Nicholas Vinson | ||
# Copyright 1999-2014 Gentoo Foundation | ||
# Distributed under the terms of the GNU General Public License v2 | ||
|
||
extra_commands="clear list panic save" | ||
extra_started_commands="reload" | ||
depend() { | ||
need localmount #434774 | ||
before net | ||
} | ||
|
||
start_pre() { | ||
checkkernel || return 1 | ||
checkconfig || return 1 | ||
return 0 | ||
} | ||
|
||
clear() { | ||
/usr/libexec/nftables/nftables.sh clear || return 1 | ||
return 0 | ||
} | ||
|
||
list() { | ||
/usr/libexec/nftables/nftables.sh list || return 1 | ||
return 0 | ||
} | ||
|
||
panic() { | ||
checkkernel || return 1 | ||
if service_started ${RC_SVCNAME}; then | ||
rc-service ${RC_SVCNAME} stop | ||
fi | ||
|
||
ebegin "Dropping all packets" | ||
clear | ||
if nft create table ip filter >/dev/null 2>&1; then | ||
nft -f /dev/stdin <<-EOF | ||
table ip filter { | ||
chain input { | ||
type filter hook input priority 0; | ||
drop | ||
} | ||
chain forward { | ||
type filter hook forward priority 0; | ||
drop | ||
} | ||
chain output { | ||
type filter hook output priority 0; | ||
drop | ||
} | ||
} | ||
EOF | ||
fi | ||
if nft create table ip6 filter >/dev/null 2>&1; then | ||
nft -f /dev/stdin <<-EOF | ||
table ip6 filter { | ||
chain input { | ||
type filter hook input priority 0; | ||
drop | ||
} | ||
chain forward { | ||
type filter hook forward priority 0; | ||
drop | ||
} | ||
chain output { | ||
type filter hook output priority 0; | ||
drop | ||
} | ||
} | ||
EOF | ||
fi | ||
} | ||
|
||
reload() { | ||
checkkernel || return 1 | ||
ebegin "Flushing firewall" | ||
clear | ||
start | ||
} | ||
|
||
save() { | ||
ebegin "Saving nftables state" | ||
checkpath -q -d "$(dirname "${NFTABLES_SAVE}")" | ||
checkpath -q -m 0600 -f "${NFTABLES_SAVE}" | ||
/usr/libexec/nftables/nftables.sh store ${NFTABLES_SAVE} | ||
return $? | ||
} | ||
|
||
start() { | ||
ebegin "Loading nftables state and starting firewall" | ||
clear | ||
/usr/libexec/nftables/nftables.sh load ${NFTABLES_SAVE} | ||
eend $? | ||
} | ||
|
||
stop() { | ||
if yesno ${SAVE_ON_STOP:-yes}; then | ||
save || return 1 | ||
fi | ||
|
||
ebegin "Stopping firewall" | ||
clear | ||
eend $? | ||
} | ||
|
||
checkconfig() { | ||
if [ ! -f ${NFTABLES_SAVE} ]; then | ||
eerror "Not starting nftables. First create some rules then run:" | ||
eerror "rc-service nftables save" | ||
return 1 | ||
fi | ||
return 0 | ||
} | ||
|
||
checkkernel() { | ||
if ! nft list tables >/dev/null 2>&1; then | ||
eerror "Your kernel lacks nftables support, please load" | ||
eerror "appropriate modules and try again." | ||
return 1 | ||
fi | ||
return 0 | ||
} |
14 changes: 14 additions & 0 deletions
14
net-firewall/nftables/files/systemd/nftables-restore.service
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
[Unit] | ||
Description=Restore nftables firewall rules | ||
# if both are queued for some reason, don't store before restoring :) | ||
Before=nftables-store.service | ||
# sounds reasonable to have firewall up before any of the services go up | ||
Before=network.target | ||
Conflicts=shutdown.target | ||
|
||
[Service] | ||
Type=oneshot | ||
ExecStart=/usr/libexec/nftables/nftables.sh load /var/lib/nftables/rules-save | ||
|
||
[Install] | ||
WantedBy=basic.target |
11 changes: 11 additions & 0 deletions
11
net-firewall/nftables/files/systemd/nftables-store.service
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
[Unit] | ||
Description=Store nftables firewall rules | ||
Before=shutdown.target | ||
DefaultDependencies=No | ||
|
||
[Service] | ||
Type=oneshot | ||
ExecStart=/usr/libexec/nftables/nftables.sh store /var/lib/nftables/rules-save | ||
|
||
[Install] | ||
WantedBy=shutdown.target |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
[Unit] | ||
Description=Store and restore nftables firewall rules | ||
|
||
[Install] | ||
Also=nftables-store.service | ||
Also=nftables-restore.service |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
# Copyright 1999-2015 Gentoo Foundation | ||
# Distributed under the terms of the GNU General Public License v2 | ||
# $Id$ | ||
|
||
EAPI=5 | ||
|
||
inherit autotools linux-info eutils systemd | ||
|
||
DESCRIPTION="Linux kernel (3.13+) firewall, NAT and packet mangling tools" | ||
HOMEPAGE="http://netfilter.org/projects/nftables/" | ||
SRC_URI="http://git.netfilter.org/nftables/snapshot/v${PV}.tar.gz -> ${P}.tar.gz" | ||
|
||
LICENSE="GPL-2" | ||
SLOT="0" | ||
KEYWORDS="~amd64 ~arm ~x86" | ||
IUSE="debug gmp +readline" | ||
|
||
RDEPEND=">=net-libs/libmnl-1.0.3 | ||
>=net-libs/libnftnl-1.0.5 | ||
gmp? ( dev-libs/gmp:0= ) | ||
readline? ( sys-libs/readline:0= )" | ||
DEPEND="${RDEPEND} | ||
>=app-text/docbook2X-0.8.8-r4 | ||
sys-devel/bison | ||
sys-devel/flex" | ||
|
||
S="${WORKDIR}"/v${PV} | ||
|
||
pkg_setup() { | ||
if kernel_is ge 3 13; then | ||
CONFIG_CHECK="~NF_TABLES" | ||
linux-info_pkg_setup | ||
else | ||
eerror "This package requires kernel version 3.13 or newer to work properly." | ||
fi | ||
} | ||
|
||
src_prepare() { | ||
epatch_user | ||
eautoreconf | ||
} | ||
|
||
src_configure() { | ||
econf \ | ||
--sbindir="${EPREFIX}"/sbin \ | ||
$(use_enable debug) \ | ||
$(use_with readline cli) \ | ||
$(use_with !gmp mini_gmp) | ||
} | ||
|
||
src_install() { | ||
default | ||
|
||
dodir /usr/libexec/${PN} | ||
cp -p "${FILESDIR}"/libexec/${PN}.sh "${D}"/usr/libexec/${PN}/${PN}.sh | ||
|
||
newconfd "${FILESDIR}"/${PN}.confd ${PN} | ||
newinitd "${FILESDIR}"/${PN}.init-r2 ${PN} | ||
keepdir /var/lib/nftables | ||
|
||
systemd_dounit "${FILESDIR}"/systemd/${PN}{,-{re,}store}.service | ||
} |