Назад | Перейти на главную страницу

Как заставить работать systemd-resolved при использовании iptables SNAT / Masquerading?

Многочисленные поисковые запросы (и эксперименты) не дали ответа, что удивительно, поскольку наверняка кто-то еще столкнулся с этой проблемой.

У меня есть виртуальная машина 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

но это не сработало (и, оглядываясь назад, это даже не имеет смысла для меня).