#!/bin/sh
# nisse-firewall ADDRESS PORT: only ADDRESS may reach a port Docker publishes
# as PORT. Docker publishes ports past the host's own firewall rules, so the
# limit goes in its DOCKER-USER chain. Installed by setup.sh and run by
# nisse-firewall.service whenever Docker starts. Its own rules (tagged) are
# replaced each run, so a changed address leaves no old rule behind.
set -eu
address=$1 port=$2
iptables -S DOCKER-USER | grep -- '--comment nisse-firewall' | sed 's/^-A /-D /' |
  while read -r old; do eval "iptables $old"; done
iptables -I DOCKER-USER -p tcp -m conntrack --ctorigdstport "$port" \
  --ctdir ORIGINAL ! -s "$address" -m comment --comment nisse-firewall -j DROP
