systemd IP restrictions really do restrict
Now all my machine configs are in Ansible, I've been making things a bit more organised and safer, for
instance by allowing SSH from a whitelisted host in case I break Tailscale. I saw systemd had
support for restricting IP access to a service, so decided to give it ago. It's easy - just add in a dropin
file, like
/etc/systemd/system/ssh.service.d/override.conf:
[Service]
IPAddressDeny=any
# home
IPAddressAllow=1.2.3.4
# some other trusted server
IPAddressAllow=2001::1
Which does indeed work! Before this change is applied, I can login from any host. After, I can only log in via
the whitelisted host. Trebles all around. Put it in an Ansible role for one host to let the change soak, and
then off we go. I noticed a bit later, though, that Ansible was no longer working on that host. SSHing (from
one of the listed hosts, which works) works great, but then sudo apt update
just spins, first failing to connect to some IPv4 addresses, then failing to connect to some IPv6 addresses.
As far as I can tell, it turns out that the above systemd option works by injecting BPF in to the kernel for this little cgroup, which does indeed block inbound SSH, but also blocks
traffic for all things invoked under SSH, for instance Ansible, and all interactive
users. On the web, I found lots of people suggesting using IPAddressDeny for SSH (one,
two,
three), but zero people pointing out that
it's basically useless since it will make SSH shells useless for all users logging in to it.