-
Notifications
You must be signed in to change notification settings - Fork 158
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
15fcos: add 35coreos-iptables dracut module
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
Showing
6 changed files
with
166 additions
and
4 deletions.
There are no files selected for viewing
18 changes: 18 additions & 0 deletions
18
...d/15fcos/usr/lib/dracut/modules.d/35coreos-iptables/coreos-enable-iptables-legacy.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,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 |
82 changes: 82 additions & 0 deletions
82
overlay.d/15fcos/usr/lib/dracut/modules.d/35coreos-iptables/coreos-enable-iptables-legacy.sh
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,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." |
17 changes: 17 additions & 0 deletions
17
overlay.d/15fcos/usr/lib/dracut/modules.d/35coreos-iptables/module-setup.sh
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,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" | ||
} |
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,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 |
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
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,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" |