Skip to content

Commit

Permalink
15fcos: add 35coreos-iptables dracut module
Browse files Browse the repository at this point in the history
This implements the proposal agreed upon in:
coreos/fedora-coreos-tracker#676

On upgrading nodes, we look for `/etc/coreos/iptables-legacy.stamp`. If
found, we move the system back to iptables-legacy. If any modifications
already exist to the configuration, we do nothing.
  • Loading branch information
jlebon committed Dec 8, 2021
1 parent d6c7e96 commit 81782b1
Show file tree
Hide file tree
Showing 6 changed files with 166 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[Unit]
Description=CoreOS Enable iptables-legacy
ConditionPathExists=/etc/initrd-release
DefaultDependencies=false
ConditionPathExists=/sysroot/etc/coreos/iptables-legacy.stamp

# On first boot, allow Ignition config to install stamp file.
After=ignition-files.service

# On subsequent boots, just make sure the deployment is accessible.
After=ostree-prepare-root.service

Before=initrd.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/coreos-enable-iptables-legacy
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#!/bin/bash
set -euo pipefail

declare -A SYMLINKS=(
[ip6tables]=ip6tables-legacy
[ip6tables-restore]=ip6tables-legacy-restore
[ip6tables-save]=ip6tables-legacy-save
[iptables]=iptables-legacy
[iptables-restore]=iptables-legacy-restore
[iptables-save]=iptables-legacy-save
)

STAMP=/sysroot/etc/coreos/iptables-legacy.stamp
IGNITION_RESULT=/sysroot/etc/.ignition-result.json

# sanity-check the stamp file is present
if [ ! -e "${STAMP}" ]; then
echo "File ${STAMP} not found; exiting."
exit 0
fi

# We only want to run once.
rm "${STAMP}"

# Ignore firstboot. We don't want the stamp file to be a long-term
# provisioning-time API for moving to iptables-legacy, so explicitly check for
# this and don't support it. We use the Ignition report file because it's less
# hacky than parsing the kernel commandline for `ignition.firstboot`.
if [ -e "${IGNITION_RESULT}" ]; then
ignition_boot=$(jq -r .provisioningBootID "${IGNITION_RESULT}")
if [ "$(cat /proc/sys/kernel/random/boot_id)" = "${ignition_boot}" ]; then
echo "First boot detected; exiting."
exit 0
fi
fi

# if legacy doesn't exist on the host anymore, do nothing
for legacy in "${SYMLINKS[@]}"; do
path=/sysroot/usr/sbin/$legacy
if [ ! -e "$path" ]; then
echo "Executable $path no longer present; exiting."
exit 0
fi
done

symlink_is_default() {
local symlinkpath=$1; shift
# check that the deployment is still using the symlink (i.e. the user didn't
# do something funky), and that the OSTree default is still symlink-based
# (i.e. that we didn't change strategy and forgot to update this script)
if [ ! -L "/sysroot/$symlinkpath" ] || [ ! -L "/sysroot/usr/$symlinkpath" ]; then
return 1
fi
# compare symlink targets between deployment and OSTree default
if [ "$(readlink "/sysroot/$symlinkpath")" != "$(readlink "/sysroot/usr/$symlinkpath")" ]; then
return 1
fi
# it's the default
return 0
}

# If there are any modifications to the symlinks, do nothing. This is basically
# like `ostree admin config-diff` but more focused and lighter/safer than doing
# a bwrap call and grepping output.
for symlink in "${!SYMLINKS[@]}"; do
symlinkpath=/etc/alternatives/$symlink
if ! symlink_is_default "$symlinkpath"; then
echo "Symlink $symlinkpath is not default; exiting without modifying."
exit 0
fi
done

# Update symlinks for legacy backend!
for symlink in "${!SYMLINKS[@]}"; do
target=${SYMLINKS[$symlink]}
symlink=/etc/alternatives/$symlink
ln -vsf "/usr/sbin/$target" "/sysroot/$symlink"
# symlink labels don't matter, but relabel to appease unlabeled_t scanners
coreos-relabel "$symlink"
done

echo "Updated /sysroot to use iptables-legacy."
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
install_and_enable_unit() {
unit="$1"; shift
target="$1"; shift
inst_simple "$moddir/$unit" "$systemdsystemunitdir/$unit"
# note we `|| exit 1` here so we error out if e.g. the units are missing
# see https://github.com/coreos/fedora-coreos-config/issues/799
systemctl -q --root="$initdir" add-requires "$target" "$unit" || exit 1
}

install() {
inst_simple readlink

inst_simple "$moddir/coreos-enable-iptables-legacy.sh" \
"/usr/sbin/coreos-enable-iptables-legacy"
install_and_enable_unit "coreos-enable-iptables-legacy.service" \
"initrd.target"
}
28 changes: 28 additions & 0 deletions tests/kola/firewall/iptables-legacy/config.bu
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
variant: fcos
version: 1.4.0
storage:
links:
- path: /etc/alternatives/iptables
target: /usr/sbin/iptables-legacy
overwrite: true
hard: false
- path: /etc/alternatives/iptables-restore
target: /usr/sbin/iptables-legacy-restore
overwrite: true
hard: false
- path: /etc/alternatives/iptables-save
target: /usr/sbin/iptables-legacy-save
overwrite: true
hard: false
- path: /etc/alternatives/ip6tables
target: /usr/sbin/ip6tables-legacy
overwrite: true
hard: false
- path: /etc/alternatives/ip6tables-restore
target: /usr/sbin/ip6tables-legacy-restore
overwrite: true
hard: false
- path: /etc/alternatives/ip6tables-save
target: /usr/sbin/ip6tables-legacy-save
overwrite: true
hard: false
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# is using the `nf_tables` backend.
# TODO: modify this test to check for `nf_tables` backend when FCOS switches.
# See https://github.com/coreos/fedora-coreos-config/pull/1324
# kola: { "distros": "fcos", "exclusive": false }
# kola: { "distros": "fcos", "exclusive": true }
set -xeuo pipefail

ok() {
Expand All @@ -15,10 +15,9 @@ fatal() {
exit 1
}

# Make sure we're still on legacy iptables for now
# https://github.com/coreos/fedora-coreos-tracker/issues/676#issuecomment-928028451
# Make sure we're on legacy iptables
if ! iptables --version | grep legacy; then
iptables --version # output for logs
fatal "iptables version is not legacy"
fi
ok "iptables still in legacy mode"
ok "iptables in legacy mode"
18 changes: 18 additions & 0 deletions tests/kola/firewall/iptables-nft/test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/bin/bash
# kola: { "exclusive": false }
set -xeuo pipefail

ok() {
echo "ok" "$@"
}

fatal() {
echo "$@" >&2
exit 1
}

if ! iptables --version | grep nf_tables; then
iptables --version # output for logs
fatal "iptables version is not nft"
fi
ok "iptables in nft mode"

0 comments on commit 81782b1

Please sign in to comment.