Skip to content

Commit

Permalink
Merge remote-tracking branch 'remotes/nvinson/nftables'
Browse files Browse the repository at this point in the history
Gentoo Bug: #540198
  • Loading branch information
Ian Delaney committed Nov 3, 2015
2 parents 4adcd55 + 37bdeb0 commit cc0cd07
Show file tree
Hide file tree
Showing 6 changed files with 366 additions and 0 deletions.
150 changes: 150 additions & 0 deletions net-firewall/nftables/files/libexec/nftables.sh
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 $?
123 changes: 123 additions & 0 deletions net-firewall/nftables/files/nftables.init-r2
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 net-firewall/nftables/files/systemd/nftables-restore.service
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 net-firewall/nftables/files/systemd/nftables-store.service
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
6 changes: 6 additions & 0 deletions net-firewall/nftables/files/systemd/nftables.service
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
62 changes: 62 additions & 0 deletions net-firewall/nftables/nftables-0.5-r2.ebuild
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
}

0 comments on commit cc0cd07

Please sign in to comment.