Согласно предложению @ garethTheRed в комментариях, я создал ловушку диспетчера сети.
Создайте следующий файл по адресу /etc/NetworkManager/dispatcher.d/99_foo.dynu.com.sh
. Это происходит при обнаружении нового сетевого подключения (например, Ethernet или Wi-Fi). Затем он идентифицирует мою «домашнюю сеть» двумя способами: BSSID / SSID и статический IP-адрес, который мне назначает мой маршрутизатор. (На данный момент это не работает, когда я подключаюсь через Ethernet, поскольку это относительно редко.) Затем он добавляет отображение в файл hosts, если мы находимся в домашней сети; если нет, то он удаляет эту строку.
#!/bin/sh
# Map domain name to internal IP when connected to home network (via wifi)
# Partially inspired by http://sysadminsjourney.com/content/2008/12/18/use-networkmanager-launch-scripts-based-network-location/
WIFI_ID_TEST='Connected to 11:11:11:11:11:11 (on wlp3s0)
SSID: WifiName'
LOCAL_IP_TEST='192.168.1.90'
MAPPING='192.168.1.100 foo.dynu.com'
HOSTS_PATH=/etc/hosts
IF=$1
STATUS=$2
# Either wifi or ethernet goes up
if [ "$STATUS" = 'up' ] && { [ "$IF" = 'wlp3s0' ] || [ "$IF" = 'enp10s0' ]; }; then
# BSSID and my static IP, i.e. home network
if [ "$(iw dev wlp3s0 link | head -n 2)" = "$WIFI_ID_TEST" ] && [ -n "$(ip addr show wlp3s0 to ${LOCAL_IP_TEST})" ]; then
grep -qx "$MAPPING" "$HOSTS_PATH" || echo "$MAPPING" >> "$HOSTS_PATH"
else
ESC_MAPPING="^$(<<<"$MAPPING" sed 's/\./\\./g')$"
sed -i "/${ESC_MAPPING}/d" "$HOSTS_PATH"
fi
fi