Я пытаюсь использовать iptables в одной системе, чтобы действовать как брандмауэр для фильтрации пакетов и передачи действительных пакетов на серверы за этим брандмауэром, но если я использую DNAT, данные будут передаваться на серверы напрямую, а не фильтроваться.
Что мне делать для этого?
Посмотри на диаграмма на этой странице. Он показывает, как правила NAT предшествуют правилам FORWARD. Даже если вы используете DNAT для какого-либо хоста за брандмауэром, пакет все равно проходит через правила FORWARD (и POSTROUTING) перед фактической отправкой на хост.
Вы можете выполнить фильтрацию в правилах FORWARD. Также полезно при отладке ваших правил вставить что-то вроде этого FORWARD, который будет регистрироваться в системном журнале:
iptables -I FORWARD 1 -j LOG --log-prefix="FWD: "
Это создаст много записей в системном журнале, но даст вам некоторое представление о том, какой трафик передается. Как только вы все настроите, просто удалите правило.
Даже DNAT-пакеты проходят через фильтр. Обрабатывается в порядке
NAT-PREROUTING (e.g. DNAT) => FORWARD => NAT-POSTROUTING (e.g. SNAT, MASQUERADE)
Если это не работает для вас, скорее всего, это потому, что у вас есть правила пересылки, основанные на заголовках, действительных до DNAT. Как только DNAT завершен для обработки пересылки, он обрабатывается с уже измененным адресатом.
Если вы предоставите более подробную информацию о правилах и информации о том, какой трафик «не фильтруется», кто-нибудь может попытаться проверить ваш случай ... Вы предоставили слишком много информации, чтобы быть более конкретным.