Как выполнить SNAT с измененным портом назначения?

Как выполнить SNAT с измененным портом назначения?

У меня есть хост Linux, который служит исходным NAT (SNAT). Он получает все пакеты для маршрута по умолчанию из внутренней сети на внутреннем интерфейсе с IP 192.168.2.1. Хост SNAT имеет несколько исходящих IP-адресов (например, 3.3.3.3, 3.3.3.4, 3.3.3.5, ...).

Я хотел бы настроить iptables (или какой-либо другой инструмент в Linux — это не обязательно должен быть iptables, — но я думаю, что это правильный инструмент) таким образом, чтобы порт, на который приходит пакет по внутреннему частному IP, определял IP, на который отправляется запрос, а исходящий порт был постоянным (например, порт 80).

Например, приведенное ниже сопоставление может быть прототипичным (все они будут получены на 192.168.2.1, но с IP-адресом назначения, указанным первым в сопоставлении ... -> указывает на устройство SNAT):

  • (источник) 192.168.xy:z (адрес назначения) 10.10.10.10:8001 -> (источник) 3.3.3.3:r (адрес назначения) 10.10.10.10:80
  • (источник) 192.168.xy:z (адрес назначения) 11.11.11.11:8002 -> (источник) 3.3.3.4:r (адрес назначения) 11.11.11.11:80
  • (источник) 192.168.xy:z (адрес назначения) 12.12.12.12:8003 -> (источник) 3.3.3.5:r (адрес назначения) 12.12.12.12:80
  • (источник) 192.168.xy:z (адрес назначения) 13.13.13.13:8004 -> (источник) 4.4.4.3:r (адрес назначения) 13.13.13.13:80

(192.168.xy может быть любым хостом в частной сети. Порты z и r почти наверняка являются временными портами и, очевидно, различны для каждого сеанса, но SNAT, очевидно, должен управлять этим состоянием, чтобы возвращать ответы правильному запрашивающему)

Вот конкретный пример:

Пакет может исходить из интерфейса в частной сети (например, 192.168.2.5). Исходный IP-адрес будет, таким образом, "192.168.2.5". Целевой IP-адрес может быть "10.10.10.10", а целевой порт может быть "8001". Таблица маршрутизации указывает локальному IP-маршрутизатору отправлять все пакеты, предназначенные для "0.0.0.0/0", на 192.168.2.1, и нет более конкретной записи в таблице маршрутизации. Итак, пакет прибывает на 192.168.2.1 (SNAT) с IP-адресом назначения 10.10.10.10 и портом назначения 8001. Если это произойдет, я хочу, чтобы NAT отправил пакет на 3.3.3.3:r с пунктом назначения 10.10.10.10:80 (3.3.3.3, очевидно, должен быть определен в сопоставлении и должен основываться на исходном порте назначения 8001).

Думаю, это было бы относительно просто с iptables, если бы не требование менять порт назначения, но эта загвоздка сбивает меня с толку.

Как мне этого добиться?

Связанный контент