![Как выполнить SNAT с измененным портом назначения?](https://rvso.com/image/1595522/%D0%9A%D0%B0%D0%BA%20%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D1%8C%20SNAT%20%D1%81%20%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%BD%D1%8B%D0%BC%20%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%BC%20%D0%BD%D0%B0%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%3F.png)
У меня есть хост 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, если бы не требование менять порт назначения, но эта загвоздка сбивает меня с толку.
Как мне этого добиться?