NFTables: можно ли перенаправлять трафик, не маскируя его?

У меня есть удаленный сервер (B), который пересылает определенный входящий трафик на другой порт другого сервера (A, dest).
При "маскараде" я вижу только трафик, исходящий от прямого сервера (B), возможно ли увидеть трафик, исходящий из исходных источников (C)? Если я заменю "masquerade" на "accept", я больше не смогу подключиться к порту 8080 пункта назначения (A).

Эскиз:

C -> B:25 -> A:8080
# A receives C requests as if B made them
# Unfortunately this breaks some implementations like SPF

Конфигурация NFTables:

# define destination address
define dest = 10.0.0.2

# table for smtp forwarding
table ip smtp {
 chain pre {
  type nat hook prerouting priority -100
  tcp dport 25 dnat to $dest:8080
 }
 chain post {
  type nat hook postrouting priority 100
  ip daddr $dest masquerade
 }
}

1 ответ

Решение

Поскольку Tero Kilkanen так любезно ответил на мой вопрос, я надеюсь предоставить вам минимальный рабочий пример.

Предварительные условия:

  1. IP-переадресация должна быть активирована (проверьте с помощью sysctl -a | grep forward) на remote server
  2. оба сервера должны быть в одной сети
  3. Твой different server должен иметь remote server в качестве шлюза по умолчанию (возможно ли это в вашем случае?)
  4. Ядро должно быть 4.18, иначе вам нужно также определить правило постмаршрутизации (см. Nftables wiki)
  5. Ваш внешний интерфейс remote server является enp35s0 в противном случае замените соответственно

Учитывая это, вы можете использовать следующие правила NFTables

table ip nat {
        chain prerouting {
                type nat hook prerouting priority 0; policy accept;
                iif "enp35s0" tcp dport 25 dnat to 10.0.0.2:8080
        }
}
table inet filter {
        chain input {
                type filter hook input priority 0; policy accept;
        }

        chain forward {
                type filter hook forward priority 0; policy accept;
        }

        chain output {
                type filter hook output priority 0; policy accept;
        }
}

Для отладки проверьте tcpdump на different server

Другие вопросы по тегам