Многочисленные поисковые запросы (и эксперименты) не дали ответа, что удивительно, поскольку наверняка кто-то еще столкнулся с этой проблемой.
У меня есть виртуальная машина Ubuntu 18.04, единственная задача которой - передавать пакеты NAT на различные внешние хосты с локального сервера, который не будет связываться ни с чем, что находится не в локальной сети. Эта часть работает нормально. Проблема в том, что всякий раз, когда я включаю SNAT:
iptables -t nat -A POSTROUTING -j SNAT --to-source 128.128.128.128
systemd-resolved перестает работать:
root@ubuntu-tid-server:/etc/iptables# host google.com
Host google.com not found: 2(SERVFAIL)
root@ubuntu-tid-server:/etc/iptables# systemctl status systemd-resolved
Jan 10 12:33:40 ubuntu-tid-server systemd-resolved[622]: Got packet on unexpected IP range, refusing.
Думаю, я смутно понимаю, в чем проблема. systemd-resolved использует локальный адрес (127.0.0.53) в качестве заглушки и перенаправляет оттуда DNS-запросы. Постмаршрутизация SNAT изменяет адрес источника на 128.128.128.128, что приводит к появлению сообщения об ошибке выше.
Да, я мог бы просто отключить systemd-resolved и использовать что-нибудь еще, но меня действительно беспокоит, что нет очевидного решения для совместной работы двух универсальных системных служб.
Изменить: на другом форуме кто-то предложил это решение:
Решением было проверить настройки брандмауэра и исключить устройство обратной петли lo из маскировки исходных IP-адресов.
Итак, я попробовал это:
iptables -t nat -A POSTROUTING ! -s 127.0.0.1/8 -j SNAT --to-source 128.128.128.128
но это не сработало (и, оглядываясь назад, это даже не имеет смысла для меня).